完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1、时钟系统介绍
▲时钟系统专业名词缩写 时钟系统关键组成部分 01 内部高速时钟(HSI) HSI时钟信号可以通过内部16MHZ的RC振荡器产生,可以直接用于系统时钟或者用于PLL输入。 HSI的RC振荡器的优势是:在最小成本(没有外部器件)情况下提供一个时钟源。它的启动速度要比HSE晶体振荡器更快,但是即使校准频率后,它的精度仍然小于外部晶体振荡器或陶瓷谐振器。 02 外部高速时钟(HSE) 外部高速时钟信息(HSE)可以通过两个时钟源产生: ① 外部晶体/陶瓷谐振器 ② 外部用户时钟 ▲两种时钟源接入示意图 03 主锁相环时钟(PLL) STM32F2xx具有两个PLL ① 主要的PLL通过HSE或HSI提供时钟,并且有两个输出时钟; ② 专用的PLL(PLLI2S)被用于产生一个精确的时钟去实现高质量音频效果在I2S接口; HSE/M*N/P得到PLL时钟 关于PLL锁相环说明 从1处输入,3处输出是1的N倍。 3处除以N又作为输入,当1和2的频率一样,就锁定了。(之所以图上是xN,因为从2看向3的) 04 低速外部时钟(LSE) LSE是一个32.768KHZ低速外部晶振或陶瓷谐振器。 它的优点:提供低速但是高精度时钟给RTC外设,为时钟/日历或其他时间应用。 05低速内部时钟(LSI) LSI RC作为一个低速时钟源,它可以运行在停止和待机模式中给独立看门狗(IWDG)和自动唤醒(AWU)。它的时钟频率在32MHZ左右。 2、代码分析 时钟初始化代码在system_stm32f2xx.c文件中,大部分时候我们不需要修改时钟代码的,各个总线的频率我们可以在文件头看到。 ============================================================================= *============================================================================= * Supported STM32F2xx device revision | Rev B and Y *----------------------------------------------------------------------------- * System Clock source | PLL (HSE) *----------------------------------------------------------------------------- * SYSCLK(Hz) | 120000000 *----------------------------------------------------------------------------- * HCLK(Hz) | 120000000 *----------------------------------------------------------------------------- * AHB Prescaler | 1 *----------------------------------------------------------------------------- * APB1 Prescaler | 4 *----------------------------------------------------------------------------- * APB2 Prescaler | 2 *----------------------------------------------------------------------------- * HSE Frequency(Hz) | 25000000 *----------------------------------------------------------------------------- * PLL_M | 25 *----------------------------------------------------------------------------- * PLL_N | 240 *----------------------------------------------------------------------------- * PLL_P | 2 *----------------------------------------------------------------------------- * PLL_Q | 5 *----------------------------------------------------------------------------- * PLLI2S_N | NA *----------------------------------------------------------------------------- * PLLI2S_R | NA *----------------------------------------------------------------------------- * I2S input clock | NA *----------------------------------------------------------------------------- * VDD(V) | 3.3 *----------------------------------------------------------------------------- * Flash Latency(WS) | 3 *----------------------------------------------------------------------------- * Prefetch Buffer | ON *----------------------------------------------------------------------------- * Instruction cache | ON *----------------------------------------------------------------------------- * Data cache | ON *----------------------------------------------------------------------------- * Require 48MHz for USB OTG FS, | Enabled * SDIO and RNG clock | *----------------------------------------------------------------------------- *============================================================================= ****************************************************************************** 在文件开始定义的有系统时钟频率的全局变量SystemCoreClock,其他地方需要时钟频率,可以直接使用该变量。 uint32_t SystemCoreClock = 120000000; 时钟配置从SystemInit函数执行,调用SystemInit的在汇编文件中startup_stm32f2xx.s(Keil编译环境)。 IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP 在这里说明一下文档版本的问题: ▲STM32F20X_User_manual的V7版和V8版对比图 上述两图的区别是系统最大时钟从120MHZ变成了168MHZ,我的理解是同样是STM32F20X,ST由于技术进步或其他,使得新版STM32F207芯片超频支持168MHZ。 下面我们主要分析SystemCoreClock的120M时钟怎么从一个外部25MHZ的HSE得到的。 我们要从25MHZ的外部时钟得到120M的系统时钟,需要上图中标注的重要4点: 1、使能HSE 2、选择HSE作为主PLL的输入时钟 3、主PLL倍频后得到120MHZ时钟 4、系统时钟选择主PLL时钟输出作为系统时钟 我们找到对应的代码 1、使能HSE /* Enable HSE */RCC-》CR |= ((uint32_t)RCC_CR_HSEON); 在RCC_CR寄存器(RCCclock control register RCC时钟控制器)中,有打开HSE的控制位 2、选择HSE作为主PLL的输入时钟 /* Configure the main PLL */RCC-》PLLCFGR = PLL_M | (PLL_N 《《 6) | (((PLL_P 》》 1) -1) 《《 16) | (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q 《《 24); RCC_PLLCFGR_PLLSRC_HSE就是配置HSE作为主PLL的输入时钟 3、主PLL倍频后得到120MHZ时钟 /* Configure the main PLL */RCC-》PLLCFGR = PLL_M | (PLL_N 《《 6) | (((PLL_P 》》 1) -1) 《《 16) | (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q 《《 24); 4、配置主PLL作为系统时钟的输入时钟 /* Select the main PLL as system clock source */RCC-》CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC-》CFGR |= RCC_CFGR_SW_PL 对于主PLL的配置寄存器,在RCC_PLLCFGR寄存器中有说明 整理后得知f(out)=f(in)* N / M / P /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */#define PLL_M 25#define PLL_N 240/* SYSCLK = PLL_VCO / PLL_P */#define PLL_P 2 这样就获得了120M时钟 注意: PLL_M大于等于2且小于等于63 PLL_N大于等于64且小于等于432 PLL_P只能是2、4、6、或8 但2对应0,4对应1,6对应2,8对应3。 ST并没有使用if或case语句判断,因为对应的数据除以2减去1就是寄存器这两位的值,所以可以按照下面这样写,这种写法值得我们学习。 (((PLL_P 》》 1) -1) 《《 16) 其他外设的时钟配置时 /* HCLK = SYSCLK / 1*/RCC-》CFGR |= RCC_CFGR_HPRE_DIV1;/* PCLK2 = HCLK / 2*/RCC-》CFGR |= RCC_CFGR_PPRE2_DIV2;/* PCLK1 = HCLK / 4*/RCC-》CFGR |= RCC_CFGR_PPRE1_DIV4; 03、备 注 时钟中断 可以配置外部晶振出错时的中断,还有RCC中断,因此我们可以在外部时钟出问题时,切换为内部时钟,不至于整个系统挂掉。具体见ST给的官方代码。 无源晶振不起振 没有程序,无源晶振是不起振的,需要配置RCC时钟控制寄存器的HSEON位打开或关闭HSE振荡器。具体可以看之前的文章《晶振原理解析》。 关于APB和PCLK F207是时钟图没有显示PCLK1和PCLK2,应该就是APB1和APB2 应该指的是一个PCLK应该是PeripheralClock的简称,看F105手册 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1777 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1080 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1678 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
595浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
554浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 07:39 , Processed in 1.259198 second(s), Total 44, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号