MCU 时钟、PLL、时钟预分频器和 MCU 时钟分配的初始化
时间: 2024-08-22 22:01:39 浏览: 117
在微控制器(Microcontroller Unit, MCU)中,时钟管理是一个关键部分,包括时钟的源(如外部晶振、PLL),预分频操作,以及对不同模块的时钟分配。以下是一般的初始化过程:
1. **MCU时钟源**[^4]:
- 外部晶振(XTAL):通常作为基础时钟源,通过MCU的时钟电路连接到系统时钟输入。
- PLL(锁相环路):如果支持,用于从基本时钟源生成更高频率的内部时钟。PLL通常有可配置的分频器,可以调整输出频率。
2. **时钟预分频器设置**[^5]:
- 预分频器(如分频器DCLKP和MCKP)负责将主时钟(MCK)降低到各个功能单元所需的频率。这可以通过寄存器来配置分频系数。
3. **时钟初始化**[^6]:
- 通常,会有一个初始化函数,比如`SystemClock_Config()`,它包含了以下步骤:
```c
// 初始化PLL
SystemInit_PLL();
// 设置预分频器
SystemInit_RCC_PLL Division();
// 开启所需时钟
RCC_OscillatorStatus RCC_OscInitStruct;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8; // 分频系数
RCC_OscInitStruct.PLL.PLLN = 336; // 主时钟倍频系数
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // 二级分频
RCC_OscInitStruct.PLL.PLLQ = 7; // 三级分频
if (RCC_OscConfig(&RCC_OscInitStruct) != SUCCESS)
Error_Handler(); // 处理错误
// 应用时钟配置
SystemInit_RCC();
```
4. **时钟分配**[^7]:
- 根据应用需求,选择合适的时钟分频比,为GPIOs、定时器、DMA或其他模块配置时钟。例如:
```c
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 启动GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART1, ENABLE); // 启动USART1时钟
```
阅读全文