STM32 硬件UART接收超时检测设置
STM32 硬件UART接收超时检测设置
-----------------本文作者“智御电子”,期待与电子爱好者交流学习。----------------
应用场景
在uart应用中有时候需要进行双工通信,主机需要对从机的数据进行接收超时检测,例如modbus协议,主机在接收从机数据在3.5个字节时间后认为数据包接收完毕。那在这种情况下,一般的做法是设置一个定时器,在每接收到一个字节时清零定时器重新计数,直到定时器超过3.5个字节时间后触发中断即默认数据包接收完毕。
以上的定时器设置的超时判断是需要软件介入的。这里STM32的有些串口是提供硬件超时检测功能。这样就省去如上的步骤。
设置步骤
本实验是利用CubeMx生成的工程进行验证的。
首先,利用cubemx配置usart1(注意:并不是每个STM32芯片的串口都具有硬件超时检测功能的)。值得注意的是在cubeMX中并没有设置硬件超时的选项,所以这里只是生产可用的usart工程。

生成工程后,我们去数据手册,其中有这样的描述。

所以本文添加一个使能超时检测的函数,如下所示
void Uart_RxOvertimeEnable(void)
{
/*使能接收超时功能*/
SET_BIT(huart1.Instance->CR2,USART_CR2_RTOEN);
/*使能超时接收中断*/
//SET_BIT(huart1.Instance->CR1,USART_CR1_RTOIE);
/*向RTOR寄存器填入需要超时的长度,单位为一个波特时长,3.5个字节*11波特长度 = 39 */
WRITE_REG(huart1.Instance->RTOR,39);
}
- 接着在main函数中添加这个函数,并且写了一个小小的测试实例。
int main(void)
{
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/*使能超时检测*/
Uart_RxOvertimeEnable();
/* Infinite loop */
/*采用中断接收数据,模拟接收*/
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 100);
while (1)
{
//数据接收后,一直等待超时
while(READ_BIT(huart1.Instance->ISR,USART_ISR_RTOF))
{
/*清除rtof标志*/
SET_BIT(huart1.Instance->ICR,USART_ICR_RTOCF);
/*将接收的数据发送出去测试一下*/
HAL_UART_Transmit_IT(&huart1, (uint8_t *)aRxBuffer, 100);
HAL_Delay(1000);
}
}
}
- 最后通过串口调试助手通过上位机发送数据(this is test!)给单片机,单片机能返回数据(后面的***是因为打印了空字节,忽略),则证明有效。

STM32 硬件UART接收超时检测设置的更多相关文章
- 基于STM32之UART串口通信协议(三)接收
一.前言 1.简介 回顾上一篇UART发送当中,已经讲解了如何实现UART的发送操作了,接下来这一篇将会继续讲解如何实现UART的接收操作. 2.UART简介 嵌入式开发中,UART串口通信协议是我们 ...
- perl Socket接收超时设置
一般来说, IO::Socket::INET里的Timeout设置是对于conncet的 如果你想设置recv接收超时, 可以这样设置: usr Socket: ...... , )); #注意这里p ...
- 【c#】设置Socket连接、接收超时(转)
用到Socket,发现如果连接错误,比如Connect的端口不对,会造成很长时间的延时,程序就僵在那里,效果很不好: 在网上找到很方便的设置办法,分享如下: Socket.SetSocketOptio ...
- 【c#】设置Socket连接、接收超时
用到Socket,发现如果连接错误,比如Connect的端口不对,会造成很长时间的延时,程序就僵在那里,效果很不好: 在网上找到很方便的设置办法,分享如下: Socket.SetSocketOptio ...
- 基于STM32之UART串口通信协议(一)详解
一.前言 1.简介 写的这篇博客,是为了简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32CubeMX来配置芯片的一些操作,在后面我会以我使用的STM32F429开发 ...
- 浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)(转)
引子 STM32的硬件I2C很多人都对它望而却步.因为很多电工都说,STM32 硬件 I2C有BUG.不稳定.死机等等……最后都使用GPIO模拟I2C. 的确,模拟I2C好用.但是在我看来在一个72M ...
- STM32 硬件I2C 到底是不是个坑?
/** ****************************************************************************** * @author Maox ...
- 中科蓝讯530X、532X模块之硬件UART
文章转载请注明来源 作者:Zeroer 一.选择IO 想要使用硬件的UART必须先确定要mapping的pin脚 注意:用作TX的脚位可以分时复用成单线双工 因为芯片默认的调试串口用的是UART0,所 ...
- 痞子衡嵌入式:浅析IAR下调试信息输出机制之硬件UART外设
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之硬件UART外设. 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我们可以比较容易地 ...
随机推荐
- Visio中锁定元件
若要进行形状保护,需要能看到“开发工具”选项卡.默认情况下,该选项卡是隐藏的. 查看“开发工具”选项卡 单击“文件”选项卡. 单击“选项”. 单击“高级”,然后向下滚动到“常规”部分. 选择“以开发人 ...
- tree 向上查找(更新删除后页面的数据)
需求 : 根据选择的id,需要找到一整条tree,id以及id数据的子集都已被删除(向下查找-----上一篇笔记),此时需要更新页面的数据(向上查找) //知道最底层的节点的id,查找满足id的整个t ...
- SAP S/4HANA销售订单创建时,会自动触发生产订单的创建
这个自动触发的过程是怎么实现的? 使用下面的代码创建一个销售订单: DATA: ls_header TYPE bapisdhd1, ls_headerx TYPE bapisdhd1x, lt_bap ...
- mac环境下安装posgreSQL,postGIS,pgrouting方法
费了九牛二虎之力,终于安装成功...都是mac的坑,好好的window环境多好,非要换mac环境,导致软件配置极其的麻烦,window的环境下配置会少很多事,自己惹的祸自己担着吧还是.换mac要慎重, ...
- WAS部署 -- SRVE0255E: 尚未定义要处理 /snoop 的 Web 组/虚拟主机
问题描述: URL:http://localhost:9080/pay: (中文)SRVE0255E: 尚未定义要处理 /snoop 的 Web 组/虚拟主机 访问出现以上错误. 找了很多资料,觉得说 ...
- Java---页面之间传值跳转
从首页A进入页面B,然后从B页面登录,成功后跳转到A页面,并打印一句话“登录成功”,传值需要用的后台的. 在B页面写: <% session.setAttribute("key ...
- js 关联着数组中追加元素
var arr_data = new Array(); for ( var i in data.data ){ arr_data.push(arr_data[i] = data.data[ i ] ) ...
- JS解析json数据(如何将json字符串转化为数组)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...
- 【原创】多字节版本下MFC控件处理字符集的BUG
工程项目属性: 字符集:多字节 stdafx.h文件中添加: #pragma comment(linker,"/manifestdependency:\"type='win32' ...
- JSON数据转换之net.sf.json包的使用
转载 解析json之net.sf.json https://blog.csdn.net/itlwc/article/details/38442667 一.介绍 使用之前需要导入的jar包: json- ...