使用 IDLE 中断接收,稍微修改了hal库,但是都是在begin end中修改,重新在cube中生成代码不会去掉这部分内容,不见原理,原理部分请参考编程手册,只讲做法。
1.在stm32f4xx_it,c中修改
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
uint32_t isrflags = READ_REG(huart1.Instance->SR);
uint32_t cr1its = READ_REG(huart1.Instance->CR1);
if(((isrflags & USART_SR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE)))
{
HAL_UART_IDLECallback(&huart1);
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
huart1.RxState = HAL_UART_STATE_READY;
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
2.在生成的uart.c文件加入,并且在.h中声明
__weak void HAL_UART_IDLECallback(UART_HandleTypeDef *huart)
{
(void)huart;
}
3.在应用程序中使能IDLE中断
void task1_Fxn(void *p)
{
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
status = HAL_UART_Receive_DMA(&huart1,uart_buffer,100);
while(1)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
vTaskSuspend(NULL);
//在这里添加接收到串口数据的处理
HAL_UART_AbortReceive(&huart1);
HAL_UART_Receive_DMA(&huart1,uart_buffer,100);
}
}
4.IDLE回调函数
void HAL_UART_IDLECallback(UART_HandleTypeDef *huart)
{
xTaskResumeFromISR(task1Handle);
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』