STM32F205时钟配置
转载:https://www.cnblogs.com/wen2376/p/4468319.html
下图是STM32F2系列的时钟树结构图:
1、内部高速时钟HSI、外部高速时钟HSE和PLL时钟PLLCLK时钟都接到了SW开关处,通过SW选择哪一路作为SYSCLK,SYSCLK经过AHB分频器进行分频得到HCLK,APB1和APB2是挂在总线AHB上的,通过APB1和APB2分频得出fpclk1和fpclk2。
2、PLL输入时钟源主要是靠外部高速时钟和内部高速时钟作为时钟源,通过PLLCFGR寄存器的bit22来选择具体哪一路作为时钟源。选择好了时钟源进入/M分频器,也就是PLLM进行分频,送入VCO,在通过xN,进行倍频,也就是PLLN:(1)通过/P进行分频(PLLP)得到PLLCLK;(2)通过/Q分频(PLLQ),得到PLL48CK。
然后边看代码边对照结构图进行分析,看软件如何给单片机配置系统时钟的。
然后找到启动代码“startup_stmf32xx.s”,该代码是用汇编写的,可以看到,在调用main函数之前,是先调用了SystemInit函数的,该函数是在“system_stm32f2xx.c”中
复制代码
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
复制代码
代码如下,变量直接赋个16进制的数,都不知道是啥意思,目的是干什么的,不知道,所以看下面代码时最好对照STM32F2x用户手册。当然这个只是一个初始化,待会主要看SetSysClock();这个函数,在调用该函数之前,我们知道单片机是先启用了内部高速时钟等一些配置。
复制代码
void SystemInit(void)
{
/* Reset the RCC clock configuration to the default reset state ------------/
/ Set HSION bit */
RCC->CR |= (uint32_t)0x00000001; //RCC_CR复位值0x0000_xx83,内部高速时钟使能,也就是说上电开始就使用内部高速时钟,16MHZ
/* Reset CFGR register */
RCC->CFGR = 0x00000000; //通过开关SW选择内部高速时钟作为系统时钟16MHZ
//AHB prescaler 不分频
//APB Low speed prescaler (APB1) 不分频,fplck1 = 16MHZ
//APB high-speed prescaler (APB2)不分频,fplck2 = 16MHZ
//MCO1和MCO2时钟输出等配置可参考用户手册Page95
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset PLLCFGR register */
RCC->PLLCFGR = 0x24003010; //RCC_CFGR复位值是0x2400_3010
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF; //对bit18 HSEBYP 设置为0,外部高速时钟被禁止
/* Disable all interrupts */
RCC->CIR = 0x00000000; //所有时钟中断都被禁止
#ifdef DATA_IN_ExtSRAM
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM */
/* Configure the System clock source, PLL Multiplier and Divider factors,
AHB/APBx prescalers and Flash settings ----------------------------------*/
SetSysClock();
/* Configure the Vector Table location add offset address ------------------/
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; / Vector Table Relocation in Internal SRAM /
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; / Vector Table Relocation in Internal FLASH */
#endif
}
复制代码
在SystemInit(void)函数中在配置完一些参数后,还调用了SetSysClock()函数,该函数代码如下
复制代码
static void SetSysClock(void)
{
/*****************************************************************************/
/ PLL (clocked by HSE) used as System clock source /
/*****************************************************************************/
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON); //外部高速时钟使能,25MHZ
/* Wait till HSE is ready and if Time out is reached exit */ //外部时钟使能后,得需要一点时间到达各个端口
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY; //如果RCC_CR_HSERDY为0,说明外部时钟还没准备好,1说明外部时钟已准备好
StartUpCounter++;//对读的次数进行累加,当累加次数到达1280次时,就意味着启动时间超时
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
if ((RCC->CR & RCC_CR_HSERDY) != RESET)//这里判断上面的do while循环是因哪个条件结束的
{
HSEStatus = (uint32_t)0x01; //说明时钟已准备好了,才结束do whlie循环
}
else
{
HSEStatus = (uint32_t)0x00; //说明是因为超时了而退出do while循环
}
if (HSEStatus == (uint32_t)0x01)
{
/* HCLK = SYSCLK / 1*/
RCC->CFGR |= RCC_CFGR_HPRE_DIV1; //AHB不分频,AHB出来后时钟就是sysclk=120M
/* PCLK2 = HCLK / 2*/
RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;//APB2 2分频,fpclk2 = sysclk/2 = 60M/* PCLK1 = HCLK / 4*/
RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; //APB1 4分频,fplck1 = sysclk/4 = 30M/* Configure the main PLL */ //主要对PLL和PPI2S 进行配置
RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
//配置完后RCC->PLLCFGR = 0x05403c19,然后对照寄存器RCC_PLLCFGR查看哪些位对应哪些功能
//通过bit5~bit0可计算出PLLM=25,那么input VCO = PLL input clock /PLLM = 25M/25 = 1M,对应时钟结构图中的/M
//通过bit14~bit6可计算出倍频因子PLLN = 240,那么VCO output clock = PLLN * input VCO = 240 * 1 = 240M,对应时钟结构图中的xN
//bit17~bit16可计算出分频因子PLLP = 2,那么PLLCLK = VCO output clock /PLLP = 240/2 = 120M
//bit22是选择给PLL输入的时钟源,输入时钟源有外部和内部高速时钟,这里选择的是外部高速时钟即PLL input clock = HSE =25M
//bit27~24可计算出分频因子PLLQ = 5,那么PLL48CK = VCO output clock/PLLQ = 240/5 = 48M
/* Enable the main PLL */
RCC->CR |= RCC_CR_PLLON; //使能PLL/* Wait till the main PLL is ready */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}//到这里RCC->CR已配置完,最终值0x03036783//通过查看用户手册知道,内部高速时钟、外部高速时钟、PLL时钟都已开启/* Configure Flash prefetch, Instruction cache, Data cache and wait state */
FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_3WS;/* Select the main PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= RCC_CFGR_SW_PLL;//到这里RCC->CFGR已配置完,最终值是0x0000_940A//通过查看用户手册,知道,PLL时钟作为系统时钟即120M//AHB不分频,即HCLK = 120M//APB1 4分频,即fpclk1 = 120/4=30M//APB2 2分频,即fpclk2 = 120/2=60M/* Wait till the main PLL is used as system clock source */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
{
}
}
else
{ /* If HSE fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */
}
}
复制代码
OK,分析完这段代码后,调用系统固件函数后,现在知道了时钟树结构图中右边出来的时钟是多少MHz了吧。
总结:
1、使用的是外部时钟25MHZ,通过PLL进行分频倍频分频得到PLLCLK 120M,PLLCLK作为系统时钟SYSCLK。
2、APB1出来是30M,也就是FPCLK1。
3、APB2出来是60M,也就是FPCLK2。
STM32F205时钟配置相关推荐
- STM32的时钟配置随笔
以前使用STM32都是使用库函数开发,最近心血来潮想要使用寄存器来试试手感,于是乎便在工作之余研究了一下STM32F4的时钟配置,在此将经历过程写下来作为锻炼,同时也供和我一样的新手参考,如有错误或者 ...
- 华大单片机HC32L136J8TA读取DS18B20温度(源码+时钟配置)
免费的C语言和linuxPDF文档:传送门 有一点C语言基础和华大单片机开发经验,应该就能看得懂就不多介绍了,有疑问可以留言,看到就回了; 关于协议具体解析:传送门@不脱发的程序猿 注(2021-05 ...
- STM32的时钟配置——时钟树解析
此文章由于讲得较详细因此篇幅较长,请带着一点耐心去读,相信会有收获! 目录 STM32为什么要有复杂的时钟系统 详解STM32时钟系统 STM32有几个时钟源 关于时钟输出 软件配置时钟 STM32为 ...
- NXP(I.MX6uLL)DDR3实验——DDR3重要时间参数、时钟配置与原理图简析
目录 DDR3 内存时间参数 传输速率 tRCD 参数 CL 参数 AL 参数 tRC 参数 tRAS 参数 I.MX6U MMDC内存控制器简介 MMDC内存控制器简介 MMDC内存控制器信号引脚 ...
- STM32 RCC时钟配置
STM32 RCC时钟配置 时钟源 外部高速晶振HSE,通常是8MHz. 内部高速晶振HSI,8MHz. 外部低速晶振LSE,32.768KHz. 内部低速晶振LSI,40KHz. 时钟源选择 通常使 ...
- stm32时钟配置总结
stm32时钟配置时钟源: 1,HSE(高速外部时钟)即常见的外接8M晶振方案: 2,HSI(高速内部时钟) 即8M内部振荡时钟方案: 3,LSE(低速外部时钟)即常见的32.768Khz晶振方案: ...
- 火牛单片机rtc时钟配置_怎么用STM32F103RTC进行时钟的配置
#include "sys.h" #include "delay.h" #include "usart.h" #include " ...
- DSP28377s系统时钟配置注意事项
DSP28377s系统时钟配置注意事项 问题一脸嫣然的向我们走来... 近日,一个兄弟在配置基于28377s芯片的主控系统时钟时,遇到点困难. 具体是这样的,原来的主控板使用的是20MHz外部晶振,为 ...
- 如何修改IMX6UL开发板时钟配置?
启扬i.MX6UL开发板时钟由24Mhz与32.768Khz晶振提供,这里不具体介绍NXP公司整体的时钟规划,只从软件API接口方面去分析如何去修改一个外设的时钟. 接下来的讲解将以CAN总线的时钟为 ...
- s32k144 isystem linux,S32K144之时钟配置
一般来说,时钟精度.稳定性取决于所采用的时钟源,就MCU S32K来说如内部振荡器SIRC,FIRC,128KLPO,外部晶振等,跟所使用的外设(FTM, LPIT,LPT,RTC等)和哪一路输出时钟 ...
最新文章
- 最喜欢的 jQuery 插件
- 最重要的事情只有一件
- 深入理解Blocks,Procs和lambdas
- 1.RTMP流媒体服务器搭建
- Linux+GitLab+Jenkins实现项目的持续集成
- 苹果手机黑屏了怎么办_来电话手机黑屏怎么办
- 为特定的提交生成一个git补丁
- Multiavatar 多元文化头像生成器
- C#实现不安装Oracle客户端访问远程服务器数据
- TransE算法详解
- 【关于USB转485串口的一点认识/疑问】
- Windows错误“ 0xc0000005”
- Azure部署的应用程序访问页面页面时加载字体文件(.woff.woff2)出现 404 错误问题
- 第二十四讲 一阶常微分方程组
- 企业邮箱注册—企业微信邮箱2.0时代正式来临
- HFSS同轴馈电矩形贴片天线馈电点以及尺寸的计算
- 谁发明了验证码?你出来 保证不打死你
- 多个PDF合并成一个PDF
- 骁龙8+gen1和天玑9000+区别 骁龙8+和天玑9000+评测选哪个好
- K均值(kmeans)分类