我正在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中断处理程序中的所有内容都是错误的。
您不能只在需要时读写数据寄存器。你需要知道你是否被允许
您还应该控制错误状态。