完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、串口基础
1.常用的串口相关寄存器
void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能 void USART_Cmd();//使能串口 void USART_ITConfig();//使能相关中断 void USART_SendData();//发送数据到串口, DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据 FlagStatus USART_GetFlagStatus();//获取状态标志位 void USART_ClearFlag();//清除状态标志位 ITStatus USART_GetITStatus();//获取中断状态标志位 void USART_ClearITPendingBit();//清除中断状态标志位 3.状态寄存器 第10-31位保留,硬件强制为0 第5位:RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。 第6位:TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:1)读 USART_SR,写USART_DR。2)直接向该位写 0。 读取串口状态的函数是:FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); 例如: 判断读寄存器是否非空(RXNE),操作库函数的方法是:USART_GetFlagStatus(USART1, USART_FLAG_RXNE); 4.数据寄存器 5.串口配置的一般步骤 ①串口时钟使能:RCC_APBxPeriphClockCmd(); GPIO时钟使能:RCC_AHB1PeriphClockCmd(); ② 引脚复用映射: GPIO_PinAFConfig(); ③GPIO端口模式设置:GPIO_Init(); 模式设置为GPIO_Mode_AF ④串口参数初始化:USART_Init(); ⑤开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤) NVIC_Init(); USART_ITConfig(); ⑥使能串口:USART_Cmd(); ⑦编写中断处理函数:USARTx_IRQHandler(); ⑧串口数据收发: void USART_SendData();//发送数据到串口,DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据 ⑨串口传输状态获取: FlagStatus USART_GetFlagStatus(); void USART_ClearITPendingBit(); 二、实例编写 1.宏观变量定义 #define USART_REC_LEN 200 //定义最大接收字节数 200 u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 u16 USART_RX_STA; //接收状态标记 在这里定义了16位的USART_RX_STA,其中0-13位用于接收数据,第14位用于进行判断0x0d标志,若接收到了置1,反之置0,第15位用于判断接收完成标志,即第14位确定收到0x0d标志后,再进行判断,若收到了0x0a标志,则将该位置为1 2.main函数编写 int main(void) { u8 t; u8 len; u16 times=0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//将中断优先级分组2,2位响应,2位抢断 delay_init(168); //延时初始化 uart_init(115200); //波特率两边要一致,这里设置为115200,若不一致则会产生乱码 LED_Init(); //初始化LED while(1) { //STA为16位,与0x8000与,即判断接收到的数据第15位是否为1,即是否接收到完成 if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff;//接收到的数据长度保存到len中 printf("rn您发送的消息为:rn"); for(t=0;t //将BUF中保存的数据发送到串口1 USART_SendData(USART1, USART_RX_BUF[t]); //等待发送结束 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); } printf("rnrn"); USART_RX_STA=0; //STA清0,以便于下次接收 } else //没有接收到完整结束标志或只接收到一个,跳入else,循环打印提示信息 { times++; if(times%200==0) printf("输入数据,以回车键结束rn"); if(times%30==0) LED0=!LED0;//LED闪烁,系统正在运行 delay_ms(10); } } } 乱码示例: |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1781 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1085 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1680 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
732浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
559浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 11:12 , Processed in 0.664317 second(s), Total 46, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号