HAL库的封装提高了代码的可移植性,但是对常用到串口的不定长接收没有做封装,下面实现一下串口的不定长接收!1、创建工程,使用CUBEIDE创建原始工程,填入文件名选择芯片,启动CUBEMX(以L0为例);8 [* D5 x4 _0 _3 S$ ^+ q
3、配置串口,使能串口中断,串口接收DMA中断4 }& r2 x% _* `
& h' L; K) t& I" g 4、生成源代码
5、修改stm32l0xx_hal_uart.h文件,先声明串口接收缓存区的大小1 G# M& J# t2 ?; q* Y
在UART_HandleTypeDef结构体中添加接收长度和接收缓存区% d8 G. h2 h: c
6、修改stm32l0xx_hal_uart.c文件,先修改HAL_UART_Receive_DMA函数,使能空闲中断,* w$ |. \% z/ `9 A: z
再修改HAL_UART_IRQHandler函数,0 r0 r8 z7 n7 n9 t& h- g 由于DMA结构体DMA_Channel_TypeDef在F4(NDTR)和L0(CNDTR)中定义不一样,所以F4和L0在修改时有一定差别
接着修改HAL_UART_AbortReceive_IT函数
最后修改HAL_UART_AbortReceiveCpltCallback函数,该函数是HAL库留给用户的回调函数,可以在重新定义,该例程主要将接收到的数据通过该串口发出去,用户可在该函数中处理数据
最后在main函数中调用接收DMA函数HAL_UART_Receive_DMA(&huart1, huart1.rxbuf, USART_IDLE_MAX_LENGTH),4 z' q4 t& I' c2 P% n 编译工程,下载;在串口助手端发送字符串,长度不大于USART_IDLE_MAX_LENGTH,串口助手显示0 q/ S- g9 T' A" F/ |4 i$ U7 {: `# z
到此工程已实现串口不定长接收功能,但是如果要更改CUBEMX的配置,修改后的文件会被HAL库的标准文件覆盖,如果想将修改后的文件应用到以后的工程中,可以将修改后的文件替换掉原始的HAL库文件,方法如下,在CUBEMX首页,点击Help,选择updater Settings选项,会出现以下界面,图中红框标记的就是HAL库存放位置,进入该文件夹* ]* {; f0 G2 Y) ?1 B9 k
按照以下路径进入STM32L0xx_HAL_Driver文件夹,将stm32l0xx_hal_uart.h文件放入Inc文件夹中,覆盖原先的stm32l0xx_hal_uart.h文件;将stm32l0xx_hal_uart.c文件放入Src文件夹并覆盖,; G: j2 N- u3 V, Q0 m
验证 现在创建新的L0工程,按照以前CUBEMX配置,生成工程,在main函数中添加函数 HAL_UART_Receive_DMA(&huart1, huart1.rxbuf, USART_IDLE_MAX_LENGTH),编译,下载7 @- z) j/ I& S* L/ h4 [
. K5 q4 x% Q0 L& ]5 j) E! \ |
微信公众号
手机版
大部分人都不是回调,直接按照标准库的处理方式 处理了。