配置串口
配置中断
时钟简单配置,生成代码即可
编写代码
使用STM32cube生成的代码,基本的串口初始化以及完成,首先在主函数中,while(1)前添加
HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuffer,LENGTH); //打开串口接收中断
这是为了打开串口接收中断,这是因为该函数中有使能中断的代码,具体为
/* Enable the UART Parity Error Interrupt */
__HAL_UART_ENABLE_IT(huart, UART_IT_PE);
/* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
__HAL_UART_ENABLE_IT(huart, UART_IT_ERR);
/* Enable the UART Data Register not empty Interrupt */
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
只做回显主函数while(1)中可以为空
在主函数外设置回调函数,代码如下
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //串口接收中断回调函数
{
if(huart->Instance == USART1) //判断发生接收中断的串口
{
// RxFlag=1; //置为接收完成标志
HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuffer,LENGTH);
HAL_UART_Transmit(&huart1, (uint8_t *)RxBuffer, LENGTH ,1000);
// HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuffer,LENGTH);
}
//__HAL_UART_ENABLE(&huart1);
}
这就是HAL库和标准库的区别,在标准库中,串口中断接收数据是在中断处理函数中完成,而HAL库对此进行了优化,提供了相应的回调函数,在回调函数中完成数据的读取,注意,在回调函数中读取函数必须为HAL_UART_Receive_IT,该函数可以再次打开串口中断,若不为他则会出错
HAL库针对不同的情况设置了不同的回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);//发送回调
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);//发送一半的回调,一般不用
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);//接收回调
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//接收一般回调,一般不用