[英]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中斷處理程序中的所有內容都是錯誤的。
您不能只在需要時讀寫數據寄存器。 你需要知道你是否被允許
您還應該控制錯誤狀態。
用於控制延遲的系統時間由周期性的sysTick中斷更新。 如果RXNE中斷的優先級高於sysTick中斷,則當您進入RXNE IRQ處理程序時,它將不會被處理,因此時間永遠不會增加,並且永遠不會達到延遲結束時間。 根據延遲的實現方式,它可能只是將CPU置於永不退出的自旋鎖中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.