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)
{
}
}
}
第四步:主函数调用,完成时钟配置
热门推荐
走进水墨花鸟画:揭秘传统手法与艺术魅力
白芍种植技术:从选地整地到采收的全过程详解
如何选择合适的图表类型,最佳呈现数据?
婴幼儿头发生长及常见问题
柔性电路板补强技术指南:提升FPC耐用性的关键工艺
长春失业金领取条件及标准 最新长春失业保险金在哪里可以申领?
当经济第一大省遇上人工智能,全国人大代表苗伟:广东有得天独厚的优势
价格差几倍!凤梨和菠萝是同一种水果吗?
砍伐树木引发的赔偿纠纷:如何收集有效证据
【交通出行】再创新高!2024年大兴机场城市航站楼服务旅客突破73万人次
投资合同条款是什么
考研英语二:提高写作水平的实用建议
如何提高研发团队的创新能力
5款超神RPG推荐:逐渐补完的《赛博朋克2077》,B社经典《上古卷轴5》
UG编程入门指南:推荐书籍与学习资源
瘦子就是这么吃出来的!重口味减重法,养出秋冬瘦体质
Kaizen:持续改善的理念与实践
后脑勺胀是什么原因导致的
Vue如何更新页面
各级道路的限速标准
喝茶对血糖测量有没有影响
公安局长进社区 架起警民“连心桥”
汽车NVH噪声降低的电机控制器技术:谐波电流注入方法初探
《柳叶刀》子刊研究点名!中国饮食升糖指数最高,增加糖尿病风险
沙棘原浆的副作用及危害
预制模块建筑技术的应用与创新
电磁炉用什么样的锅合适
什么运动对睡眠最有帮助?最佳运动竟不是跑步……
月季上嫁接茶花的管理方法
警校排名前十的大学:2025报考必看!附分数线与就业方向解析