使用STM32hal库usart的接收中断分析及出现部分问题的解决
最近开始使用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的接收中断分析及出现部分问题的解决相关推荐
- 2021电赛F题智能送药小车方案分析(openMV数字识别,红线循迹,STM32HAL库freeRTOS,串级PID快速学习,小车自动返回)
2021全国大学生电子设计竞赛F题智能送药小车 前提:本篇文章重在分享自己的心得与感悟,我们把最重要的部分,摄像头循迹,摄像头数字识别问题都解决了,有两种方案一种是openARTmini摄像头进行数字 ...
- STM32HAL库RS485-ModBus协议控制伺服电机
STM32HAL库RS485-ModBus协议控制伺服电机 一个月前,接手了一个学长的毕设小车,小车采用rs485通信的modbus协议驱动轮毂电机,与往常我学习的pwm控制电机方法大相径庭,在这里以 ...
- STM32HAL库-内部Flash在指定页读写保护示例
概述 本篇文章介绍如何使用STM32HAL库,内部Flash在特定页读写保护示例. 硬件:STM32F103CBU6最小系统板 软件:Keil 5.29 + STM32CubeMX5.6.1 一.使 ...
- STM32HAL库-移植mbedtls开源库示例(一)
目录 概述 一.使用方法 二.STM32CubeMx配置 三.Examples 四.运行结果 五.总结 概述 本篇文章介绍如何使用STM32HAL库,移植mbedtls开源库支持mqtt证书加密示例. ...
- STM32HAL库-针对芯片内部FLASH读保护实现防篡改、破解功能(详解)
目录 概述 一.使用方法 二.STM32CubeMx配置 三.Examples 四.运行结果 五.总结 概述 本篇文章介绍如何使用STM32HAL库,针对芯片读写保护实现防篡改.破解功能(详解),本 ...
- stm32hal库使用RTC时PC13作为普通GPIO注意事项
stm32hal库使用RTC时PC13作为普通GPIO注意事项 问题现象 现象分析 问题解决 问题现象 做项目采用STM32L4系列,为了方便PCB布板,使用PC13作为电源控制管脚,项目初期未进行B ...
- GD32移植STM32HAL库接口
GD32移植STM32HAL库接口 串口接口 串口需要的延时 GPIO接口及中断设置接口 中断设置 配置端口输出例子 FLASH接口 Flash测试代码 看门狗非HAL接口 定时器部分接口 原工程使用 ...
- STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号
STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号 一. 问题描述 二. 方法一--使用HAL_UART_Receive_DMA 三. 方法二--使用HAL_UARTEx_Rece ...
- 第三季2:ORTP库的源码分析、RTP发送实验的源码分析
以下内容源于朱有鹏课程,如有侵权,请告知删除. 一.ORTP库源码分析 1.ORTP库概览 (1)库提供一堆功能函数(本身没有main),都在src目录下 (2)库的使用给了案例(有main),在sr ...
最新文章
- 转载:说说高斯过程回归
- jsp网站访问次数统计
- 服务器不显示磁盘柜,磁盘柜与服务器的关系
- MySQL使用 IN 查询取出数据排序问题(与in排序相同、不排序)
- python和c学习-Cpython学习一:入门
- 听说redux和react-redux在写项目中更配哦
- 三种常见单片机时钟电路方案,对比其优缺点
- Codeforces Round #715 (Div. 1) B. Almost Sorted 找规律
- 李航《统计学习方法》笔记
- 您能解决这3个(看似)简单的Python问题吗?
- 资源放送丨《Oracle 19c x86下移经验分享》PPT视频
- 两千字揭密 MySQL 8.0.19 三大索引新功能:隐藏索引,降序索引,函数索引
- MS DOS窗口进入JAVA源程序,从java程序运行MS-DOS命令
- 重庆大学c语言程序设计基础,c语言程序设计基础黄文胜
- taskctl控制容器之定时器个人理解
- 数据通路、微操作序列
- nrf52840 spi 32MHz配置
- 【JY】ABAQUS混凝土CDP插件分享
- java:线程的六种状态
- 阿拉伯数字转换成人民币大写金额的方法