| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> STM32L0 LPUART串口ORE溢出错误处理 -> 正文阅读 |
|
[嵌入式]STM32L0 LPUART串口ORE溢出错误处理 |
项目场景:使用STM32L0单片机主频设定2.097M,使用LPUART,115200波特率的串口进行通信,会出现偶发性的串口死机现象。 问题描述1.串口配置 通过进入仿真发现,暴力发送数据后,不会再进入中断。把数据解析函数屏蔽掉以后,再进入仿真,进行同样的测试,每次又都能进入中断。 通过比较两次的仿真,发现ISR中断状态寄存器ORE标志位被置位后,不会再进入中断。 原因分析:这个ORE的检测是CubeMX默认打开的,在UART的配置里面,如下:
产生中断和状态寄存器: 通过以上数据手册中内容可知,ORE标志位置位后,必须通过ORECF寄存器清除ORE,否则接收不到新数据。 分析HAL库的代码发现:
所以解决办法是,只需要在HAL_UART_ErrorCallback错误回调函数中重新打开串口接收即可。
经过以上分析,已经知道了串口死机的原因,和初步解决方案,在错误回调函数中重新打开串口。 但是在实际使用过程中,难免会有大量数据的收发,通过错误回调函数中重新打开串口只是治标不治本,ORE溢出错误的本意是告知用户目前通信超负荷需要进行调整,要么波特率太高,要么数据量太大数据处理不过来。 波特率一般是终端用户指定要求的,无法更改,那么只能更改在中断中的数据处理函数了。 解决方案:要想知道怎么改中断中的数据处理函数,就需要明白在一个2MHz主频系统下,使用中断(或DMA)模式来接收串口数据,波特率为115200的情况下,中断处理程序允许的理论最大安全时间是多少?,或者说允许屏蔽中断的最大安全时间是多少? 115200的波特率在典型的“1起始位+1终止位+无校验位+8数据位”的配置下(每个数据帧对应10个bit),实际上对应最大11.52KB/s的数据率——或者说,USART完成中断每秒钟发生 11.52K次。即在这一系统中最大允许屏蔽中断多长时间——1/11.52KHz ≈87us。 由此可知:中断中的数据处理函数最长执行时间不能超过87us,否则将出现通信超载。
假设使用DMA+空闲中断的方式接收数据,中断进入LPUART1_IRQHandler后,会消耗掉299us,再调用回调函数,处理用户代码,用户代码还是要尽量的短,另外加长DMA接收的数据长度,也可以尽可能的避免发生溢出错误。 修改data_parser代码后,测量指令周期如下: 经测量处理函数执行了137个指令周期,需要137/2.097=66us,整个处理时间为299us+66us=365us。 通过代码优化,降低了发生串口溢出的风险,增加错误回调HAL_UART_ErrorCallback代码,当发生串口溢出时,及时重新开启,经实际测试,可以满足项目需求。 注意:STM32并不是所有的系列都有这个OverrunDisable开关,相应的也没有OVRDIS这个寄存器,清除ORE flag标志的方式也不相同。通过在STM32F103上测试,默认是开启了过载检测,由软件序列将其清零(先读USART_SR,然后读USART_CR)。 如果有OverrunDisable开关,在不使用HAL库的中断回调来实现串口接收时最好禁止Overrun,不然出现串口接收溢出,移位寄存器中的数据会被覆盖,RDR寄存器中的值将不会改变,也就读不到新数据了。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 18:14:59- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |