stm32 串口帧空闲中断接收大量数据

需求 串口使用普通的接收中断 HAL_UART_Receive_IT 在接收比较少的字节,并且中断处理非常简单的情况下还行,一旦需要接收大量的数据,并且中断处理稍微复杂一些,就会造成丢数据的情况。需要解决这个情况。 解决 解决的办法就是使用帧空闲中断 HAL_UARTEx_ReceiveToIdle_IT 来接收一大堆数据,配套的 callback 函数是 HAL_UARTEx_RxEventCallback. void MainInit() { HAL_UARTEx_ReceiveToIdle_IT(&huart2, uart_web.get_rx_buf(), UartWeb::kRxBufLength); } void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { if (huart->Instance == USART2) { LOGD("HAL_UARTEx_RxEventCallback: USART2"); if (uart_web.Receive(Size)) { main_status = kMainWebReceive; } //HAL_UART_Receive_IT(&huart2, &uart_web_tmp, 1); HAL_UARTEx_ReceiveToIdle_IT(&huart2, uart_web.get_rx_buf(), UartWeb::kRxBufLength); } } 参考 stm32 HAL库 笔记——HAL_UARTEx_ReceiveToIdle_IT STM32 非阻塞HAL_UART_Receive_IT解析与实际应用 【STM32】HAL库 STM32CubeMX教程四—UART串口通信详解 STM32CubeMX——串口数据收发基础(HAL 库)

2023-05-24 · 1 min · 56 words · RamLife

stm32 在其他中断中使用 HAL_Delay

需求 因为 485 总线控制的时候,需要考虑在收发转换的时候,不能直接切换,应该让状态再保持一段时间,比如 2ms ,然后再进行切换,这样通讯会更加稳定。这就需要再收发中断里面使用延时,而最简单的延时就是 systick 的延时。但是实际上使用起来,这个延时工作不正常。 解决 出问题的原因也很简单,因为 st 默认让 systick 的中断优先级是最低,所以导致在其他中断中,使用 HAL_Delay, 内部的数值不变,所以一直困在中断里面。解决的方法也很简单,就是重新配置中断优先级,把 systick 的优先级提高到高于通信中断的优先级即可。 参考

2023-05-24 · 1 min · 19 words · RamLife

stm32 HAL_SYSTICK_Callback 生效

需求 今天调试的时候,发现通过 systick 的 callback 并没有被调用到,这个有问题。 解决 整体的调用流程是: SysTick_Handler -> HAL_SYSTICK_IRQHandler -> HAL_SYSTICK_Callback, 但是在最新生成的库函数中, SysTick_Handler 中没有默认调用 HAL_SYSTICK_IRQHandler, 所以需要手动在 HAL_IncTick 后添加。 void SysTick_Handler(void) { /* USER CODE BEGIN SysTick_IRQn 0 */ /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); /* USER CODE BEGIN SysTick_IRQn 1 */ HAL_SYSTICK_IRQHandler(); /* USER CODE END SysTick_IRQn 1 */ } 参考 STM32 HAL_SYSTICK_Callback() 失效 无效

2023-05-21 · 1 min · 59 words · RamLife