c - STM32:无法退出UART中断的中断处理程序

标签 c stm32 interrupt uart low-level

我正在 STM32F103 上实现一个简单的 UART 接收传输协议(protocol),我在这里使用的库/样板代码是 LL,而不是 HAL(因为 HAL 包含大量的开销)

我的问题是,成功进入中断处理程序“USART1_IRQHandler”后,它会永远循环。 我的代码在这里:

    void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
    int ii = 0;
    for(ii=0; ii<4;  ii++){
        LL_mDelay(40);
        LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_5);
        LL_mDelay(40);
        LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_5);

    }
    uint8_t cc = LL_USART_ReceiveData8(USART1);
    LL_USART_TransmitData8(USART1, cc);
    LL_mDelay(130);

    //LL_USART_ClearFlag_RXNE(USART1);
    //NVIC_ClearPendingIRQ( USART1_IRQn );

  /* USER CODE END USART1_IRQn 0 */
  /* USER CODE BEGIN USART1_IRQn 1 */
  /* USER CODE END USART1_IRQn 1 */
}

在 main.c 中我有:

LL_USART_EnableIT_RXNE(USART1);
  while (1)
  {

        LL_mDelay(300);
        LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_5);
        LL_mDelay(300);
        LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_5);

        //LL_USART_EnableIT_TC(USART1);

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }

GPIO_Toggle 命令只是让 LED 闪烁,这样我就知道发生了什么。发生了这样的事情: 当我给MC通电时,它进入主循环并缓慢闪烁。 当我通过 UART 发送一些内容(~10 字节)时,LED 开始快速闪烁,表明它已进入中断处理程序。问题是它永远不会停止并在中断处理程序中不断旋转。

我尝试过使用现在评论的功能

LL_USART_ClearFlag_RXNE(USART1);
NVIC_ClearPendingIRQ( USART1_IRQn );

无论是单独使用还是组合使用,但它们对任何事情都没有任何影响。 我究竟做错了什么? 如何退出处理程序?

最佳答案

实际上,USART 中断处理程序中的所有内容都是错误的。

  1. 您没有检查导致中断的原因。 如果是 RXNE 标志,您应该只加载 DR 寄存器中的值。您不需要清除任何标志。如果是 TXE 标志,则可以将数据存储到 DR 寄存器。您无法通过任何其他方式清除此标志。如果没有任何数据要发送,则需要禁用 TXE 中断。否则会不断触发。

您不能随心所欲地读写数据寄存器。您需要知道您是否可以这样做

您还应该控制错误状态。

  • 不得在中断例程中使用任何延迟。尽可能快地进行。
  • 除了启用和禁用中断之外,请勿触摸 NVIC,因为目前您不知道它的用途。
  • 关于c - STM32:无法退出UART中断的中断处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52319739/

    相关文章:

    operating-system - 直接连接到 CPU 的 PCIe 插槽的中断路由

    c - 无法在 C 中打印值

    c - 试图理解指针的引用和地址

    stm32 - 如何在CubeMX STM32中使用LL(低级)驱动程序?

    microcontroller - STM32L1 的直接内存访问 RX

    c - STM32F4 ADC DMA 配置不工作

    java - 在Java中如何有理由地中断线程/ future /执行器?

    c - 如何确定此函数将返回 true 的输入?

    c - 这个程序在反转堆栈上有什么问题?

    c++ - 如何避免在用户模式下抢占我的线程