完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
USART串口概况
在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。还可以使用DMA方式,实现高速数据通信。 常用的帧结构为:1位起始位+8位数据位+1位奇偶校验位(可选)+1位停止位。如下图: USART特点 全双工异步通信;
USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT); USART的理解 主要使用 USART_SendData() 该函数发送消息到串口,然后使用USART_ReceiveData()来接收发送的消息;而同时调用该函数的时候,会自动跳转到USARTx_IRQHandler() 中,而在相应的串口中断函数中,对传入的消息的字节数进行判断选择,以及挨个输出。 void USART1_IRQHandler(void) //串口1中断服务程序 { u8 Res; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { Res =USART_ReceiveData(USART1); //读取接收到的数据 if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收 } } } } 这里拿正点原子的代码来进行分析 在void USART1_IRQHandler(void) 的串口1中断函数中,先是定义了Res这个变量来储存USART_ReceiveData() 接受到的消息。 最重要的过程,就是在这段函数中,还使用了USART_RX_STA(在先前就定义好了的变量,主要用于储存串口接收到的数据形式,16位的数据格式,[0:13]用于储存数据长度,[14]用于标记是否接收到0x4000,[15]用于标记是否接收到0x8000) 同时,串口接收中断服务函数要考虑到了所接收到的数据长度远大于**[0:13]位所能存放的位置,此时直接将USART_RX_STA**的第15位直接标记为1,即表示此次接收完成。 USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; 正常情况下,通过USART_RX_STA该变量不断++来改变USART_RX_BUF(先前定义用于接收数据的数组);而USART_RX_STA&0X3FFF此段代码的作用是为了判断大小究竟为多少的数组能够完全接收全部的消息,而且该代码是会因为后面这行代码 USART_RX_STA不断叠加,直至超出最大值。 至此,中断函数的分析大概分析得差不多了,至于前面的配置串口GPIO和使能的操作就不累述了。 以及后面的使用Usart串口配合其他的外设的相关操作和调试。 |
|
|
|
USART串口概况
在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。还可以使用DMA方式,实现高速数据通信。 常用的帧结构为:1位起始位+8位数据位+1位奇偶校验位(可选)+1位停止位。如下图: USART特点 全双工异步通信;
USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT); USART的理解 主要使用 USART_SendData() 该函数发送消息到串口,然后使用USART_ReceiveData()来接收发送的消息;而同时调用该函数的时候,会自动跳转到USARTx_IRQHandler() 中,而在相应的串口中断函数中,对传入的消息的字节数进行判断选择,以及挨个输出。 void USART1_IRQHandler(void) //串口1中断服务程序 { u8 Res; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { Res =USART_ReceiveData(USART1); //读取接收到的数据 if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收 } } } } 这里拿正点原子的代码来进行分析 在void USART1_IRQHandler(void) 的串口1中断函数中,先是定义了Res这个变量来储存USART_ReceiveData() 接受到的消息。 最重要的过程,就是在这段函数中,还使用了USART_RX_STA(在先前就定义好了的变量,主要用于储存串口接收到的数据形式,16位的数据格式,[0:13]用于储存数据长度,[14]用于标记是否接收到0x4000,[15]用于标记是否接收到0x8000) 同时,串口接收中断服务函数要考虑到了所接收到的数据长度远大于**[0:13]位所能存放的位置,此时直接将USART_RX_STA**的第15位直接标记为1,即表示此次接收完成。 USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; 正常情况下,通过USART_RX_STA该变量不断++来改变USART_RX_BUF(先前定义用于接收数据的数组);而USART_RX_STA&0X3FFF此段代码的作用是为了判断大小究竟为多少的数组能够完全接收全部的消息,而且该代码是会因为后面这行代码 USART_RX_STA不断叠加,直至超出最大值。 至此,中断函数的分析大概分析得差不多了,至于前面的配置串口GPIO和使能的操作就不累述了。 以及后面的使用Usart串口配合其他的外设的相关操作和调试。 |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1916 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1680 浏览 1 评论
1172 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
771 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1732 浏览 2 评论
1974浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
808浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
257浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
625浏览 3评论
634浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-25 08:33 , Processed in 2.165689 second(s), Total 79, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号