stm32f103c8hal库串口 系统时钟应该怎么配置
时间: 2025-07-23 20:53:57 浏览: 2
在使用 STM32F103C8 微控制器进行串口通信时,系统时钟的配置至关重要。串口通信依赖于系统主频以及外设时钟(如 APB2 或 APB1)的设置,这些时钟决定了串口的波特率精度和通信稳定性。
### 1. 系统时钟配置的基本流程
STM32F103C8 的系统时钟(SYSCLK)通常来源于内部高速时钟(HSI)、外部高速时钟(HSE)或 PLL 输出。为了获得更高的精度和稳定性,推荐使用外部晶振(HSE)作为系统时钟源。
配置系统时钟的主要步骤包括:
- 启用 HSE(外部晶振)
- 配置 PLL 倍频系数
- 设置 AHB、APB1 和 APB2 的分频系数
- 选择系统时钟源为 PLL 输出
在 STM32CubeMX 中,可以通过图形界面直观地设置这些参数,并生成初始化代码。以下是一个典型的系统时钟配置示例,假设使用 8 MHz 外部晶振,目标系统时钟为 72 MHz:
```c
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// 初始化 HSE 振荡器
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // 8MHz * 9 = 72MHz
HAL_RCC_OscConfig(&RCC_OscInitStruct);
// 初始化 CPU、AHB 和 APB 总线时钟
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
}
```
### 2. 串口通信与时钟配置的关系
USART 模块的波特率计算依赖于其所在总线(通常是 APB2 或 APB1)的时钟频率。例如,在 STM32F103C8 中,USART1 通常挂载在 APB2 上,其默认波特率计算公式为:
```
BaudRate = f_APB2 / (16 * USARTDIV)
```
其中 `USARTDIV` 是由寄存器 `USART_BRR` 控制的分频系数。因此,APB2 的频率越高,波特率的精度越高,通信越稳定。
在上述配置中,系统时钟为 72 MHz,APB2 为 72 MHz(不分频),APB1 为 36 MHz(二分频)。这样配置后,USART1 的波特率可以精确控制,适用于大多数串口通信场景。
### 3. STM32CubeMX 配置建议
在 STM32CubeMX 中配置系统时钟时,应注意以下几点:
- **HSE 时钟源选择**:建议选择“Crystal/Ceramic Resonator”以获得更高精度。
- **PLL 设置**:确保 PLL 输出频率不超过 72 MHz(STM32F103C8 的最大频率限制)。
- **APB1 分频**:由于低速外设(如定时器)挂载在 APB1 上,建议设置为 36 MHz(即 72 MHz / 2)。
- **APB2 分频**:高速外设(如 USART1)挂载在 APB2 上,建议保持 72 MHz 不分频。
### 4. 验证时钟配置是否生效
可以通过以下方式验证系统时钟是否配置正确:
- 使用 `HAL_RCC_GetSysClockFreq()` 获取当前系统时钟频率。
- 在串口通信中观察波特率是否稳定,例如使用串口助手工具检查是否有乱码或丢包。
```c
uint32_t sysclk = HAL_RCC_GetSysClockFreq();
printf("System Clock Frequency: %lu Hz\n", sysclk);
```
### 5. 注意事项
- 确保外部晶振频率与电路板上实际使用的晶振一致(通常为 8 MHz)。
- 如果使用内部时钟(HSI),波特率精度可能会受到影响,导致通信不稳定。
- 在低功耗模式下,系统时钟可能会切换为其他源,需注意时钟切换逻辑。
---
阅读全文
相关推荐

















