stm32F429启动时钟配置
STM32f429在启动时会在startup_stm32f429_439xx.s中调用static void SetSysClock(void)函数。默认使用的是25M晶振,把系统时钟设置为180M.
在system_stm32f4xx.c中给出了相关的默认时钟参数设置。static void SetSysClock(void)函数执行的就是这个参数设置的过程。
*=============================================================================
* Supported STM32F42xxx/43xxx devices
*-----------------------------------------------------------------------------
* System Clock source | PLL (HSE)
*-----------------------------------------------------------------------------
* SYSCLK(Hz) |
*-----------------------------------------------------------------------------
* HCLK(Hz) |
*-----------------------------------------------------------------------------
* AHB Prescaler |
*-----------------------------------------------------------------------------
* APB1 Prescaler |
*-----------------------------------------------------------------------------
* APB2 Prescaler |
*-----------------------------------------------------------------------------
* HSE Frequency(Hz) |
*-----------------------------------------------------------------------------
* PLL_M |
*-----------------------------------------------------------------------------
* PLL_N |
*-----------------------------------------------------------------------------
* PLL_P |
*-----------------------------------------------------------------------------
* PLL_Q |
*-----------------------------------------------------------------------------
* PLLI2S_N | NA
*-----------------------------------------------------------------------------
* PLLI2S_R | NA
*-----------------------------------------------------------------------------
* I2S input clock | NA
*-----------------------------------------------------------------------------
* VDD(V) | 3.3
*-----------------------------------------------------------------------------
* Main regulator output voltage | Scale1 mode
*-----------------------------------------------------------------------------
* Flash Latency(WS) |
*-----------------------------------------------------------------------------
* Prefetch Buffer | ON
*-----------------------------------------------------------------------------
* Instruction cache | ON
*-----------------------------------------------------------------------------
* Data cache | ON
*-----------------------------------------------------------------------------
* Require 48MHz for USB OTG FS, | Disabled
* SDIO and RNG clock |
*-----------------------------------------------------------------------------
*=============================================================================
假设外部晶振改成了其他的数值比如说8M ,要修改 "stm32f4xx.h " 文件中的 "HSE_VALUE" 宏定义。
如果程序在运行过程中动态修改了PLL倍频系数,或者切换了时钟源,请务必执行一次 SystemCoreClockUpdate()函数,这个函数会自动根据PLL倍频参数计算出实际的主频。
void SystemCoreClockUpdate(void)函数会检测 RCC clock configurat ion register (RCC_CFGR)寄存器的 Bits 3:2 这两位是只读的,由硬件清除和设置,不能软件写入。
Bits 3:2 SWS: System clock switch status
Set and cleared by hardware to indicate which clock source is used as the system clock.
00: HSI oscillator used as the system clock
01: HSE oscillator used as the system clock
10: PLL used as the system clock
11: not applicable
根据这两位通过置swtich语句分析设置源的选择,进一步进行设置,如果是用PLL还要读取RCC_PLLCFGR寄存器的值
获取P N M PLLSRC等参数,来更新系统时钟。系统时钟SYSCLK 有下列公式决定。
PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
SYSCLK = PLL_VCO / PLL_P
最后获得HCLK frequency :
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)];
/* HCLK frequency */
SystemCoreClock >>= tmp;
void SystemCoreClockUpdate(void)
{
uint32_t tmp = , pllvco = , pllp = , pllsource = , pllm = ;
#if defined(STM32F446xx)
uint32_t pllr = ;
#endif /* STM32F446xx */
/* Get SYSCLK source -------------------------------------------------------*/
tmp = RCC->CFGR & RCC_CFGR_SWS; switch (tmp)
{
case 0x00: /* HSI used as system clock source */
SystemCoreClock = HSI_VALUE;
break;
case 0x04: /* HSE used as system clock source */
SystemCoreClock = HSE_VALUE;
break;
case 0x08: /* PLL P used as system clock source */
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
SYSCLK = PLL_VCO / PLL_P
*/
pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> ;
pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; #if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx) || defined(STM32F446xx) || defined(STM32F469_479xx)
if (pllsource != )
{
/* HSE used as PLL clock source */
pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> );
}
else
{
/* HSI used as PLL clock source */
pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> );
}
#elif defined(STM32F410xx) || defined(STM32F411xE)
#if defined(USE_HSE_BYPASS)
if (pllsource != )
{
/* HSE used as PLL clock source */
pllvco = (HSE_BYPASS_INPUT_FREQUENCY / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> );
}
#else
if (pllsource == )
{
/* HSI used as PLL clock source */
pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> );
}
#endif /* USE_HSE_BYPASS */
#endif /* STM32F40_41xxx || STM32F427_437xx || STM32F429_439xx || STM32F401xx || STM32F446xx || STM32F469_479xx */
pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>) + ) *;
SystemCoreClock = pllvco/pllp;
break;
#if defined(STM32F446xx)
case 0x0C: /* PLL R used as system clock source */
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
SYSCLK = PLL_VCO / PLL_R
*/
pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> ;
pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
if (pllsource != )
{
/* HSE used as PLL clock source */
pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> );
}
else
{
/* HSI used as PLL clock source */
pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> );
} pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >>) + ) *;
SystemCoreClock = pllvco/pllr;
break;
#endif /* STM32F446xx */
default:
SystemCoreClock = HSI_VALUE;
break;
}
/* Compute HCLK frequency --------------------------------------------------*/
/* Get HCLK prescaler */
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> )];
/* HCLK frequency */
SystemCoreClock >>= tmp;
}
另外也可以自己实现两个设置时钟的函数:
/*
* 使用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=180M,PCLK2=HCLK/2=90M,PCLK1=HCLK/4=45M
* HSE_SetSysClock(25, 360, 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 = ; // 使能HSE,开启外部晶振,秉火F429使用 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模式,以能达到更高频率
PWR->CR |= PWR_CR_ODEN;
while((PWR->CSR & PWR_CSR_ODRDY) == )
{
}
PWR->CR |= PWR_CR_ODSWEN;
while((PWR->CSR & PWR_CSR_ODSWRDY) == )
{
}
// 配置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 ()
{
}
}
} /*
* 使用HSI时,设置系统时钟的步骤
* 1、开启HSI ,并等待 HSI 稳定
* 2、设置 AHB、APB2、APB1的预分频因子
* 3、设置PLL的时钟来源
* 设置VCO输入时钟 分频因子 m
* 设置VCO输出时钟 倍频因子 n
* 设置SYSCLK时钟分频因子 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
* 函数调用举例,使用HSI设置时钟
* SYSCLK=HCLK=180M,PCLK2=HCLK/2=90M,PCLK1=HCLK/4=45M
* HSI_SetSysClock(16, 360, 2, 7);
* HSE作为时钟来源,经过PLL倍频作为系统时钟,这是通常的做法 * 系统时钟超频到216M爽一下
* HSI_SetSysClock(16, 432, 2, 9);
*/ void HSI_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q)
{
__IO uint32_t HSIStartUpStatus = ; // 把RCC外设初始化成复位状态
RCC_DeInit(); //使能HSI, HSI=16M
RCC_HSICmd(ENABLE); // 等待 HSI 就绪
HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY; // 只有 HSI就绪之后则继续往下执行
if (HSIStartUpStatus == RCC_CR_HSIRDY)
{
// 调压器电压输出级别配置为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_HSI, m, n, p, q); // 使能PLL
RCC_PLLCmd(ENABLE); // 等待 PLL稳定
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
} /*-----------------------------------------------------*/
//开启 OVER-RIDE模式,以能达到更高频率
PWR->CR |= PWR_CR_ODEN;
while((PWR->CSR & PWR_CSR_ODRDY) == )
{
}
PWR->CR |= PWR_CR_ODSWEN;
while((PWR->CSR & PWR_CSR_ODSWRDY) == )
{
}
// 配置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
{ // HSI启动出错处理
while ()
{
}
}
}
stm32F429启动时钟配置的更多相关文章
- 痞子衡嵌入式:系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败问题. 我们知道,i.MXRT1xxx家族早期型号(RT1050/ ...
- S3C2440时钟配置
参考: http://blog.csdn.net/mr_raptor/article/details/6555734 http://blog.csdn.net/mjx91282041/article/ ...
- STM32F4_RCC系统时钟配置及描述
Ⅰ.概述 对于系统时钟应该都知道它的作用,就是驱动整个芯片工作的心脏,如果没有了它,就等于人没有了心跳. 对于使用开发板学习的朋友来说,RCC系统时钟这一块知识估计没怎么去配置过,原因在于开发板提供的 ...
- STM32F0xx_RTC实时时钟配置详细过程
Ⅰ.概述 今天总结RTC(Real Time Clock)实时时钟相关的知识,顺带将BKP简单总结一下. STM32的RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待 ...
- memcached的基本命令(安装、卸载、启动、配置相关)
memcached的基本命令(安装.卸载.启动.配置相关):-p 监听的端口 -l 连接的IP地址, 默认是本机 -d start 启动memcached服务 -d restart 重起memcac ...
- windows下jboss启动、配置、访问
window 下的jboss启动.配置.访问 1.进入jboss\server\default\deploy\jboss-web.deployer 执行run命令 2.jboss访问地址:http:/ ...
- 四轴飞行器1.2.3 STM32F407时钟配置和升级标准库文件
原创文章,欢迎转载,转载请注明出处 这个星期进度比较慢哈,只有周末和晚上下班回来才能做,事件不连续,琐碎的事情又比较多,挺烦的,有多琐碎呢? 1.本人有点小强迫症哈,虽然RTT将文 ...
- stm32时钟配置总结
stm32时钟配置时钟源: 1,HSE(高速外部时钟)即常见的外接8M晶振方案: 2,HSI(高速内部时钟) 即8M内部振荡时钟方案: 3,LSE(低速外部时钟)即常见的32.768Khz晶振方案: ...
- STM32F4系统时钟配置及描述
STM32F4系统时钟配置及描述 stm32f407时钟配置方法(感觉很好,分享一下) STM32F4_RCC系统时钟配置及描述 STM32F4时钟设置分析 stm32f4 - 时钟树分析配置
随机推荐
- 费马小定理证明 (copy的,自己捋清楚)
费马小定理:假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p) 证明(copy的百度百科,加点自己的解释) 引理1. 若a,b,c为任意3个整数,m为正整数,且(m,c)=1 ...
- 安装ubuntu是所需的引导
title Install Ubuntu root (hd0,0) kernel (hd0,0)/vmlinuz boot=casper iso-scan/filename=/ubuntu-16.04 ...
- 【编程漫谈】PHP
PHP是个很古老的脚本技术了,当年CGI比较让人诟病,于是PHP横空出世.PHP即写即用特性,吸引了一大批粉丝,而且类似C语言的编程风格,让那些C程序员非常容易地转到这个平台上来.当然PHP刚出来的时 ...
- CSS中盒子模型
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Centos7 Devstack [Rocky] 重启后无法联网
部署devstack-rocky版本后网络,可以 Ping 通自己的 IP,但 Ping 不同网关,ping不通同网段主机,查看网卡和ovs信息如下 解决 第一步 按造网上教程,修改br-ex,ens ...
- 科学论文写作 Tips
感觉还是课程中给的英文描述会比较好,所以笔记大多数还是以老师的原英文 PPT 为主 1 Steps in the Writing Process 如何开展论文写作以及各个步骤的时间分配 1-1 Pre ...
- Debian系统设置terminal快捷键
我安装的是debian gnome桌面版.安装完成之后,没有快捷键可以方便的打开terminal,需要自己设置这个快捷键 方法是: 桌面上点击右键==>设置==>键盘 ==>快捷键= ...
- 重启sshd服务
查看状态: systemctl status sshd.service 启动服务: systemctl start sshd.service 重启服务: systemctl restart sshd. ...
- mysql双主架构
注意:最好不要用innodedb来同步数据库,要用databus来同步数据库,数据量大要用上mycat中间件 Mysql主主同步环境部署: centos 7.4 三台云主机: mysql1 :10.1 ...
- 04 npm 命令大全
一.npm简介 npm(Node Package Manager)是随同node.js 一起安装的包管理工具,为了解决nodejs代码部署上的很多问题,常用以下场景: 允许用户从npm服务器下载别 ...