你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

HAL库串口空闲中断不定长接收

[复制链接]
李康1202 发布时间:2020-11-20 16:20
HAL库的封装提高了代码的可移植性,但是对常用到串口的不定长接收没有做封装,下面实现一下串口的不定长接收!1、创建工程,使用CUBEIDE创建原始工程,填入文件名选择芯片,启动CUBEMX(以L0为例);
创建工程.png 2、使能RCC和SWD调试接口,配置系统时钟频率
2rcc配置.png
2RCC使能.png
2调试接口使能.png
3、配置串口,使能串口中断,串口接收DMA中断
3usart1配置.png
3usart1使能.png

4、生成源代码
代码生成.png
5、修改stm32l0xx_hal_uart.h文件,先声明串口接收缓存区的大小
idle长度定义.png
在UART_HandleTypeDef结构体中添加接收长度和接收缓存区
长度和缓存区定义.png
6、修改stm32l0xx_hal_uart.c文件,先修改HAL_UART_Receive_DMA函数,使能空闲中断,
HAL_UART_Receive_DMA函数修改前.png
HAL_UART_Receive_DMA修改后.png
再修改HAL_UART_IRQHandler函数,
由于DMA结构体DMA_Channel_TypeDef在F4(NDTR)和L0(CNDTR)中定义不一样,所以F4和L0在修改时有一定差别
HAL_UART_IRQHandler修改前.png HAL_UART_IRQHandler修改后.png
F4的DMA寄存器.png
接着修改HAL_UART_AbortReceive_IT函数
HAL_UART_AbortReceive_IT修改前.png
HAL_UART_AbortReceive_IT修改后.png
最后修改HAL_UART_AbortReceiveCpltCallback函数,该函数是HAL库留给用户的回调函数,可以在重新定义,该例程主要将接收到的数据通过该串口发出去,用户可在该函数中处理数据
HAL_UART_AbortReceiveCpltCallback修改前.png
HAL_UART_AbortReceiveCpltCallback修改后.png
最后在main函数中调用接收DMA函数HAL_UART_Receive_DMA(&huart1, huart1.rxbuf, USART_IDLE_MAX_LENGTH),
编译工程,下载;在串口助手端发送字符串,长度不大于USART_IDLE_MAX_LENGTH,串口助手显示
main函数添加.png
串口助手显示.png
到此工程已实现串口不定长接收功能,但是如果要更改CUBEMX的配置,修改后的文件会被HAL库的标准文件覆盖,如果想将修改后的文件应用到以后的工程中,可以将修改后的文件替换掉原始的HAL库文件,方法如下,在CUBEMX首页,点击Help,选择updater Settings选项,会出现以下界面,图中红框标记的就是HAL库存放位置,进入该文件夹
cubemx源码地址.png
按照以下路径进入STM32L0xx_HAL_Driver文件夹,将stm32l0xx_hal_uart.h文件放入Inc文件夹中,覆盖原先的stm32l0xx_hal_uart.h文件;将stm32l0xx_hal_uart.c文件放入Src文件夹并覆盖,
最终目录.png
验证 现在创建新的L0工程,按照以前CUBEMX配置,生成工程,在main函数中添加函数
HAL_UART_Receive_DMA(&huart1, huart1.rxbuf, USART_IDLE_MAX_LENGTH),编译,下载
串口助手信息.png



HAL_UART_Receive_DMA函数修改前.png
收藏 评论1 发布时间:2020-11-20 16:20

举报

1个回答
呵呵1991 回答时间:2020-11-21 15:13:41
很棒,
大部分人都不是回调,直接按照标准库的处理方式 处理了。

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版