簡體   English   中英

STM32:無法退出UART中斷的中斷處理程序

[英]STM32: Unable to exit interrupt handler for UART interrupt

我正在STM32F103上實現一個簡單的UART接收傳輸協議,我在這里使用的庫/樣板代碼是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開始快速閃爍,表明它已進入中斷處理程序。 PProblem是它永遠不會停止並在中斷處理程序中不斷旋轉。

我已經嘗試使用現在注釋的函數

LL_USART_ClearFlag_RXNE(USART1);
NVIC_ClearPendingIRQ( USART1_IRQn );

無論是單獨使用還是組合使用它們對任何事物都沒有任何影響。 我究竟做錯了什么? 我該如何退出處理程序?

實際上USART中斷處理程序中的所有內容都是錯誤的。

  1. 您不檢查導致中斷的原因。 如果是RXNE標志,則只需從DR寄存器加載該值即可。 您不需要清除任何標志。 如果是TXE標志,則可以將數據存儲到DR寄存器。 你不能以任何其他方式清除這面旗幟。 如果您沒有要發送的數據,則需要禁用TXE中斷。 否則會連續觸發。

您不能只在需要時讀寫數據寄存器。 你需要知道你是否被允許

您還應該控制錯誤狀態。

  1. 您不得在中斷例程中使用任何延遲。 保持盡可能快。
  2. 不要觸摸NVIC來啟用和禁用中斷,因為現在你不知道它是什么。

用於控制延遲的系統時間由周期性的sysTick中斷更新。 如果RXNE中斷的優先級高於sysTick中斷,則當您進入RXNE IRQ處理程序時,它將不會被處理,因此時間永遠不會增加,並且永遠不會達到延遲結束時間。 根據延遲的實現方式,它可能只是將CPU置於永不退出的自旋鎖中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM