STM32的USART1与USART2模块串行数据通讯功能

stm32的usart1与usart2模块支持多种功能,包括irda红外、smart card(ic卡)等。本文就其串行数据通讯功能进行讲解。
usart功能图:
一般情况串口都采用异步方式通讯,因此本文只讲解异步通讯方式(uart)。异步模式下串口采用tx、rx两线,其数据模式如图:
上图为数据长度为8位(包括1位校验)的情形。位数据的意义:
总线空闲 :空闲时线上为高电平。
起始位 :一位逻辑0信号帧,代表传输开始。
数据位 :可以为7位或8位数据。低位开始传输
校验位: 若启用,使得逻辑1的位数应为偶数(偶校验)或奇数(奇校验)。若不启用,该位由一位数据帧替代(多一位数据)。
停止位: 一位或两位逻辑1,标志一个数据字符传输完成。
※一般情况下个人推荐①数据长度为9位(有效数据8位+一位校验)或②数据8位(无校验);并尽量采用ascii或16进制编码方式。
uart配置结构体ll_usart_inittypedef
typedef struct{ uint32_t baudrate;/* 配置波特率;通过ll_usart_setbaudrate()函数实现 @param baudrate=115200,9600.etc */ uint32_t datawidth;/* 配置数据帧数;通过ll_usart_setdatawidth()函数实现 @param datawidth = ll_usart_datawidth_8b ll_usart_datawidth_9b */ uint32_t stopbits;/* 设置停止位数;通过ll_usart_setstopbitslength()实现 @param stopbits = ll_usart_stopbits_0_5 0.5stop bit ll_usart_stopbits_1 1 stop bit ll_usart_stopbits_1_5 1.5stop bits ll_usart_stopbits_2 2stop bits */ uint32_t parity;/* 设置校验位;通过ll_usart_setparity()实现 @param parity = ll_usart_parity_none ll_usart_parity_even 偶校验 ll_usart_parity_odd 奇校验 */ uint32_t transferdirection;/* 设置数据收发模式;通过ll_usart_settransferdirection()实现 @param transferdirection = ll_usart_direction_none 双向禁用 ll_usart_direction_rx 单接收 ll_usart_direction_tx 单发送 ll_usart_direction_tx_rx 发送&接收 */ uint32_t hardwareflowcontrol; /* 用于rs232的其他硬件引脚配置(cts、rts);通过ll_usart_sethwflowctrl()实现 @param hardwareflowcontrol = ll_usart_hwcontrol_none 无 ll_usart_hwcontrol_rts rts ll_usart_hwcontrol_cts cts ll_usart_hwcontrol_rts_cts cts&rts */ uint32_t oversampling;/* 设置过采样。通过ll_usart_setoversampling()实现。※不要更改 @param oversampling = ll_usart_oversampling_16 ll_usart_oversampling_8 */} ll_usart_inittypedef;__static_inline void ll_usart_enable(usart_typedef *usartx);/*启用usart模块;生成的初始化代码中已调用。@param usartx= usart1 usart2 .etc*/__static_inline void ll_usart_disable(usart_typedef *usartx);/*关闭usart模块*/__static_inline uint32_t ll_usart_isenabled(usart_typedef *usartx);/*检测usart模块是否已开启。@retval = 0 !0*/※errorstatus ll_usart_init(usart_typedef *usartx, ll_usart_inittypedef *usart_initstruct);/*usart初始化函数; @retval = success error*/以下函数与状态寄存器有关(相关函数只用于指示状态,可以不使用):
请在reset时先将使用到的位清零
※但若使能中断,则中断处理完全必须清零状态位方能产生下一次interrupt
__static_inline uint32_t ll_usart_isactiveflag_pe(usart_typedef *usartx);/*接收使能时,判断是否发生奇偶性校验错误(检测pe位,当错误时置位,通过软件清零)※当cubemx设置了奇偶校验时有效@retval = 1 发生过错误*/__static_inline void ll_usart_clearflag_pe(usart_typedef *usartx);/*清零pe位。*/__static_inline uint32_t ll_usart_isactiveflag_fe(usart_typedef *usartx);/*判断是否发生帧错误(噪声、断开符)。(检测fe位,当错误时置位,通过软件清零)@retval = 1 发生过错误*/__static_inline void ll_usart_clearflag_fe(usart_typedef *usartx);/*清零fe位*/__static_inline uint32_t ll_usart_isactiveflag_ne(usart_typedef *usartx);/*检测噪声错误。(检测ne位,当错误时置位,通过软件清零)*/__static_inline void ll_usart_clearflag_ne(usart_typedef *usartx);/*清零ne位*/__static_inline uint32_t ll_usart_isactiveflag_ore(usart_typedef *usartx);/*检测过载错误。(读取寄存器中数据尚未被读取时收到新数据)(ore位)*/__static_inline void ll_usart_clearflag_ore(usart_typedef *usartx);/*清零ore位*/__static_inline uint32_t ll_usart_isactiveflag_idle(usart_typedef *usartx);/*检测总线空闲;(idle位)*/__static_inline void ll_usart_clearflag_idle(usart_typedef *usartx);/*清零idle位*/以下为使用频繁的状态寄存器相关函数:
__static_inline uint32_t ll_usart_isactiveflag_rxne(usart_typedef *usartx);/*读数据非空 ;检测读取数据寄存器rdr状态。※读取数据寄存器rdr 完全 完成一次数据接收时,该位被置位。@retval =1※对读取数据寄存器rdr的读取操作可以硬件清零 该位。不推荐软件清零*/__static_inline void ll_usart_clearflag_rxne(usart_typedef *usartx);/*慎用*/__static_inline uint32_t ll_usart_isactiveflag_tc(usart_typedef *usartx);/*发送完成 ;读tc当发送完一帧,且发送数据寄存器空时@retval = 1需要通过软件清零*/__static_inline void ll_usart_clearflag_tc(usart_typedef *usartx);__static_inline uint32_t ll_usart_isactiveflag_txe(usart_typedef *usartx);/*发送数据寄存器空 ; 检测发送数据寄存器tdr状态※当发送数据寄存器tdr数据被送出时,该位被置位。 @retval = 1 ※对发送数据寄存器tdr的写入操作可以硬件清零该位。不推荐软件清零*/__static_inline void ll_usart_clearflag_txe(usart_typedef *usartx);/*慎用*/相关寄存器:
串口中断的使用关于中断源:
idle中断:总线空闲中断
rxne中断:接收缓冲区非空中断※常用
tc中断:发送完成中断
txe中断:发送缓冲区空中断
pe中断:校验失败中断※常用
※以上中断发生将同时调用同一中断函数void usartx_irqhandler(void)。可在函数内判断具体的中断源。
配置中断使能:__static_inline void ll_usart_enableit_idle(usart_typedef usartx);/
使能总线空闲中断
*/
__static_inline void ll_usart_enableit_rxne(usart_typedef usartx);/
使能rxne中断
*/
__static_inline void ll_usart_enableit_tc(usart_typedef usartx);/
使能tc中断
*/
__static_inline void ll_usart_enableit_txe(usart_typedef usartx);/
使能txe中断
*/
__static_inline void ll_usart_enableit_pe(usart_typedef usartx);/
使能pe中断
*/
**禁用中断 **
函数模板为ll_usart_disableit_xxx(usart_typedef *usartx);
中断程序编写使能串口中断后,中断调用函数为void usart▢_irqhandler(void)
若启用了多个对应的中断源,则应该在中断函数中
判断中断源,再进行对应操作。
判断原理:初始化时启用相应中断并软件清零用到的状态位。
当触发相应的事件时,中断源的状态位被置位,其余状态位仍处于初始化后0态。此时跳转执行中断函数void usart▢_irqhandler(void)
在中断函数中进行用到的状态位的判断,若状态位为1则为中断源
执行完后,将相应状态位清零以使能下一次中断
示例程序:以接收中断为例
在 usart.c中:
void mx_usart1_uart_init(void){··ll_usart_clearflag_rxne(usart1);//强制清零状态位ll_usart_enableit_rxne(usart1); //使能rxne中断·}在it.c中
void usart1_irqhandler(void){ if (ll_usart_isactiveflag_rxne(usart1))//判断中断源 { ll_usart_transmitdata8(usart1, ll_usart_receivedata8(usart1));/*读接收寄存器(8bit)并发送, *读操作自动清零状态位*/ //ll_usart_clearflag_rxne(usart1);//强制清零状态位,不推荐使用 }}

行业 | 威华股份与巴莫科技签8.43万吨锂盐采购协议
天花板嵌入式led灯电路图
AutoSAR Dem配置项基础知识梳理
直流电动机的工作原理简述 直流电机工作原理图 直流电机有几种类型
LT8612/LT8613高效降压稳压器在汽车和工业领域的应用
STM32的USART1与USART2模块串行数据通讯功能
ADC转换器的主要技术参数及分类
瑞萨e2studio(29)----SPI速率解析
先楫工业4.0全面解决方案Q&A
预计2026年我国3D人脸识别的市场规模超过98亿元人民币!
EE直播间|GPU助力数据中心高性能计算和AI大模型的开发
增强现实技术如何提高生产工厂效率?
揭秘华为手机的石墨烯散热技术
SocionextSoC车载图形显示解决方案
数字宽带收发信机如何表征
纤巧、高效率单片式稳压器为先进的SoC和微处理器供电
采用SPI接口的模拟开关可提高通道密度
亚马逊公布太空互联网星座项目Kuiper天线设计
华为P40 Pro或坐稳明年DxO第一霸主位置
十余年精耕研发,致力提升新能源磁元件性能