HAL库的封装提高了代码的可移植性,但是对常用到串口的不定长接收没有做封装,下面实现一下串口的不定长接收!1、创建工程,使用CUBEIDE创建原始工程,填入文件名选择芯片,启动CUBEMX(以L0为例);& I9 g9 D* [- ^" F; p' x 3、配置串口,使能串口中断,串口接收DMA中断' i2 e( H( a# V8 m ' c+ K* o' ^ d3 J8 _ 4、生成源代码 5、修改stm32l0xx_hal_uart.h文件,先声明串口接收缓存区的大小 在UART_HandleTypeDef结构体中添加接收长度和接收缓存区% ^( j6 E4 G5 r- j# j 6、修改stm32l0xx_hal_uart.c文件,先修改HAL_UART_Receive_DMA函数,使能空闲中断,: G i2 z. g6 G `+ G. W 再修改HAL_UART_IRQHandler函数, 由于DMA结构体DMA_Channel_TypeDef在F4(NDTR)和L0(CNDTR)中定义不一样,所以F4和L0在修改时有一定差别& [( F* u, _ g% B2 e- K, e1 f 接着修改HAL_UART_AbortReceive_IT函数 最后修改HAL_UART_AbortReceiveCpltCallback函数,该函数是HAL库留给用户的回调函数,可以在重新定义,该例程主要将接收到的数据通过该串口发出去,用户可在该函数中处理数据 最后在main函数中调用接收DMA函数HAL_UART_Receive_DMA(&huart1, huart1.rxbuf, USART_IDLE_MAX_LENGTH),# [: r0 ]! v) u! T8 x 编译工程,下载;在串口助手端发送字符串,长度不大于USART_IDLE_MAX_LENGTH,串口助手显示9 e& B2 J ?/ ]5 `* s8 ` 到此工程已实现串口不定长接收功能,但是如果要更改CUBEMX的配置,修改后的文件会被HAL库的标准文件覆盖,如果想将修改后的文件应用到以后的工程中,可以将修改后的文件替换掉原始的HAL库文件,方法如下,在CUBEMX首页,点击Help,选择updater Settings选项,会出现以下界面,图中红框标记的就是HAL库存放位置,进入该文件夹 按照以下路径进入STM32L0xx_HAL_Driver文件夹,将stm32l0xx_hal_uart.h文件放入Inc文件夹中,覆盖原先的stm32l0xx_hal_uart.h文件;将stm32l0xx_hal_uart.c文件放入Src文件夹并覆盖,3 m8 O6 I3 x% y9 X& Q8 J& | 验证 现在创建新的L0工程,按照以前CUBEMX配置,生成工程,在main函数中添加函数5 C/ e, K" W" v( b) @0 } HAL_UART_Receive_DMA(&huart1, huart1.rxbuf, USART_IDLE_MAX_LENGTH),编译,下载7 W/ i9 A( B e- P- m# t6 J " r+ i: |$ {6 K 9 i. ?8 P: }- h |
大部分人都不是回调,直接按照标准库的处理方式 处理了。