最近项目需求开始使用STM32,很多年不用了,以前用STM32的时候还没有HAL库。调试串口的中断接收一直有问题,网上看了各路大神的帖子,都写得比较混乱。耽误大半天,终于调通了,这里简单记录一下。
首先需要明白的是CUBEMX生成的代码里面虽然配置了串口,但是串口功能是关闭的,手动开启串口接收中断。手动配置开启中断的函数是
HAL_UART_Receive_IT(UART_HandleTypeDef *, uint8_t *, uint16_t );
我们看看源码,其实这个函数就配置了一下参数,注册了一下中断函数,并开启接收中断。
所以串口开启的时候一定要先调用一下这个函数,配置好接受缓冲,注册中断函数,并开启中断。
所以在stm32xxx_it.c 里面定义接收缓冲 uint8_t uart_buffer[255]={0};
在main.c里面声明为extern,因为需要在HAL库初始化完成之后手动调用HAL_UART_Receive_IT配置并开启中断,这里要用到接收的缓冲区定义。
extern uint8_t uart_buffer[255];
这时候我们再来看看接收中断函数UART_RxISR_8BIT干了些什么?
这里面用到了用户的中断回调函数。这个就是留给用户操作,完成接收业务的接口。
于是在stm32xxx_it.c 文件里面重写HAL_UART_RxCpltCallback回调函数。重点来了,因为在初始化结束之后已经手动开启并配置了接收缓冲,所以在用户中断回调里面直接读取一个字节即可,但是在回调函数里面读取到接收数据之后需要重新开启接收中断,因为在接收中断函数UART_RxISR_8BIT里面,已经关闭了中断,不手动开启,接下来就gameover了。。
经过以上的几步之后,我们就实现了串口持续接收不定长数据的功能。不得不说HAL库虽然完备,但是个人感觉使用起来比寄存器要绕弯弯得多。。
以上代码可以直接运行,使用协议简单测试一下。
ok,接下来就可以写逻辑功能了。今晚先收工。