STM32F103的RCC时钟及其设置

STM32F103的系统时钟源

和C51不同STM32F103的系统时钟源有好几个,根据官方手册,截取一个比较重要的部分如下:
时钟截图
从图中可以看出,系统时钟SYSCLK的来源包括HSI,PLLCLK,HSE,可以通过软件选择它们中的其中一个。

HSE 高速外部时钟信号

这个时钟信号直接来源于外部晶振(或者外部时钟),通过 OSC_IN 和 OSC_OUT 两个端子输入。晶振的大小介于4-16MHz。

HSI 内部RC振荡信号

由内部 8MHz RC振荡器生成。

PLL 锁相环

PLL 允许以 HSE 或者 HSI 作为原始信号,经过处理后得到系统时钟信号。由图可知,HSI 信号频率减半后,输入到 PLLSRC 。HSE则直接输入 PLLSRC 。可以通过软件选择用哪一个作为原始信号。PLLMUL 可以把输入信号的频率乘某个倍数,例如 8MHz 的 HSE 信号,输入到PLLMUL,用软件设置乘4倍后,就能得到 32MHz 的 PLLCLK 信号。

设置方法

主要利用 HAL_RCC_OscConfigHAL_RCC_ClockConfig 函数进行设置。
这个函数原本是用STM32CubeMX生成的,在其基础上进行了修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
// 这里同时配置HSE和PLL
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 要设置的信号源
RCC_OscInitStruct.HSEState = RCC_HSE_ON; // 设置为启用
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; // 设置启用PLL
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; // 设置PLL原始信号为HSE
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL4; // 设置PLLMUL倍率为4

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
...
...
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 设置系统时钟源为PLLCLK
...
...
}

其它类型的时钟源也类似。

测试是否成功设置

调用 HAL_RCC_GetSysClockFreq 函数,在调试器中查看其返回值即可知道系统的时钟频率是否和预期的一致。

Author: LouisZ
Link: http://notes.louisz.top/2024/07/stm32-rcc-clock/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.