文章目录[隐藏]
因为HAL库都封装好了,如果想用中断接收,不能在中断里直接读RXD寄存器。
第一步,初始化时使能串口中断
MX_USART2_UART_Init();
if (HAL_UART_Init(&huart2) != HAL_OK)
HAL_UART_MspInit(huart);
......
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
第二步,重点,在主循环前开启接收中断HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_buf,1);
这是接收1个字节到rx_buf中
int main(void)
{
/* Configure the system clock */
HAL_Init();
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_buf,1);
while (1)
{
;
}
}
第三步,串口启动接收的过程 原理------这一步不需要用户处理
HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_buf,1)---->
调用UART_Start_Receive_IT(huart, pData, Size)---->
配置函数指针 huart->RxISR = UART_RxISR_8BIT;
使能接收中断SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE);
--------------------------------------------------------------------------------------
当收到数据发生中断的时候会执行这个函数
void USART2_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart2);
}
HAL_UART_IRQHandler(&huart2);---huart->RxISR(huart);通过指针调用UART_RxISR_8BIT;---->判断接收完成后,关中断,调用HAL_UART_RxCpltCallback(huart);
第四、启动新的接收
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
rx_cnt++;
//把接收到的数据从rx_buf复制到buffer里,然后启动新的一次接收
HAL_UART_Receive_IT(huart, (uint8_t *)rx_buf,1);
}
版权声明:本文为CSDN博主「D.luffy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liangbin414/article/details/121289379
因为HAL库都封装好了,如果想用中断接收,不能在中断里直接读RXD寄存器。
第一步,初始化时使能串口中断
MX_USART2_UART_Init();
if (HAL_UART_Init(&huart2) != HAL_OK)
HAL_UART_MspInit(huart);
......
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
第二步,重点,在主循环前开启接收中断HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_buf,1);
这是接收1个字节到rx_buf中
int main(void)
{
/* Configure the system clock */
HAL_Init();
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_buf,1);
while (1)
{
;
}
}
第三步,串口启动接收的过程 原理------这一步不需要用户处理
HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_buf,1)---->
调用UART_Start_Receive_IT(huart, pData, Size)---->
配置函数指针 huart->RxISR = UART_RxISR_8BIT;
使能接收中断SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE);
--------------------------------------------------------------------------------------
当收到数据发生中断的时候会执行这个函数
void USART2_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart2);
}
HAL_UART_IRQHandler(&huart2);---huart->RxISR(huart);通过指针调用UART_RxISR_8BIT;---->判断接收完成后,关中断,调用HAL_UART_RxCpltCallback(huart);
第四、启动新的接收
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
rx_cnt++;
//把接收到的数据从rx_buf复制到buffer里,然后启动新的一次接收
HAL_UART_Receive_IT(huart, (uint8_t *)rx_buf,1);
}
版权声明:本文为CSDN博主「D.luffy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liangbin414/article/details/121289379
暂无评论