|
时钟,也就是给芯片提供节拍的东西,芯片各个组件根据时钟节拍执行着各自的工作,并且根据时钟节拍进行相互合作。其实说白了就像干活时喊的号子一样,“一二一二......”大家根据号子声一起使劲,相互合作。 STM32的时钟不像8051的那么简单,但是也不像飞思卡尔芯片的那么复杂。总体来说STM32的时钟树走向清晰。 : l) R9 F4 E8 n1 d( M5 u接下来我将按照从前到后的顺序进行讲解: ( X8 M& Z- u" ^l 首先我们追根溯源,看看STM32的时钟源,STM32一共有4个时钟源,分别是: ' P# c3 c2 q9 s: r+ z1 kØ LSI内部低速时钟 Ø HSI内部高速时钟 Ø LSE外部低速时钟 Q0 L, U5 c* z5 V/ w0 {Ø HSE外部高速时钟 但是只有HSE和HSI能够用来作为内核时钟源,另外两个时钟源只能够用来给实时时钟和看门狗提供时钟。 在本例程中选用外部高速时钟作为时钟源,因此需要置位RCC_CR[HSEON]来打开HSE时钟,除此之外还有一个标志位RCC_CR[HSERDY]用来指示HSE是否准备好。% x( q: d& |% ^; G ) D6 `7 I# @! Y7 [ RCC->CR |= ((uint32_t)RCC_CR_HSEON); /* 使能 HSE */ do { N& T8 x3 t: l! k" oHSEStatus = RCC->CR & RCC_CR_HSERDY; }while (HSEStatus==0); /* 等待外部时钟稳定 */ 8 s7 Y% s% U4 W7 G3 l' D' O& N l 接下来我们可以看到一个多路选择器,它的作用是用来选择内核时钟源,STM32一共有3个时钟可以用来驱动内核(SYSCLK): Ø HSI内部高速时钟 : b8 q1 y; W, j! nØ HSE外部高速时钟 Ø PLL时钟 - @( @$ H" D" l& i2 Z- A它们通过RCC_CFGR[SW]位进行选择,除此之外同样还有一个标志位RCC_CFGR[SWS]用于标志选择成功与否。 很显然,使用HIS和HSE直接作为内核时钟源是不切实际的,频率太低,因此需要选用PLL时钟。 , ^) W" P, o M: w5 J RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));* `) L) ^, w# | X RCC->CFGR |= RCC_CFGR_SW_PLL; /* 选择PLL时钟作为系统时钟 */0 y" \( F6 u: j0 Z while ((RCC->CFGR & RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL); /* 等待PLL作为系统时钟完成 */ ! _/ W9 d7 Q: X; y# |9 r) @) b4 | l 上面我们提到直接使用晶体时钟作为内核时钟源是不太切合实际的,需要使用PLL时钟作为时钟源。那么PLL时钟是怎么来的呢?我们看时钟树图,PLL时钟是从一个叫PLL的模块中得到的。% K$ r' Y: T! T, w PLL的时钟又是哪里来的呢?我们接着往前看,可以看到PLL的时钟是由HSE和HIS时钟分频得到的(分频因子为M),HSE和HIS通过一个多路选择器进行选择,多路选择器通过RCC_PLLCFGR[PLLSRC]进行选择的。5 {) w ]: D8 F" G) f: p& b 说了这么长时间的PLL,PLL到底是啥呢,PLL中文名叫锁相环,英文名叫Phase Locking Loop。其实我们在使用中并不用关心其原理,只需要知道它是将频率倍频、分频至我们需要的频率的一个东西。 接下来我们剖析一下PLL模块,可以看到有VCO、xN、/P、/Q、/R等标志。VCO的全称是电压控制振荡器,xN就是VCO的倍频因子,/P、/Q、/R分别是输出的分频因子。其中/P的输出就是PLLCLK,也就是我们需要的时钟。 在本例程中倍频、分频因子的数值分别是: Ø /M = 4 Ø xN = 360* ^& o/ ~; \5 h9 D# } Ø /P = 4 Ø /Q = 15 HSE时钟,也就是外部晶振时钟,STM32F429 Discovery board板载晶振为8MHz。 经过/M分频,8/4=2MHz( H t( F, v% V* C2 ?1 J: X 经过xN倍频,2*360 = 720MHz. K/ y U! ~* V! Z1 l* o1 f D 经过/P分频,720/4 = 180MHz 经过/Q分频,720/15 = 48MHz: Q' k/ X! W1 `" ?6 \ 6 p2 {, |+ G. r5 l1 F RCC-> LLCFGR = 0;! u/ C. g/ j8 C& vRCC-> LLCFGR |= ( PLL_M) | 4 K$ |4 {- e8 M8 h2 n4 @6 C( PLL_N > 1) -1) CR & RCC_CR_PLLRDY) == 0); /* 等待PLL稳定 */+ l; H8 y; l! c5 X- H( g1 \ 在这里想提醒注意一下“((PLL_P >> 1) -1) APB1ENR |= RCC_APB1ENR_PWREN; </strong> PWR->CR |= PWR_CR_VOS;0 q. u; ]: U1 P3 G6 f1 b g while((PWR->CSR & PWR_CSR_VOSRDY) == 0);% l0 \: ?! {/ `- U& U/ H, m PWR->CR |= PWR_CR_ODEN; /* 超级驱动使能 */ while((PWR->CSR & PWR_CSR_ODRDY) == 0); /* 等待稳定 */ PWR->CR |= PWR_CR_ODSWEN; /* 超级驱动切换使能 */ while((PWR->CSR & PWR_CSR_ODSWRDY) == 0); /* 等待稳定 */$ @2 N7 ], l* w3 `9 [ " n: b$ d2 D# j
Flash的访问速度较内核运算速度要低很多,因此需要设置一个等待周期以保证Flash与内核的同步。 8 R+ \: w7 K* k$ I" B FLASH->ACR = FLASH_ACR_PRFTEN | /* 预取指使能 */ FLASH_ACR_ICEN | /* 指令高速缓冲使能 */% t7 `: ~9 E# d) [8 j FLASH_ACR_DCEN | /* 数据高速缓冲使能 */" t7 x i8 {% E0 R7 P) e FLASH_ACR_LATENCY_5WS; /* 等待5个CPU时钟 */ 设置AHB、APB1、APB2的分频因子,以匹配外设访问速度: RCC->CFGR |= RCC_CFGR_HPRE_DIV1; /* AHB =SYSCLK */ RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; /* APB2=SYSCLK 2分频 */& i5 d. t) ]1 O; M# |) V% C' v RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; /* APB1=SYSCLK 4分频 */$ \. a, b7 u9 c4 r( ` * ^% p/ {% ^7 Q+ y \ 到此,STM32F429的基础时钟配置基本上是完成了,有了以上配置,单片机的基础外设都能够运行,高级外设时钟需要另行配置。& j4 \0 U& v1 T6 T 最后曝两张高清照片,请诸君品鉴: 2 j1 [$ F9 m$ G L7 q% j' W
|
STM32F429 Discovery Kit Demo.rar
下载123.66 KB, 下载次数: 368
【福利三:雨露均沾·逢7狂欢】之四:用一个定时器同步另外两个定时器输出PWM
【逢7发帖赢大礼】STM32开发之WIFI实时时钟
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
【逢7发帖赢大礼】STM32开发之人体实时运动信息监测!
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
【逢7发帖赢大礼】全网最简单的Arduino_STM32开发环境搭建教程!
STM32F4中文用户手册
STM32F400、STM32F402 Cortex-M4超值单片机
SPI 高温读错最后一位?STM32F42xx 官方根治方案
微信公众号
手机版
回复:【STM32F429开发日志】(二):STM32F429之时钟配置(另曝高清照片)
我也想知道,找了好久