华大HC32F4A0系列MCU通用同步异步收发器的UART不定长数据接收
1、摘要在通信中,用户经常会处理不定长的数据包。发送数据时,只需要根据指定长度发送数据包,处理相对简单,而接收数据时则需要检查数据包的结束。
本篇应用笔记主要介绍HC32F4A0系列通用同步异步收发器(Universal Synchronous Asynchronous Receiver Transmitter,USART)的UART模式,结合定时器Timer0,实现接收不定长数据。
2、UART 简介
HC32F4A0 系列 MCU 搭载通用串行收发器模块(USART)10 个单元。全通道支持通用异步串行通信接口 (Universal Asynchronous Receiver Transmitter,UART)。UART(USART_1,USART_2,USART_6,USART_7)和 Timer0 模块配合支持 UART 接收 TIMEOUT 功能。
2.1 UART 主要特性
●数据长度可编程:8 位/9 位
●校验功能可配置:奇校验/偶校验/无校验
●停止位可配置:1 位/2 位
●时钟源可选:内部时钟源(内部波特率生成器生成的时钟)/外部时钟源(USARTn_CK 管脚输入的时钟)
●接收错误:校验错误,帧错误,上溢错误
●支持多个处理器间通信
●内置数字滤波器
●支持接收数据超时功能
●单元 1 支持停止模式唤醒功能
3、UART 接收超时功能
UART 接收数据停止位被检测时 TIMEOUT 计数器启动,经过设定的 TIMEOUT 时间(设定单位为接收位数)后未检测到下一帧接收数据时,发生 TIMEOUT,如果此时 CR1.RE=1,则TIMEOUT 状态位 USARTn_SR.RTOF 置位,如果此时 USARTn_CR1.RE=0,则等待USARTn_CR1.RE=1 后 TIMEOUT 状态位 USARTn_SR.RTOF 置位。
TIMEOUT 计数器采用 Timer0 模块的计数器,具体对应关系如下:
USART1:Timer0 Unit1 A 通道
USART2:Timer0 Unit1 B 通道
USART5:Timer0 Unit2 A 通道
USART6:Timer0 Unit2 B 通道
TIMEOUT 功能 Timer0 比较计数器值设定:
Timer0 为 16 位计数器,计数时钟最大可以选择 1024 分频,TMR0_CMPA<B>R 值设定计算公式如下:
https://bbs.16rd.com/data/attachment/forum/202111/10/173346z1tfsmtp8fuu8sfs.jpg
CMPA<B>R: TMR0_CMPA<B>R 寄存器值
RTB: Receive Timeout Bits
CKDIRA<B>: TMR0.BCONR.CKDIVA<B>位寄存器值
4、UART 不定长数据接收
4.1 UART 接收不为空和超时标志设置时序
UART 接收数据停止位被检测时超时计数器启动,经过设定的超时接收位数后未检测到下一帧接收数据时,将置位接收超时标志 RTOF。
https://bbs.16rd.com/data/attachment/forum/202111/10/173425ofsn1z25wg66cy88.jpg
4.2 工作流程
4.2.1 定时器 Timer0 配置
样例代码中 Timer0 操作流程如下图所示:
https://bbs.16rd.com/data/attachment/forum/202111/10/173459fmydvyp4psyrtaax.jpg
定时器判断数据首发完成最简单了。 这个是不是可以通过串口闲置中断呢? 一帧数据可以使用头尾进行判断的。 不定长的数据是如何确定接收完成了呢 数据接受完成的时候接收数据寄存器会有标志位置位的 jonas222 发表于 2022-12-1 17:19
定时器判断数据首发完成最简单了。
如何用定时器怎么判定首发完成了根据波特率计算? 可以在主函数中通过轮询来读取这个硬件触发事件吗 数据不定长的话 超时时间怎么规定呢 jonas222 发表于 2022-12-1 17:19
定时器判断数据首发完成最简单了。
为什么经过定时器判定是最简单的呢 为什么我手册里是这样的【图片】 在使用串口超时中断时遇到了些问题,可以和您沟通一下嘛
页:
[1]