[STM32H7] 串口中断持续触发 USART1_IRQHandler ()

[复制链接]
21|1
zhouyou99 发表于 2026-9-4 09:36 | 显示全部楼层 |阅读模式
我使用 Nucleo 板上的 STM32H743。一开始 USART3 正常运行数周,之后出现该故障;随后换到 USART1,同样正常运行几周后复现该问题。
测试条件:RX 引脚接地、TX 悬空;将 RX 设置为浮空输入,现象完全一致。

每次中断时观察到以下标志位被置 1:
BUSY、CM、CTS、EOB、IBD、NE、ORE、REACK、RTO、RXFF、SBK、TXFT、WKUP。
我只需要 RXNE、TC、TXE 这几个标志,用于接收、发送数据。

如何停止 USART1_IRQHandler 持续进入中断?
串口配置基本由 CubeMX 生成
static void MX_USART1_UART_Init(void)
{

/* USER CODE BEGIN USART1_Init 0 */

/* USER CODE END USART1_Init 0 */

LL_USART_InitTypeDef USART_InitStruct = {0};

LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

/* Peripheral clock enable */
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);

LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOB);
/**USART1 GPIO Configuration
PB15 ------> USART1_RX
PB6 ------> USART1_TX
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_15;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_4;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_InitStruct.Pin = LL_GPIO_PIN_6;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_7;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/* USART1 interrupt Init */
NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
NVIC_EnableIRQ(USART1_IRQn);

/* USER CODE BEGIN USART1_Init 1 */
//return;
/* USER CODE END USART1_Init 1 */
USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;
USART_InitStruct.BaudRate = 115200; //38400;
USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
USART_InitStruct.Parity = LL_USART_PARITY_NONE;
USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
LL_USART_Init(USART1, &USART_InitStruct);
LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);
LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);
LL_USART_DisableFIFO(USART1);
LL_USART_ConfigAsyncMode(USART1);

/* USER CODE BEGIN WKUPType USART1 */

/* USER CODE END WKUPType USART1 */

LL_USART_Enable(USART1);

/* Polling USART1 initialisation */
while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1))))
{
}
/* USER CODE BEGIN USART1_Init 2 */

LL_USART_EnableIT_RXNE(USART1);
/* USER CODE END USART1_Init 2 */

}

香水城 发表于 2026-9-4 10:55 | 显示全部楼层
几点提醒供参考:
1、 RXNE/RXFNE 触发后是否确实读取了 RDR;
2、各类已使能中断事件是否按照对应机制被正确清除,并可在清除后回读确认;
3、是否遗漏了 ORE/NE/FE/PE 等溢出和错误事件的处理。
4、检查 TXE/TXFNF 中断是否在发送完成后及时关闭。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

183

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0