一、时钟的配置
二、USART的配置
1、引脚配置
2、中断及其他配置
三、LED的配置(GPIO)
四、工程的配置
使用的HAL库版本为:
五、代码
生成的串口中断代码如下:
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
HAL_UART_IRQHandler为串口中断回调函数,其中包含一个中断接收虚回调函数(HAL_UART_RxCpltCallback),我们可以自己在虚函数中实现自己想要的功能(即我们的单片机串口接收到数据就会进入中断,去执行HAL_UART_RxCpltCallback中的内容)。调用关系如下图所示:
虚函数的实现如下:
/*__weak */void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
//UNUSED(huart);
if(huart->Instance==USART1)
{
HAL_GPIO_TogglePin(Led0_GPIO_Port, Led0_Pin);
HAL_UART_Receive_IT(&huart1,aRxBuffer1,1);// 重新使能串口1接收中断
}
}
主要功能就是我们的单片机串口接收到数据后,LED0发生状态翻转。
如上图所示,发送1时,开发板上LED0会发生状态翻转。
/**
* @brief Receive an amount of data in interrupt mode.
* @param huart UART handle.
* @param pData pointer to data buffer.
* @param Size amount of data to be received.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
/* Check that a Rx process is not already ongoing */
if(huart->RxState == HAL_UART_STATE_READY)
{
if((pData == NULL ) || (Size == 0U))
{
return HAL_ERROR;
}
/* Process Locked */
__HAL_LOCK(huart);
huart->pRxBuffPtr = pData;
huart->RxXferSize = Size;
huart->RxXferCount = Size;
/* Computation of UART mask to apply to RDR register */
UART_MASK_COMPUTATION(huart);
huart->ErrorCode = HAL_UART_ERROR_NONE;
huart->RxState = HAL_UART_STATE_BUSY_RX;
/* Process Unlocked */
__HAL_UNLOCK(huart);
/* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
SET_BIT(huart->Instance->CR3, USART_CR3_EIE);
/* Enable the UART Parity Error and Data Register not empty Interrupts */
SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);
return HAL_OK;
}
else
{
return HAL_BUSY;
}
}
HAL_UART_Receive_IT函数可以使能串口处于中断接收模式,所以在函数初始化时,需要调用一次,在进入中断接收回调函数中,处理完想要执行的功能后,需要再次调用一次,重新使能串口接收中断。
代码记录:
STM32_Deal_A002
以上,仅为本人自用。