IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> stm32 USART无法传输,卡死的解决办法 -> 正文阅读

[嵌入式]stm32 USART无法传输,卡死的解决办法

? ? ? ? 又遇到了一个问题,就是usart做压力测试,usart1和usart2透传(usart1接收usart2发/usart2接收usart1发),收一个数据回调中发一个数据,快速传输大量数据的情况下会发生卡死,无法继续传输,只能reset解决的办法,并且我开了usart1和2这个问题只出现在了usart2上,胡乱猜测可能是因为usart2是挂载总线时钟apb2上才导致这个问题或者是中断执行是先写usart1的判断导致时间长了几us。但是有了上次的教训这次一下就找到了问题所在,还是坑比hal库。

? ? ? ? 句柄有个很有用的成员是errorcode,基本上只要出错他就会忠实的记录出错的地方,一翻发现是出现溢出错误了,这个溢出错误我现在还是没搞懂是什么意思,因为好像我就算不理他我的数据好像也没错,btw先给出参考手册的定义

我看其他帖子说这里其实有一个文字错误是清除中断的方法是读sr和dr而不是读sr和cr

????????但是hal库最逗的地方在于他给你报完错直接给你卡死了,读代码可以发现是中断处理函数的逻辑有问题,在中断处理函数HAL_UART_IRQHandler中,是先判断错误标志位再进行读取操作的,也就是说当ore置位,不进入hal库的中断处理UART_Receive_IT而是直接报错就结束了。

????????这就导致一个问题,因为清除接收中断标志位是通过读取里面的数据以后自动完成的,所以如果没进入UART_Receive_IT,那么就不会清除标志位,下次中断无法触发,即使加入语句清了ORE和RXNE也会出些很迷惑的错误,一直中断或者丢数据一类的。

/* If no error occurs */
  errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));
//在这里判断了ore的值,如果ore置位,errorflags不为0,无法进入uart_receive_it
  if (errorflags == RESET)
  {
    /* UART in mode Receiver -------------------------------------------------*/
    if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
    {
      UART_Receive_IT(huart);
      return;
    }
  }

????????解决办法我看了好几个,有关闭ore检测的(好像现在的cubemx没有这个功能了),有写错误回调的,还有其他的一些办法,但是我不太敢动库函数怕忘记,还是采用了最简单的std库思想来写,把源码中涉及读写的两给语句拉出来。

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
  if((__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE)||__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE))==SET)
  {
    *SendBuff = (uint8_t)(huart1.Instance->DR & (uint8_t)0x00FF);
    huart2.Instance->DR = (uint8_t)(*SendBuff & 0xFFU);

简单的读标志位,然后对数据读完再写,检测了一下发多少字节收的到多少字节,快速循环发送也不出错。

? ? ? ? 还有一个办法就是置一个标志变量在主循环发完再清零,但是如果是主循环有长时间延时的对于频繁的数据收发可能不好用

? ? ? ? 只能说hal库对于系统的封装过于死板和冗余了,冗余的错误判断和死板的回调真的会导致当需求不在他提供的接口里面时,整个hal库的逻辑都会是你完成需求的障碍

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:44:32  更:2021-09-24 10:46:23 
 
开发: 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年11日历 -2024/11/26 2:55:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码