因为要使用STM32CubeMX自动生成代码,所以这里学习的是正点原子HAL库版代码,并将其移植到STM32F103C8T6上。
第二个实验:USART
效果:单片机实现串口发送和接收的功能
接收(共有两种实现的方法):
①采用HAL库的流程:
串口1接收到RXBUFFERSIZE(1)个字符产生接收完成中断
函数USART1_IRQHandler:每次产生串口1中断时会进入该函数,该函数会调用HAL_UART_IRQHandler进行通用的串口中断处理
函数HAL_UART_IRQHandler:内部通过判断中断类型决定调用哪个函数,这里是接收完成中断,则继续调用UART_Receive_IT
函数UART_Receive_IT:该函数每执行一次(接收到一个字符)pRxBuffRtr指针加1,并保存接收到的字符到pRxBuffRtr,同时RxXferCount计数量减1,当UART_Receive_IT中当RxXferCount=0时执行回调函数
函数HAL_UART_Receive_IT:在USART的初始化函数MX_USART1_UART_Init中要先调用一次,设置pRxBuffRtr和RxXferCount,然后每次HAL_UART_IRQHandler完成后还要再调用一次,重新设置pRxBuffRtr和RxXferCount
函数HAL_UART_RxCpltCallback:在UART_Receive_IT中当RxXferCount=0时执行该回调函数,进行通讯协议的判断(0D0A),并转存数据,将pRxBuffRtr内的数据转存到自定义的缓冲区USART_RX_BUF
②采用正点原子简化流程:
不适用中断处理回调函数HAL_UART_RxCpltCallback,直接在USART1_IRQHandler内执行中断处理。
函数USART1_IRQHandler:每次产生串口1中断时进入,在调用__HAL_UART_GET_FLAG判断接收到中断时,进入中断处理,包括接收数据,协议判断,数据转存
函数HAL_USART_Receive:虽然是等待式函数,但每次只接收1个字节,所以效果等同于HAL_UART_Receive_IT
这里推荐用第二种方式,因为过程简单,效率更高。
总结一下:正点原子的代码可靠性高,规范性强,学会使用它的函数可以提高项目的稳定性。