STM32系统时钟设置详解

配置主要代码如下,看起来挺简单,实际设计的东西还是挺多的,需要多看几遍,下面进行详解:

//系统时钟初始化函数

//pll:选择的倍频数,从2开始,最大值为16


void Stm32_Clock_Init(u8 PLL)
{
unsigned char temp=0;   
MYRCC_DeInit();  //复位并配置向量表
RCC->CR|=0x00010000;  //外部高速时钟使能HSEON
while(!(RCC->CR>>17));//等待外部时钟就绪
RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
PLL-=2;//抵消2个单位
RCC->CFGR|=PLL<<18;   //设置PLL值 2~16
RCC->CFGR|=1<<16;  //PLLSRC ON 
FLASH->ACR|=0x32;  //FLASH 2个延时周期


RCC->CR|=0x01000000;  //PLLON
while(!(RCC->CR>>25));//等待PLL锁定
RCC->CFGR|=0x00000002;//PLL作为系统时钟  
while(temp!=0x02)     //等待PLL作为系统时钟设置成功
### STM32系统时钟初始化方法 STM32系列微控制器的系统时钟初始化是一个重要的环节,它决定了芯片运行的核心频率以及外设的工作速度。以下是关于如何配置和初始化STM32系统时钟的具体说明。 #### 1. 初始设置概述 在STM32中,系统时钟可以通过多种方式配置,默认情况下通常会选择外部高速晶振(HSE),并通过锁相环(PLL)进行倍频操作以达到所需的主频。对于不同的型号(如STM32F1、STM32F4等),其具体实现略有不同,但核心逻辑基本一致[^1]。 #### 2. 使用官方库中的`SystemInit()`函数 在基于HAL库或者标准外设库开发时,系统时钟的初始配置主要依赖于`SystemInit()`函数。该函数位于特定的启动文件中,例如: - 对于STM32F1系列:`startup_stm32f10x_*.s` 文件。 - 对于STM32F4系列:`system_stm32f4xx.c` 文件。 这些文件会自动调用`SystemInit()`函数,在此过程中完成以下几项工作: - **浮点单元(FPU)初始化**:如果硬件支持,则启用FPU。 - **向量表重定位**:将中断向量表移动到指定位置。 - **外部存储器配置**:如果有扩展内存,则在此阶段进行初步配置。 - **系统时钟初始化**:通过调用内部API设定SYSCLK及其来源。 默认情况下,大多数项目都会选择HSE作为输入源,并利用PLL将其放大至目标频率(比如72MHz)。这一行为是在汇编层面上定义好的,开发者无需手动干预即可生效。 #### 3. 手动调整时钟树结构 尽管可以依靠现成工具链自动生成部分代码片段,但在某些特殊场景下可能还需要进一步定制化处理。下面给出一段针对STM32F4系列的手动配置实例: ```c void ConfigureSysClock(void) { RCC_OscInitTypeDef osc_init; RCC_ClkInitTypeDef clk_init; // 配置震荡器参数 osc_init.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 启用 HSE osc_init.HSEState = RCC_HSE_ON; // 开启 HSE osc_init.PLL.PLLSource = RCC_PLLSOURCE_HSE; // PLL 输入来自 HSE osc_init.PLL.PLLM = 8; // 设置分频因子 M=8 (即 /8) osc_init.PLL.PLLN = 336; // 倍频 N=336 (即 *336) osc_init.PLL.PLLP = RCC_PLLP_DIV2; // 输出除法 P/2 (即 /2) HAL_RCC_OscConfig(&osc_init); // 更新总线时钟分配比例 clk_init.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; clk_init.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 主时钟来源于 PLL clk_init.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB 不变 (/1) clk_init.APB1CLKDivider = RCC_HCLK_DIV4; // APB1 减少四倍 (/4) clk_init.APB2CLKDivider = RCC_HCLK_DIV2; // APB2 减半 (/2) HAL_RCC_ClockConfig(&clk_init, FLASH_LATENCY_5); // 调整闪存等待周期为5级延迟 } ``` 上述代码展示了如何精确控制各个组件之间的关系并最终达成期望的结果——使CPU能够稳定运行在一个较高的性能水平之上同时兼顾功耗表现良好等问题[^2]。 #### 4. 更新全局变量 `SystemCoreClock` 无论采用何种途径来进行详细的调节动作之后都需要记得执行最后一步骤即将最新的实际值反馈给程序以便其他模块能据此做出相应安排。为此专门设计了一个辅助性的接口叫做`SystemCoreClockUpdate()`用于刷新当前记录下来的数值状态信息供后续查询使用[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值