stm32f407错误的波特率进不到串口中断
时间: 2025-02-28 22:11:00 浏览: 20
STM32F407 UART 波特率配置错误导致无法进入中断的原因分析
当遇到STM32F407的UART设备因波特率配置不当而未能触发接收或发送完成中断的情况时,通常是因为USART初始化过程中某些关键参数设置不正确所致。
1. 检查系统时钟源与时钟分频系数
确保使用的APBx总线频率与期望的一致,并且根据实际应用需求调整PCLKx(即APBx)相对于SYSCLK的比例。对于大多数情况而言,默认情况下APB2挂载着所有高级外设包括USART1,因此如果更改过PLL设定,则需同步更新相应寄存器中的值来匹配新的工作频率[^1]。
RCC_ClkInitTypeDef RCC_ClockInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;
// 配置并使能PLL作为系统时钟源
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_PLL;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8; // HSE / PLLM = VCO Input Clock (VIN)
RCC_OscInitStruct.PLL.PLLN = 336; // VIN * PLLN = VCO Output Clock (VOUT), here is 48MHz*336=16.128GHz
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // VOUT / PLLP = SYSCLK, so it's 16.128GHz/2=8.064GHz which will be truncated to 8GHz due to integer division.
HAL_RCC_OscConfig(&RCC_OscInitStruct);
// 设置AHB/APB1/APB2预分频因子
RCC_ClockInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClockInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClockInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClockInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClockInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClockInitStruct, FLASH_LATENCY_5);
2. 正确计算波特率发生器重装载值
依据选定的通信速率重新计算USART_BRR
寄存器内的数值,该操作可通过库函数自动完成,但手动指定时务必遵循官方手册给出的方法论:
[ USARTDIV = \frac{f_{CK}}{(16 × BaudRate)} ]
其中( f_{CK} )代表当前所选定时器输入信号的速度;而( BaudRate )则是目标传输速度bps。之后再将此结果拆分为整数部分和分数部分分别写入对应位置。
static void MX_USART1_UART_Init(void){
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart1);
}
3. 中断优先级及屏蔽状态核查
确认NVIC控制器里针对特定IRQ通道的状态是否允许响应来自USART模块产生的事件请求。此外还需留意全局中断开关位以及局部控制字段内关于接受何种类型异常的通知选项是否有误开启或关闭。
/* Enable the USART1 global Interrupt */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART1_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Configure the NVIC for USART1 */
HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(USART1_IRQn);
相关推荐


















