在之前的帖子里,分享了一下使用DMA的方式,实现串口与外设通讯的方式,今天和大家分享一下使用中断的方式,实现开发板与外设之间的传输(发送/接收)
主要了解中断的发送方式,函数如下所示:
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
一:使用硬件连接:
板载PA2引脚连接到开发板的串口接收端
板载PA3引脚连接到开发板的串口发送端
二:程序编写流程:
2.1:程序开始运行时,调用 HAL_Init() 函数来重置所有外围设备,
2.2 初始化 Flash 接口和系统,
2.3 调用SystemClock_Config() 配置CPU主频为 48 MHz 运行。
2.4 初始化串口的外设部分
2.5 编写串口的通讯部分
注释:
串口UART 外设配置由 HAL_UART_Init() 函数确保。在程序中调用 HAL_UART_MspInit() 函数,在该函数中初始化串口的一些基本参数可以(CLOCK、GPIO 和 NVIC)实现所需 UART 资源的配置。你可以更新此功能以更改 UART 配置。
串口发送/接收到基本思路:
启动 UART/超级终端通信。HAL_UART_Receive_IT() 和 HAL_UART_Transmit_IT() 函数分别允许从超级终端接收数据和传输预定义的数据缓冲区。
UART 的异步通信方面清楚地突出,因为与超级终端之间的数据缓冲区传输/接收是同时完成的。
定义发送接收的缓冲区,TxBuffer (aTxStartMessage) 是预定义的,并且 RxBuffer (aRxBuffer) 大小限制为 10 个数据,即接收好10个数据后完成数据回传。
第一步,TxBuffer 缓冲区内容将显示在超级终端界面中,接收到的数据将存储在 RxBuffer 缓冲区中。在第二步中,RxBuffer 缓冲区中接收到的数据将被发送回超级终端并显示。
三:程序代码如下所示:
if(HAL_UART_Transmit_IT(&huart2, (uint8_t*)aTxStartMessage, TXSTARTMESSAGESIZE)!= HAL_OK) { /* Transfer error in transmission process */ Error_Handler(); } if(HAL_UART_Receive_IT(&huart2, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK) { /* Transfer error in reception process */ Error_Handler(); } while (HAL_UART_GetState(&huart2) != HAL_UART_STATE_READY) { } if(HAL_UART_Transmit_IT(&huart2, (uint8_t*)aRxBuffer, RXBUFFERSIZE)!= HAL_OK) { /* Transfer error in transmission process */ Error_Handler(); } while (HAL_UART_GetState(&huart2) != HAL_UART_STATE_READY) { } if(HAL_UART_Transmit_IT(&huart2, (uint8_t*)aTxEndMessage, TXENDMESSAGESIZE)!= HAL_OK) { /* Transfer error in transmission process */ Error_Handler(); } while (HAL_UART_GetState(&huart2) != HAL_UART_STATE_READY) { }
实现效果截图:
避坑经验:
1:启用奇偶校验后,计算出的奇偶校验将插入到传输数据的 MSB 位置。
2:使用 HAL_Delay() 时必须小心,此函数根据 SysTick ISR 中递增的变量提供准确的延迟(以毫秒为单位)。这意味着,如果 HAL_Delay() 是从外围 ISR 进程调用的,则 SysTick 中断必须具有比外围中断更高的优先级(数值上更低)。否则,调用方 ISR 进程将被阻止。要更改 SysTick 中断优先级,您必须使用 HAL_NVIC_SetPriority() 函数。
3:应用程序需要确保 SysTick 时基始终设置为 1 毫秒,才能执行正确的 HAL 操作。