gpt4 book ai didi

serial-port - 两个 USART 中断的溢出错误

转载 作者:行者123 更新时间:2023-12-04 08:52:17 25 4
gpt4 key购买 nike

在 STM32F2 上使用两个以 115200 波特运行的 USART,一个用于与 radio 模块通信,一个用于从 PC 进行串行通信。时钟速度为 120MHz。

当同时从两个 USART 接收数据时,一个 USART 或另一个可能会发生溢出错误。做一些快速的包络计算,应该有足够的时间来处理两者,因为中断只是简单地将字节复制到循环缓冲区。

在理论和测量中,将字节推送到缓冲区的中断代码应该/确实以 2-4µS 的顺序运行,在 115200 波特下,我们有大约 70us 来处理每个字符。

为什么我们偶尔会在一个或另一个 USART 上看到 ORE?

更新 - 附加信息:

  • 此时我们的代码中没有其他 ISR 正在触发。
  • 我们正在运行 Keil RTX,其 systick 中断配置为每 10 毫秒触发一次。
  • 我们目前没有禁用任何中断。
  • 根据这本书(Cortex-M 处理器系列的设计师指南),中断延迟大约为 12 个周期(不是真正致命的)

  • 鉴于上述所有 70us 至少是我们清除中断所需时间的 10 倍——所以我不确定它是否容易解释。我是否应该得出结论,一定有其他一些我忽略的因素?

    MDK-ARM 是 4.70 版

    systick 中断由 RTOS 使用,因此无法计时,其他 ISR 每个字节运行需要 2-3µS。

    最佳答案

    有类似的问题。简短的解决方案 - 将过采样更改为 8 位,这使得 USART 时钟更加精确。并明智地选择您的 MCU 时钟!

    huart1.Init.OverSampling = UART_OVERSAMPLING_8;

    此外,添加 USART 错误处理程序和机制来检查您的数据是否有效,例如 CRC16。这是 STM32F0xx 系列的示例,我假设它在整个系列中应该非常相似。
    void UART_flush(void) {
    // Flush UART RX buffer if RXNE is set
    if READ_BIT(huart1.Instance->ISR, USART_ISR_RXNE) {
    SET_BIT(huart1.Instance->RQR, UART_RXDATA_FLUSH_REQUEST);
    }

    // Not available on F030xx devices!
    // SET_BIT(huart1.Instance->RQR, UART_TXDATA_FLUSH_REQUEST);

    // Clear All Errors (if needed)
    if (READ_BIT(huart1.Instance->ISR, USART_ISR_ORE | USART_ISR_FE | USART_ISR_NE)) {
    SET_BIT(huart1.Instance->ICR, USART_ICR_ORECF | USART_ICR_FECF | USART_ICR_NCF);
    }
    }

    // USART Error Handler
    void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
    if(huart->Instance==USART1) {
    // See if we have any errors
    if (READ_BIT(huart1.Instance->ISR, USART_ISR_ORE | USART_ISR_FE | USART_ISR_NE | USART_ISR_RXNE)) {
    // Flush errors
    UART_flush();

    // Raise Error Handler
    _Error_Handler(__FILE__, __LINE__);
    }
    }
    }

    DMA 也可能有所帮助。我的问题与 USART 时钟容差有关,这甚至可能导致实现 DMA 时出现溢出错误。由于是 USART 硬件问题。无论如何,希望这可以帮助那里的人!干杯!

    关于serial-port - 两个 USART 中断的溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23078848/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com