我有一些(大部分是CubeMX生成的)代码:
volatile uint8_t buf[4];
int main(void)
{
...
HAL_UART_Receive_IT(&huart3, buf, sizeof(buf));
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART3) {
HAL_UART_Transmit(&huart3, buf, sizeof(buf), 0xFFFF);
HAL_UART_Receive_IT(&huart3, buf, sizeof(buf));
}
}
这成功地响应了在USART3上接收到的所有内容。(这段代码只是一个抛出的示例,用来了解串口。)
我担心从调用HAL_UART_RxCpltCallback()
到HAL_UART_Receive_IT()
设置下一个接收之间的时间。
STM32F103中是否有保证数据在此间隔内不会丢失的特性?我还没有在USART上找到超过两个字节的接收缓冲区的任何证据。
我特别担心一些高优先级的USB设备活动可能会延迟HAL_UART_RxCpltCallback()
的调用,因此可能会丢失一个或多个字符。
发布于 2020-01-13 12:42:26
快速回答:
HAL_UART_Transmit是一个阻塞函数,因此,在它完成之前,不会调用HAL_UART_Receive_IT,并且uart肯定会溢出。如果您担心任何其他中断可能会预先执行,请在发出命令时使用dma或禁用麻烦的中断。你也可以提高UART中断优先级但是..。
提示:
....you不应该在HAL_UART_RxCpltCallback中调用HAL_UART_Transmit和HAL_UART_Receive_IT,因为这里您处于ISR模式。这会导致HAL框架的某些版本出现一些附带问题。最好设置一个标志并从主代码中检查它。
此外,您还应该真正避免使用易失性,最好使用像gcc __asm volatile("" ::: "memory")
这样的编译器屏障。
https://stackoverflow.com/questions/59716172
复制相似问题