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)
{
}
}
}
第四步:主函数调用,完成时钟配置
热门推荐
债市的供需面怎么看?
高市盈率意味着什么?这种情况如何应对和分析?
中医3款方剂调理夜间盗汗
经济条件是否是女人结婚的必要条件?
网购退款引纠纷 法官释法促调解
国产新特摄:从《铠甲勇士6》的遗憾到《龙脉叛客》的希望
网贷逾期被异地仲裁
贾岛推敲:文学史上的一段佳话
孟郊与贾岛:唐朝诗坛的“郊寒岛瘦”
边缘AI与分布式计算:未来智能系统的关键
崴脚为什么第二天最痛?专业医生为你解答
脾虚的类型和症状
【NFC手机门禁系统的实战部署】:全程指导,从零开始到成功部署
租赁合同如何收费?一文详解租赁合同收费方式与标准
翁经科:青年科学家的创新潜力来自哪儿
房产中介:揭秘行业现状,探寻未来发展之路
泪液分泌少?试试这些中药调理方法
为什么期货交易不建议做超短线?超短线交易有哪些风险?
如何消毒小狗细小病毒(以宠物为主)
漳州试点!市区公办幼儿园开托育班
中子星究竟有多可怕?每立方厘米重20亿吨,若人到中子星上会怎样
波澜壮阔的明朝历史:《明朝那些事儿》
LED芯片:三种核心结构解析
切线不等式放缩公式
高三学生总是犯困是怎么回事
高考580分左右可以上什么大学?多省汇总(2025参考)
让中国数学涌动创新活力——专访中国科学院院士、北京大学讲席教授田刚
化解大门对马路风水的实用方法
大学生就业焦虑及应对策略
祛痘印的洗面奶:成分、功效与选购指南