最近开始使用ST的hal库,这个库相较于之前的标准库,优缺点兼具吧,hal库封装了更多底层的细节,我们可以很轻易的实现我们需要的功能,但是由于封装了太多的细节,导致一旦出问题,你就很难发现问题,内部调用的复杂让你觉得懵逼。

(一)hal库接收中断的分析

这几天在使用hal库的USART,其中用到的是接收中断,官方推荐的使用接收中断的方式是:在初始化函数上面先开启接收中断(这里就不介绍串口的配置,网上一大推,我就不给世界增加无谓的存储量了),开启的函数如下:

HAL_UART_Receive_IT(&huart2,(uint8_t*)aRxBuffer, 1);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量

接着直接调用总的回调函数就可以了(这个函数的名称是定义好的),的:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance==USART2)//判断,如果是串口2{//在这里写入自己要实现的代码}}

其实使用回调函数的原理大概是这样的:MCU接收到数据产生中断,进入中断函数:

//串口中断服务程序
void USART1_IRQHandler(void)
{ u32 timeout=0;   HAL_UART_IRQHandler(&UART1_Handler);    //调用HAL库中断处理公用函数//省略部分代码/*代码*/}

也就是中断进入了HAL_UART_IRQHandler(&UART1_Handler);这个函数,这个函数是一个总的中断处理函数,也就是很多串口的中断处理最后都汇集到这个地方来处理。其实体如下:

void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
{/*省略一部分代码*/UART_Receive_IT(huart);/*省略一部分代码*/
}

而UART_Receive_IT(huart);的实现如下:

static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
{/*省略一部分代码*/HAL_UART_RxCpltCallback(huart);/*省略一部分代码*/
}

也就是说最后会调用到  HAL_UART_RxCpltCallback(huart);,我们在这个函数内部做自己的需求就好了。

(二) 为了效率出了问题

由上面的分析,我们可以知道,hal库的中断接收虽然很方便,但是是非常没有效率的,兜兜转转绕了一个大弯才能处理中断接收的数据。尤其是我使用的是STM32F0的芯片,频率只有48M,不比那些动不动就上百兆的芯片,这样的中断处理显然不能接受。

所以,借鉴于标准库,我想直接在串口中断函数(void USART2_IRQHandler(void))上直接处理函数,而不用在转一个圈跑到回调函数( HAL_UART_RxCpltCallback(huart))上处理。

然而,一改,问题就来了,一共遇到过两个问题。

(1)一进中断就出不来

由于不知道之前hal库在中断处理做了什么手脚,所以自己也忘了判断和清除中断标志,加上下面几句话就好了。

void USART2_IRQHandler(void)
{/* UART in mode Receiver ---------------------------------------------------*/if((__HAL_UART_GET_IT(&huart2, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_RXNE) != RESET)){/*处理代码*//* Clear RXNE interrupt flag */ __HAL_UART_SEND_REQ(&huart2, UART_RXDATA_FLUSH_REQUEST); //清除接收数据非空中断标志}
}

(2)一进入中断MCU就死机

这个问题是由于我在中断处理了大量的任务导致的死机,虽然我之前同样在别的芯片上这样处理而没有出现问题,不过以前用的芯片比我现在用的这款强大太多了,还是那句老话:不要在中断干太多的任务。你可以在中断完成一些标志,或者处理一下接收的数据(可以转存到别的数据,但记住不要用hal库的函数,卡死不负责)然后在回到主函数处理。比如:


void USART2_IRQHandler(void)
{/* UART in mode Receiver ---------------------------------------------------*/if((__HAL_UART_GET_IT(&huart2, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_RXNE) != RESET)){flag_text=1;  //中断标志RxBuif = huart2.Instance->RDR; //将接收到的数据保存在全局变量/* Clear RXNE interrupt flag */ __HAL_UART_SEND_REQ(&huart2, UART_RXDATA_FLUSH_REQUEST); //清除接收数据非空中断标志}
}

最后,祝自己和各位少遇bug(不遇到是不存在的。。。)

使用STM32hal库usart的接收中断分析及出现部分问题的解决相关推荐

  1. 2021电赛F题智能送药小车方案分析(openMV数字识别,红线循迹,STM32HAL库freeRTOS,串级PID快速学习,小车自动返回)

    2021全国大学生电子设计竞赛F题智能送药小车 前提:本篇文章重在分享自己的心得与感悟,我们把最重要的部分,摄像头循迹,摄像头数字识别问题都解决了,有两种方案一种是openARTmini摄像头进行数字 ...

  2. STM32HAL库RS485-ModBus协议控制伺服电机

    STM32HAL库RS485-ModBus协议控制伺服电机 一个月前,接手了一个学长的毕设小车,小车采用rs485通信的modbus协议驱动轮毂电机,与往常我学习的pwm控制电机方法大相径庭,在这里以 ...

  3. STM32HAL库-内部Flash在指定页读写保护示例

    概述 本篇文章介绍如何使用STM32HAL库,内部Flash在特定页读写保护示例. 硬件:STM32F103CBU6最小系统板 软件:Keil 5.29  + STM32CubeMX5.6.1 一.使 ...

  4. STM32HAL库-移植mbedtls开源库示例(一)

    目录 概述 一.使用方法 二.STM32CubeMx配置 三.Examples 四.运行结果 五.总结 概述 本篇文章介绍如何使用STM32HAL库,移植mbedtls开源库支持mqtt证书加密示例. ...

  5. STM32HAL库-针对芯片内部FLASH读保护实现防篡改、破解功能(详解)

    目录 概述 一.使用方法 二.STM32CubeMx配置​ 三.Examples 四.运行结果 五.总结 概述 本篇文章介绍如何使用STM32HAL库,针对芯片读写保护实现防篡改.破解功能(详解),本 ...

  6. stm32hal库使用RTC时PC13作为普通GPIO注意事项

    stm32hal库使用RTC时PC13作为普通GPIO注意事项 问题现象 现象分析 问题解决 问题现象 做项目采用STM32L4系列,为了方便PCB布板,使用PC13作为电源控制管脚,项目初期未进行B ...

  7. GD32移植STM32HAL库接口

    GD32移植STM32HAL库接口 串口接口 串口需要的延时 GPIO接口及中断设置接口 中断设置 配置端口输出例子 FLASH接口 Flash测试代码 看门狗非HAL接口 定时器部分接口 原工程使用 ...

  8. STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号

    STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号 一. 问题描述 二. 方法一--使用HAL_UART_Receive_DMA 三. 方法二--使用HAL_UARTEx_Rece ...

  9. 第三季2:ORTP库的源码分析、RTP发送实验的源码分析

    以下内容源于朱有鹏课程,如有侵权,请告知删除. 一.ORTP库源码分析 1.ORTP库概览 (1)库提供一堆功能函数(本身没有main),都在src目录下 (2)库的使用给了案例(有main),在sr ...

最新文章

  1. 转载:说说高斯过程回归
  2. jsp网站访问次数统计
  3. 服务器不显示磁盘柜,磁盘柜与服务器的关系
  4. MySQL使用 IN 查询取出数据排序问题(与in排序相同、不排序)
  5. python和c学习-Cpython学习一:入门
  6. 听说redux和react-redux在写项目中更配哦
  7. 三种常见单片机时钟电路方案,对比其优缺点
  8. Codeforces Round #715 (Div. 1) B. Almost Sorted 找规律
  9. 李航《统计学习方法》笔记
  10. 您能解决这3个(看似)简单的Python问题吗?
  11. 资源放送丨《Oracle 19c x86下移经验分享》PPT视频
  12. 两千字揭密 MySQL 8.0.19 三大索引新功能:隐藏索引,降序索引,函数索引
  13. MS DOS窗口进入JAVA源程序,从java程序运行MS-DOS命令
  14. 重庆大学c语言程序设计基础,c语言程序设计基础黄文胜
  15. taskctl控制容器之定时器个人理解
  16. 数据通路、微操作序列
  17. nrf52840 spi 32MHz配置
  18. 【JY】ABAQUS混凝土CDP插件分享
  19. java:线程的六种状态
  20. 阿拉伯数字转换成人民币大写金额的方法

热门文章

  1. 计算机组成翟学明,东北大学秦皇岛分校组成原理课程设计.doc
  2. Matlab eval用法
  3. Linux文件管理系统
  4. 吾爱2023新年红包题第六题 (CTF)
  5. android控制电路板的开关灯,一文解读LED触摸调光台灯控制电路板的工作原理
  6. spark 实现大表数据关联
  7. 麦咖啡未来三年将投资25亿,在中国内地布局超过4000家
  8. OpenVINO 2021r4.1 - 瞎搞YOLOV5 模型转换,INT8量化及C++推理实现
  9. 易经之乾卦和坤卦(从职场角度分析)
  10. python界面交互PyQt5–消息框(QMessageBox)