当前位置: 首页 > news >正文

arm:day6

实现UART通信:

1.键盘输入一个字符'a',串口工具显示'b'

 2.键盘输入一个字符串"nihao",串口工具显示"nihao"

uart.h

#ifndef __UART4_H__
#define __UART4_H__#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"//串口初始化函数
void hal_uart4_init();//发送一个字符函数
void hal_put_char(const char str);//发送一个字符串函数
void hal_put_string(const char *string);//接收一个字符函数
char hal_get_char();//接收一个字符串函数
char *hal_get_string();#endif

uart4.c

#include "uart4.h"extern void delay_ms(int ms);//PB2 --> UART4_RX
//PG11 --> UART4_TX
void hal_uart4_init()
{//RCC章节//1.使能GPIOB组RCC->MP_AHB4ENSETR |= (0x1 < 1);//2.使能GPIOG组RCC->MP_AHB4ENSETR |= (0x1 < 6);//3.使能UART4组RCC->MP_APB1ENSETR |= (0x1 < 16);//GPIO章节//复用功能模式 复用功能为串口接收/发送GPIOB->MODER &= (~(0x3 << 4));GPIOB->MODER |= (0x2 << 4);GPIOB->AFRL &= (~(0xf << 8));GPIOB->AFRL |= (0x1 << 11);GPIOG->MODER &= (~(0x3 << 22));GPIOG->MODER |= (0x2 << 22);GPIOG->AFRH &= (~(0xf << 12));GPIOG->AFRH |= (0x3 << 13);//UART4章节 8N1 115200对应位使能//1.判断UE是否使能,如果等于1,禁止if (USART4->CR1 & 0x1)	//设置UE位不使能,否则其他位无法设置{delay_ms(500);USART4->CR1 &= (~(0x1 << 0));}//2.设置8N1 无校验位USART4->CR1 &= (~(0x1 << 28));	//CR1[28][12]=00 8位数据位USART4->CR1 &= (~(0x1 << 12));USART4->CR2 &= (~(0x3 << 12));	//设置一位停止位USART4->CR1 &= (~(0x1 << 10));	//设置无校验位//3.设置16倍采样率USART4->CR1 &= (~(0x1 << 15));//4.设置串口不分频USART4->PRESC &= (~(0xf << 0));//5.设置串口波特率115200USART4->BRR |= 0x22b;//6.设置串口发送位使能USART4->CR1 |= (0x1 << 3);//7.设置串口接收位使能USART4->CR1 |= (0x1 << 2);//8.设置串口使能USART4->CR1 |= (0x1 << 0);	//最后设置UE使能	
}//发送一个字符
void hal_put_char(const char str)
{//判断发送数据寄存器是否为空 ISR[7]//读0:发送数据寄存器满,需要等待//读1:发送数据寄存器空,发送下一字节while (!(USART4->ISR & (0x1 << 7)));//发送数据寄存器 = str USART4->TDR = str;//判断发送数据寄存器是否完成while (!(USART4->ISR & (0x1 << 6)));
}//发送一个字符串
void hal_put_string(const char *string)
{//判断是否为\0//一个一个字符发送while (*string){hal_put_char(*string++);}hal_put_char('\n');hal_put_char('\r');
}//接收一个字符
char hal_get_char()
{//定一个变量,用来接收数据char ch;//判断接收数据寄存器是否有数据while (!(USART4->ISR & (0x1 << 5)));//ch = 接收数据寄存器ch = USART4->RDR;return ch;
}char buffer[32]={};
//接收一个字符串
char *hal_get_string()
{//for循环//判断键盘回车键是否按下 \runsigned int i = 0;for (i=0; i<31; i++){//接收一个字符,放入bufferbuffer[i] = hal_get_char();//回显到串口工具,发送一个字符hal_put_char(buffer[i]);if (buffer[i] == '\r')break;}buffer[i] = '\0';hal_put_char('\n');return buffer;
}

main.c

#include "uart4.h"extern void printf(const char* fmt, ...);
void delay_ms(int ms)
{int i;for (i=0; i<ms; i++)for (int j=0; j<1800; j++);
}int main(int argc, char *argv[])
{hal_uart4_init();while (1){//hal_put_char(hal_get_char() + 1);hal_put_string(hal_get_string());}return 0;}

http://www.lryc.cn/news/134632.html

相关文章:

  • MyBatis快速入门以及环境搭建和CRUD的实现
  • 基于Pytorch实现的声纹识别系统
  • Fast DDS (2)
  • HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制if/else条件渲染
  • 飞天使-k8s基础组件分析-pod
  • css题库
  • 中文医疗大模型汇总
  • smiley-http-proxy-servlet 实现springboot 接口反向代理,站点代理,项目鉴权,安全的引入第三方项目服务
  • Java集合利器 Map Set
  • HJ106 字符逆序
  • sentinel的基本使用
  • 【STM32】串口通信乱码(认识系统时钟来源)
  • Java实现敏感词过滤功能
  • 大数据向量检索的细节问题
  • 如何让智能搜索引擎更灵活、更高效?
  • C++set集合与并查集map映射,哈希表应用实例B3632 集合运算 1P1918 保龄球
  • easyexcel合并单元格底色
  • OpenCV图片校正
  • 数字孪生流域共建共享相关政策解读
  • FSC147数据集格式解析
  • el-element中el-tabs案例的使用
  • tomcat结构目录有哪些?
  • 生成式AI系列 —— DCGAN生成手写数字
  • vscode-vue项目格式化+语法检验-草稿
  • 【Java从0到1学习】10 Java常用类汇总
  • 第三届人工智能与智能制造国际研讨会(AIIM 2023)
  • 层次分析法
  • Error Handling
  • leetcode:字符串相乘(两种方法)
  • 【爬虫练习之glidedsky】爬虫-基础2