硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3075|回复: 1
收起左侧

STM32V6之串口HAL库接收不定长字节数据方法二-定时器超时计数-单数据接收模式

[复制链接]

5

主题

229

回帖

249

积分

高级会员

积分
249
发表于 2020-11-21 11:09:55 | 显示全部楼层 |阅读模式
本帖最后由 旮旯旭 于 2020-11-21 11:15 编辑

06_STM32V6_UART_RX_TIMEOUT_Timer.rar (3.31 MB, 下载次数: 61)

除了空闲中断接收超时方式还可以使用定时器来协同处理超时接收,空闲中断的超时是由硬件完成的超时判断,时间为一个数据的传输时间(和波特率校验位和停止位相关)。
定时器完成的超时判断的原理是使用开启串口单数据接收,每接收到一个数据,给超时计数器装载超时值 默认10ms,在定时器里面对这个值递减,当递减到0时,接收完成



1.jpg

2.jpg

为何不直接使用HAL_UART_Receive_ITHAL_UART_Receive_DMA
因为接收完成在进入callback之前如果是DMA接收完成是先进入的UART_DMAReceiveCplt
在这个函数里面会清除USART_CR3_DMAR,所以我们无法知道上一次是什么接收模式,
因此在BspUart_t结构体里面加入了 rxDma变量,使用BSP_UART_Receive_ITBSP_UART_Receive_DMA开启接收。

3.jpg

在接收到一个数据之后会进入串口接收完成

HAL_UART_RxCpltCallback

4.jpg

接收到一个数据后g_tBspUart.rxTimeCount= 10; 这个计数器放在定时器中断里面处理 每1ms执行一次递减,
如果在递减为0之前有接收到新的数据,重新重装为10,当递减到0时,说明2个字节接收超过了10ms,接收完成标志 rxFlag = 1;
接收到的数据长度 rxLen = rxDataCount;并且清除计数器,由于是单数据接收,开启是在接收完成中断里打开的,在这里并不需要再开启接收。
单数据接收到一个数据就接收完成了和IDLE方式不一样。

5.jpg

6.jpg




评分

参与人数 1金币 +50 收起 理由
eric2013 + 50 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2020-11-22 09:54:20 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-10 21:22 , Processed in 0.230788 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表