单片机 > 单片机程序设计 > 详情

stm32 hal库不定长接收数据

发布时间:2021-01-21 发布时间:
|

使用 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);

}




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C8051F020的UART