STMCU小助手
发布时间:2022-3-24 23:43
|
1什么是时钟 D/ [3 ^2 O/ x8 |- w N+ V 时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定cpu速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令,才能够做其他的处理 (点灯,串口,ADC),时钟的重要性不言而喻。* N0 N6 H& h' b+ Q% T% I, \ & @) Y7 \3 K! m5 |! p2 x2 j9 h: k8 F' A 为什么 STM32 要有多个时钟源呢?+ J* L6 r5 U6 b8 z STM32本身十分复杂,外设非常多 但我们实际使用的时候只会用到有限的几个外设,使用任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费 并且,同一个电路,时钟越快功耗越快,同时抗电磁干扰能力也就越弱,所以较为复杂的MCU都是采用多时钟源的方法来解决这些问题。所以便有了STM32的时钟系统和时钟树4 ~& X3 o6 b8 p$ V- d8 g" [% ]5 n$ S 总括: 1.STM32时钟系统主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的耗能。 2.系统时钟,是处理器运行时间基准(每一条机器指令一个时钟周期)) r# K: |$ ~# Q7 q 3.时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。# g5 ?" L4 F9 S1 M! E9 v2 i) b 4.一个单片机内提供多个不同的系统时钟,可以适应更多的应用场合。- O( G* U6 e! k. Y! @; D 5.不同的功能模块会有不同的时钟上限,因此提供不同的时钟,也能在一个单片机内放置更多的功能模块。 对不同模块的时钟增加开启和关闭功能,可以降低单片机的功耗5 E$ T9 c u# Z$ N: f. ?9 \7 M 6.STM32为了低功耗,他将所有的外设时钟都设置为disable(不使能),用到什么外设,只要打开对应外设的时钟就可以, 其他的没用到的可以还是disable(不使能),这样耗能就会减少。 这就是为什么不管你配置什么功能都需要先打开对应的时钟的原因3 X& |, G' K. p+ j # u+ i, n/ @4 t STM32的时钟系统框图/ ?( M- n; K, m, F! M$ H; B, Q7 E
: G! Q5 M" F' l! E# g3 ^ 乍一看很吓人,但其实很好理解,我们看系统时钟SYSCLK 的左边 系统时钟有很多种选择,而左边的部分就是设置系统时钟使用那个时钟源, 系统时钟SYSCLK 的右边,则是系统时钟通过AHB预分频器,给相对应的外设设置相对应的时钟频率9 C( ~" u/ L* I5 q1 k - h; X& B/ D& b6 G- L9 t2 k+ x 从左到右可以简单理解为 各个时钟源--->系统时钟来源的设置--->各个外设时钟的设置 时钟系统 1各个时钟源 (左边的部分). D/ |* g+ ?! z STM32 有4个独立时钟源:HSI、HSE、LSI、LSE。- p' b- [, F4 d ①、HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。$ E1 F, c. T; `" ~/ a ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。, w! e! z' i/ }) y4 ]* P0 v ③、LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。 7 y/ w; j) i+ q" p, ] ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ; m0 p3 E9 T6 {6 h1 R- r) J/ h0 d 其中LSI是作为IWDGCLK(独立看门狗)时钟源和RTC时钟源 而独立使用 * \7 p9 h7 g2 E 而HSI高速内部时钟 HSE高速外部时钟 PLL锁相环时钟 这三个经过分频或者倍频 作为系统时钟来使用 PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 通过倍频之后作为系统时钟的时钟源 举个例子:Keil编写程序是默认的时钟为72Mhz,其实是这么来的:外部晶振(HSE)提供的8MHz(与电路板上的晶振的相关)通过PLLXTPRE分频器后,进入PLLSRC选择开关,进而通过PLLMUL锁相环进行倍频(x9)后,为系统提供72MHz的系统时钟(SYSCLK)。之后是AHB预分频器对时钟信号进行分频,然后为低速外设提供时钟。 " T. ~2 W* d* M 或者内部RC振荡器(HSI) 为8MHz /2 为4MHz 进入PLLSRC选择开关,通过PLLMUL锁相环进行倍频(x18)后 为72MHz PS: 网上有很多人说是5个时钟源,这种说法有点问题,学习之后就会发现PLL并不是自己产生的时钟源,而是通过其他三个时钟源倍频得到的时钟 ' P$ x* A3 p1 e3 j i Z" b* Q 2系统时钟SYSCLK 系统时钟SYSCLK可来源于三个时钟源: ①、HSI振荡器时钟 ②、HSE振荡器时钟 ③、PLL时钟 最大为72Mhz( J W7 w- B# \$ A3 u3 D8 W
3USB时钟
' A# L5 z- r& \9 `- w# [ STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取(唯一的),,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz) X2 Z3 j# r+ q1 ]7 ] 9 T2 S" a6 D: _$ i+ A 4把时钟信号输出到外部1 w8 j; n' ?/ S5 j* t( ? r% n# | 5 U3 ~$ O3 |5 \5 x; W' k, W. ~
STM32可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。可以把时钟信号输出供外部使用4 e1 }4 u/ Y$ {& h2 W5 t / R! V9 B, p1 z/ F! C$ h 5系统时钟通过AHB分频器给外设提供时钟(右边的部分) 重点' _" O) l- j, A9 A , Z$ J) \! z8 H1 l3 s$ C 从左到右可以简单理解为 系统时钟--->AHB分频器--->各个外设分频倍频器 ---> 外设时钟的设置 右边部分为:系统时钟SYSCLK通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用: . F) X/ D) e- R% ]& ?" b+ M + D" @' L6 t/ k, K9 _ ①内核总线:送给AHB总线、内核、内存和DMA使用的HCLK时钟。 ②Tick定时器:通过8分频后送给Cortex的系统定时器时钟。 ③I2S总线:直接送给Cortex的空闲运行时钟FCLK。 : V4 k3 J9 `1 c9 S ④APB1外设:送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给通用定时器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2-7使用。 9 p$ m/ y1 f3 q2 R/ d* |: c ⑤APB2外设:送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给高级定时器。该倍频器可选择1或者2倍频,时钟输出供定时器1和定时器8使用。 $ k8 \7 @7 v% q4 Q! J- P0 Z$ x 另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。 . p# p, j2 V8 w1 x 需要注意的是,如果 APB 预分频器分频系数是 1,则定时器时钟频率 (TIMxCLK) 为 PCLKx。否则,定 时器时钟频率将为 APB 域的频率的两倍:TIMxCLK = 2xPCLKx。 : u9 g/ k/ Z, _" o5 r3 U APB1和APB2的对应外设 F1系列
APB1上面连接的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、I2C2、USART2、USART3、UART4、UART5、SPI2、SP3等;* G# {; N" Q! x' C f 9 B# _; [. E; h) f! p; H 而APB2上面连接的是高速外设,包括UART1、SPI1、Timer1、ADC1、ADC2、ADC3、所有的普通I/O口(PA-PE)、第二功能I/O(AFIO)口等。 F4系列
6 D4 X. W. C! ]" ^ 这个和F1系列类似,我们就举几个特殊的1 D+ i0 Q+ ^3 V+ l% h+ t 9 ?# ?# l2 {" n; c$ O- V: l& H APB2总线:高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11 UTART1,USART6' E5 B, ^( H5 l& i$ b7 s/ r. T2 O' w6 T 9 b2 I# G% S* `- a* n! F8 J0 m; X3 J APB1总线:通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7 UTART2~UTART5 F4系列的系统时钟频率最高能到168M4 ] u% x" Y3 w5 x ! T9 {8 x) q& H+ K/ m2 Q 具体 可以在 stm32f10x_rcc.h 和stm32f40x_rcc.h 中查看 , \* A, p! U5 U6 l! i! s 或者通过 STM32参考手册搜索“系统架构”或者“系统结构” 查看外设挂在哪个时钟下, RCC相关寄存器: 这里我们以F1系列为例4 b( o! N4 n$ R* S( N9 T9 }
可以对上上面的时钟框图和RCC寄存器来学习,对STM32的时钟系统有个大概的了解 其实也就是我们上面介绍的流程,理解了自然也就能写出来) u+ G" v' |% E; V! `+ G0 v RCC初始化: 这里我们使用HSE(外部时钟),正常使用的时候也都是使用外部时钟$ X* u. Y& M6 G5 E- q* b 使用HSE时钟,程序设置时钟参数流程: K+ r7 p1 e# n. K' T" g 1、将RCC寄存器重新设置为默认值 RCC_DeInit;8 U# ~/ Y. b; |3 L$ d/ b 2、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);* C, p6 I& q, `/ Y0 ]: s 3、等待外部高速时钟晶振工作 HSEStartUpStatus = RCC_WaitForHSEStartUp();& o2 Q) F9 t6 ^) P 4、设置AHB时钟 RCC_HCLKConfig;. D# \3 A* J. d6 A( T0 t 5、设置高速AHB时钟 RCC_PCLK2Config;# D1 @ W- ]0 O4 ? V) l2 S 6、设置低速速AHB时钟 RCC_PCLK1Config;- i- w/ S Q E% h 7、设置PLL RCC_PLLConfig; 8、打开PLL RCC_PLLCmd(ENABLE); 9、等待PLL工作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) 10、设置系统时钟 RCC_SYSCLKConfig;0 \4 z7 A4 H7 x1 h& y7 Q, H 11、判断是否PLL是系统时钟 while(RCC_GetSYSCLKSource() != 0x08) 12、打开要使用的外设时钟 RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd() 代码实现: 对RCC的配置函数(使用外部8MHz晶振) * \* q4 E3 Y" n2 `" R4 T1 L- F 系统时钟72MHz,APH 72MHz,APB2 72MHz,APB1 32MHz,USB 48MHz TIMCLK=72M
也就是我们时钟树框图从左到右的配置,! L: [8 _9 o) ]* N6 v4 K + E* N* x/ n! @ 时钟监视系统(CSS)
m- k. Q& c! B9 j, ~4 a STM32还提供了一个时钟监视系统(CSS),用于监视高速外部时钟(HSE)的工作状态。倘若HSE失效,会自动切换(高速内部时钟)HSI作为系统时钟的输入,保证系统的正常运行。 Q8 `* e; t1 T9 V * w8 S, Z5 Q1 h" w |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版