问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32F407标准库时钟设置详解

创作时间:
作者:
@小白创作中心

STM32F407标准库时钟设置详解

引用
CSDN
1.
https://blog.csdn.net/qq_38295600/article/details/144429802

本文介绍STM32F407微控制器使用标准库进行时钟设置的具体步骤和代码实现。通过外部晶振(HSE)配置PLL(锁相环)以达到168MHz的系统时钟,并提供了完整的函数实现和注释说明。


(注:原文包含一张图片,但在抓取时已丢失)

RCC_DeInit();  
/*这里选择 外部晶振(HSE)作为 时钟源,因此首先打开外部晶振*/  
RCC_HSEConfig(RCC_HSE_ON);  
/*等待外部晶振进入稳定状态*/  
while( RCC_WaitForHSEStartUp() != SUCCESS );  
/* 到这一步为止,已有 HSE_VALUE = 8 MHz.  
PLL_VCO input clock = (HSE_VALUE or HSI_VALUE / PLL_M),  
根据文档,这个值被建议在 1~2MHz,因此我们令 PLL_M = 8,  
即 PLL_VCO input clock = 1MHz */  
PLL_M = 8;  
/* 到这一步为止,已有 PLL_VCO input clock = 1 MHz.  
PLL_VCO output clock = (PLL_VCO input clock) * PLL_N,  
这个值要用来计算系统时钟,我们 令 PLL_N = 336,  
即 PLL_VCO output clock = 336 MHz.*/  
PLL_N = 336;  
/* 到这一步为止,已有 PLL_VCO output clock = 336 MHz.  
System Clock = (PLL_VCO output clock)/PLL_P ,  
因为我们要 SystemClock = 168 Mhz,因此令 PLL_P = 2.  
*/  
PLL_P = 2;  
/*这个系数用来配置SD卡读写,USB等功能,暂时不用,根据文档,暂时先设为7*/  
PLL_Q = 7;  
/* 配置PLL并将其使能,获得 168Mhz 的 System Clock 时钟*/  
RCC_PLLConfig(RCC_PLLSource_HSE, PLL_M, PLL_N, PLL_P, PLL_Q);  
RCC_PLLCmd(ENABLE);  
/*到了这一步,我们已经配置好了PLL时钟。下面我们配置Syetem Clock*/  
/*选择PLL时钟作为系统时钟源*/  
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  

根据上面的块说明我们进行程序修改

第一步:
打开系统文件.c,将这一行屏蔽

第二步:
修改你的外部晶振值,看你板载晶振大小填写

第三步:写时钟配置代码

/*  
* 使用HSE时,设置系统时钟的步骤  
* 1、开启HSE ,并等待 HSE 稳定  
* 2、设置 AHB、APB2、APB1的预分频因子  
* 3、设置PLL的时钟来源  
* 设置VCO输入时钟 分频因子 m  
* 设置VCO输出时钟 倍频因子 n  
* 设置PLLCLK时钟分频因子 p  
* 设置OTG FS,SDIO,RNG时钟分频因子 q  
* 4、开启PLL,并等待PLL稳定  
* 5、把PLLCK切换为系统时钟SYSCLK  
* 6、读取时钟切换状态位,确保PLLCLK被选为系统时钟  
*/  
/*  
* m: VCO输入时钟 分频因子,取值2~63  
* n: VCO输出时钟 倍频因子,取值192~432  
* p: PLLCLK时钟分频因子 ,取值2,4,6,8  
* q: OTG FS,SDIO,RNG时钟分频因子,取值4~15  
* 函数调用举例,使用HSE设置时钟  
* SYSCLK=HCLK=168M,PCLK2=HCLK/2=84M,PCLK1=HCLK/4=42M  
* HSE_SetSysClock(25, 336, 2, 7);  
* HSE作为时钟来源,经过PLL倍频作为系统时钟,这是通常的做法  
* 系统时钟超频到216M爽一下  
* HSE_SetSysClock(25, 432, 2, 9);  
*/  
void HSE_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q)  
{  
__IO uint32_t HSEStartUpStatus = 0;  
// 使能HSE,开启外部晶振,野火F407使用 HSE=25M  
RCC_HSEConfig(RCC_HSE_ON);  
// 等待HSE启动稳定  
HSEStartUpStatus = RCC_WaitForHSEStartUp();  
if (HSEStartUpStatus == SUCCESS)  
{  
// 调压器电压输出级别配置为1,以便在器件为最大频率  
// 工作时使性能和功耗实现平衡  
RCC->APB1ENR |= RCC_APB1ENR_PWREN;  
PWR->CR |= PWR_CR_VOS;  
// HCLK = SYSCLK / 1  
RCC_HCLKConfig(RCC_SYSCLK_Div1);  
// PCLK2 = HCLK / 2  
RCC_PCLK2Config(RCC_HCLK_Div2);  
// PCLK1 = HCLK / 4  
RCC_PCLK1Config(RCC_HCLK_Div4);  
// 如果要超频就得在这里下手啦  
// 设置PLL来源时钟,设置VCO分频因子m,设置VCO倍频因子n,  
// 设置系统时钟分频因子p,设置OTG FS,SDIO,RNG分频因子q  
RCC_PLLConfig(RCC_PLLSource_HSE, m, n, p, q);  
// 使能PLL  
RCC_PLLCmd(ENABLE);  
// 等待 PLL稳定  
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)  
{  
}  
/*-----------------------------------------------------*/  
//开启 OVER-RIDE模式,以能达到更高频率(F429才有该功能)  
// PWR->CR |= PWR_CR_ODEN;  
// while((PWR->CSR & PWR_CSR_ODRDY) == 0)  
// {  
// }  
// PWR->CR |= PWR_CR_ODSWEN;  
// while((PWR->CSR & PWR_CSR_ODSWRDY) == 0)  
// {  
// }  
// 配置FLASH预取指,指令缓存,数据缓存和等待状态  
FLASH->ACR = FLASH_ACR_PRFTEN  
| FLASH_ACR_ICEN  
| FLASH_ACR_DCEN  
| FLASH_ACR_LATENCY_5WS;  
/*-----------------------------------------------------*/  
// 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLK  
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  
// 读取时钟切换状态位,确保PLLCLK被选为系统时钟  
while (RCC_GetSYSCLKSource() != 0x08)  
{  
}  
}  
else  
{ // HSE启动出错处理  
while (1)  
{  
}  
}  
}  

第四步:主函数调用,完成时钟配置

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号