我正在 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 中断处理程序中的所有内容都是错误的。
- 您没有检查导致中断的原因。 如果是 RXNE 标志,您应该只加载 DR 寄存器中的值。您不需要清除任何标志。如果是 TXE 标志,则可以将数据存储到 DR 寄存器。您无法通过任何其他方式清除此标志。如果没有任何数据要发送,则需要禁用 TXE 中断。否则会不断触发。
您不能随心所欲地读写数据寄存器。您需要知道您是否可以这样做
您还应该控制错误状态。
- 不得在中断例程中使用任何延迟。尽可能快地进行。
- 除了启用和禁用中断之外,请勿触摸 NVIC,因为目前您不知道它的用途。
关于c - STM32:无法退出UART中断的中断处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52319739/