USART串口概况8 D+ n m% s2 Y# F: H 在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。还可以使用DMA方式,实现高速数据通信。 常用的帧结构为:1位起始位+8位数据位+1位奇偶校验位(可选)+1位停止位。如下图:9 l$ U) O% S( E! \/ c! R . X e5 K4 H, p1 _5 s+ R& f USART特点: [$ f& ^- N( ^ 全双工异步通信; 分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s" s. Q' r$ Z+ f' L+ m( C6 X+ k, A 可编程的数据字长度(8位或者9位); 可配置的停止位(支持1或者2位停止位). u |7 w) k# B% V5 L' O8 ]* C! N% v 可配置的使用DMA多缓冲器通信;1 g% s8 I! r; ?" N: H0 K. t3 m1 P% r 单独的发送器和接收器使能位2 _6 ~3 X; L8 j9 B/ q& Q/ z) k3 p4 h 检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志; 多个带标志的中断源,触发中断;其他:校验控制,四个错误检测标志。 USART配置的一般步骤 串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd(); 串口复位:USART_DeInit(); 这一步不是必须的 GPIO端口模式设置:GPIO_Init(); 串口参数初始化:USART_Init();8 L7 O y8 O2 h: [5 F' N 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤:NVIC_Init();USART_ITConfig();3 ^7 ?3 P6 Y6 Z. d0 Q* P- S 使能串口:USART_Cmd(); 编写中断处理函数:USARTx_IRQHandler(); 串口数据收发:void USART_SendData();//发送数据到串口, uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据串口传输状态获取:, o# f A# w: C* u1 v# e
USART的理解 主要使用 USART_SendData() 该函数发送消息到串口,然后使用USART_ReceiveData()来接收发送的消息;而同时调用该函数的时候,会自动跳转到USARTx_IRQHandler() 中,而在相应的串口中断函数中,对传入的消息的字节数进行判断选择,以及挨个输出。
这里拿正点原子的代码来进行分析7 M' _$ v L1 L" w. I8 m 在void USART1_IRQHandler(void) 的串口1中断函数中,先是定义了Res这个变量来储存USART_ReceiveData() 接受到的消息。7 \. ^1 i' m Z- m 8 S: `6 n& k, s 最重要的过程,就是在这段函数中,还使用了USART_RX_STA(在先前就定义好了的变量,主要用于储存串口接收到的数据形式,16位的数据格式,[0:13]用于储存数据长度,[14]用于标记是否接收到0x4000,[15]用于标记是否接收到0x8000), ^% F% \8 }' x6 P, D& Q; p $ J6 T9 D( b, o5 I" f% e. ?, O 同时,串口接收中断服务函数要考虑到了所接收到的数据长度远大于**[0:13]位所能存放的位置,此时直接将USART_RX_STA**的第15位直接标记为1,即表示此次接收完成。
正常情况下,通过USART_RX_STA该变量不断++来改变USART_RX_BUF(先前定义用于接收数据的数组);而USART_RX_STA&0X3FFF此段代码的作用是为了判断大小究竟为多少的数组能够完全接收全部的消息,而且该代码是会因为后面这行代码 USART_RX_STA不断叠加,直至超出最大值。$ _/ A3 n6 k% |9 s- i$ l/ X 至此,中断函数的分析大概分析得差不多了,至于前面的配置串口GPIO和使能的操作就不累述了。/ M' M& M1 K9 Y( T 以及后面的使用Usart串口配合其他的外设的相关操作和调试。" C& K% q0 K: N/ f1 S: l* a: T$ w b" k ! d$ q" d. F# H( j ! Q& U2 |5 K" e5 } j. O |
基于STM32 Azure USBx 开发的经验分享
【STM32MP135-DK】裸机移植shell
NUCLEO-U545RE-Q评测】3. 串口基本收发测试
NUCLEO-U545RE-Q评测】4. 串口实用收发测试
NUCLEO-U545RE-Q板卡评测 (第二篇外传)UART的单线半双工的上拉电阻问题
基于STM32串口如何发送字符串经验分享
基于STM32模拟UART串口通信
【STM32H503评测】+ coremark跑分移植测试
基于STM32H563演示UART+DMA经验分享
基于STM32的串口通信经验分享