首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >STM32:无法退出UART中断的中断处理程序

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

Stack Overflow用户
提问于 2018-09-14 02:25:27
回答 2查看 2.3K关注 0票数 1

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

我的问题是,在成功进入中断处理程序"USART1_IRQHandler“之后,它会一直循环下去。我的代码如下:

代码语言:javascript
运行
复制
    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中,我有:

代码语言:javascript
运行
复制
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开始快速闪烁,表明它已进入中断处理程序。PProblem是它永远不会停止,并在中断处理程序中保持旋转。

我已经尝试使用now注释函数

代码语言:javascript
运行
复制
LL_USART_ClearFlag_RXNE(USART1);
NVIC_ClearPendingIRQ( USART1_IRQn );

无论是单独的还是组合的,但它们绝对不会对任何事情产生影响。我做错了什么?如何退出处理程序?

EN

回答 2

Stack Overflow用户

发布于 2018-09-14 07:26:33

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

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

当你想读写数据寄存器时,你不能这样做。你需要知道你是否被允许

您还应该控制错误状态。

  1. 您不能在中断例程中使用任何延迟。保持它尽可能快。
  2. 不要接触用于启用和禁用中断的NVIC例外,因为现在您还不知道它是用来做什么的。
票数 3
EN

Stack Overflow用户

发布于 2019-06-24 05:56:58

用于控制延迟的系统时间由周期性的sysTick中断更新。如果RXNE中断具有比sysTick中断更高的优先级,当您在RXNE IRQ处理程序中时,它将不会被处理,因此时间永远不会递增,并且永远不会到达您的延迟结束时间。根据延迟的实现方式,它可能会将CPU置于永远不能退出的自旋锁中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52319739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档