你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】stm32l0xx时钟系统详解与代码配置

[复制链接]
STMCU小助手 发布时间:2021-11-16 00:13
时钟是嵌入式系统的脉搏,对嵌入式系统至关重要。处理器内核在时钟驱动下完成状态变换等动作,外设部件在时钟的驱动下完成各种工作,比如串口数据的发送、A/D转换、定时器计数等等。stm32l0xx系列低功耗新增MSI内部多频率可选时钟源,代码配置方面基于HAL库,与f系列相比存在一定的区别,本文以datasheet中的时钟树图为基础对时钟系统进行学习总结。时钟树如下图1所示:" p, |% c3 ~  V6 O0 Z' {$ x
5 g! Q) B$ w3 t) D+ O
20170111211434551.png

, }' n7 d4 @% I8 F/ L: @
3 c) M* Q( [3 }9 B6 V4 q1、LSI RC,低速内部时钟(RC振荡器),是看门狗(WatchdogLS)的唯一时钟来源,可以作为实时时钟RTC和主时钟输出(MCO)的时钟源。: R( R' |4 `2 \$ C

5 l7 S; Z) [. {/ l( v* S* k2、LSE OSC,外部低速时钟(晶振),输入输出引脚接OSC32_IN、OCS32_OUT可以作为实时时钟RTC和主时钟输出(MCO)的时钟源。精度高于内部低速时钟。7 {! @5 n; v& V1 O

7 l$ I2 g. f) u; {3 f& U3、MSI RC,全称为Multispeedinternal RC oscillator,是stm32lxx低功耗系列独有的时钟,可提供12种频率的时钟源,范围可以从100KHZ到48MHZ之间变化。可以直接选择为系统时钟和AHB时钟,也可以作为MCO的时钟源。MSI为低功耗模式提供了更多的选择,但是精度不高。官方提供的例程中多以MSI作为时钟源。! l) O1 y1 X8 H) F" z

% B1 |( o$ O. Q/ X/ |4、HSI,内部高速时钟(RC振荡器),可以直接选择为系统时钟,可以作为PLL(锁相环倍频输出)时钟源,经倍频后选择作为系统的System Clock(系统时钟)和AHB时钟。HSI还可以作为ADCCLK时钟源。
& P9 I! y0 F: h* D$ @% t
5 M8 R5 z/ @5 u3 ~+ p5、HSE,外部高速时钟(晶振),输入输出引脚接OSC_IN、OCS_OUT,可以直接选择为系统时钟,可以作为PLL源,经倍频后选择作为系统的(系统时钟)和AHB时钟。还可以作为MCO和RTC时钟源。
$ B  ~: K' f5 @' x/ Q) `; z+ r( \+ C# e
6、System Clock,系统时钟,是供STM32 中绝大部分部件工作的时钟源,是其他所有外设的时钟的来源。System Clock通过 AHB 分频器分频后送给各模块使用。System Clock还是CK_PWR和MCO的时钟源。
( M) g0 q! i5 Q( y. H  i. m4 U% `! n5 a
7、HCLK,高速外设时钟,是AHB总线时钟源,SystemClock经AHB预分频得到。供内存和 DMA 等使用。
& w( I- P0 Z# h; X/ J, `, E+ h* n4 l3 f2 [8 p/ D0 m- z
8、FCLK为自由振荡处理器时钟,用来保证在休眠是采样到中断和跟踪休眠事件,与HCLK时钟源相同。. t2 a$ K  ^4 A$ T  Z7 C9 |1 Q

! w) b/ e! V, R9、PCLK1,System Clock经AHB预分频后,送给 APB1 分频器,得出PCLK1,是APB1时钟源,供 APB1 外设使用。APB1上面连接的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3 等等。另一路送给TIMx使用,若APB1分频系数为1,则不倍频,否则倍频系数为2。
* X% D& U9 J: J" {( }8 ^$ {! p3 [
8 ^8 |9 Z6 O: @) s0 Y' s: ]9、PCLK2,System Clock经AHB预分频后,送给 APB2 分频器,得出PCLK2,是APB2时钟源,供 APB2外设使用,APB2 上面连接的是高速外设包括UART1、SPI1、Timer1、ADC1、ADC2、所有普通 IO 口(PA~PE)、第二功能 IO 口等。另一路送给TIMx使用,若APB2分频系数为1,则不倍频,否则倍频系数为2。: r4 Z9 D6 l2 ]9 Z9 W* g$ L4 ^4 H
- J* @; B& j0 G3 ^

. V% }: N/ l4 k! S7 u
# a& W& d4 j6 |5 Z! M+ Q时钟初始化代码配置,选用了HSE外部时钟,未进行倍频和分频:1 g4 k# n" s0 ~# w0 w8 G& r
! }% h- H# y& y6 C: h
  1. void SystemClock_Config(void)
    ) ]4 \7 V8 X" T: I
  2. {# w0 M# k, }' {, f* n

  3. ( M* R: h' _; z9 _4 d

  4. # _& u: y! T4 V7 b
  5.   RCC_OscInitTypeDef RCC_OscInitStruct;
    0 X2 v+ P4 @$ u5 _# N8 C4 U
  6.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
    + J# _& a: k5 m7 s3 a' A1 e: I

  7. # A$ _: o( W5 j# x

  8. / A2 J  ]- J( _% k1 @' ~. P- r
  9.     /**Configure the main internal regulator output voltage ; r! {9 R0 o: Q- r6 `" c
  10.     */
    " q, {; z5 j5 \% c4 l5 d+ N2 ?8 Z1 S
  11.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
    7 k# ~. B; W* i; O9 k4 L

  12. # |" G! @4 \% p' J* A$ A2 I. o

  13. , u/ `! e8 [+ E
  14.     /**Initializes the CPU, AHB and APB busses clocks * w; d5 O, Q! R2 l
  15.     */
    " P, {& J2 ^) I; _$ O
  16.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;. B) T: a1 H+ T: V0 k/ O
  17.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;" ~) i$ u: S) C* d) g
  18.   RCC_OscInitStruct.LSIState = RCC_LSI_ON;
    ; P/ }+ e% j+ Z$ {) i2 g$ `$ s* |
  19.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
    2 {$ L5 N, }: |3 X. k7 l+ o
  20.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    % g% v/ U+ q; }
  21.   {6 h9 b: O8 q' o' o4 ^4 ^) g1 L
  22.     Error_Handler();3 }$ ~: o! d! B! |1 |& Z) A2 n9 y
  23.   }8 B) e& _- U" `# S; F' W" N
  24. + Q1 s& N, ~- F' j1 z

  25. ' E/ c5 w) r: U
  26.     /**Initializes the CPU, AHB and APB busses clocks
    3 g' J  D7 |- Q+ L
  27.     */8 H* R; w. O! C. y5 B  w
  28.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK! m7 _2 r# a9 \+ q) W: c
  29.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;; @$ W! B' a) h& Y3 u7 l
  30.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;5 B' [% D* O+ f# E0 W7 U7 v
  31.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;% u7 Q5 w; K2 ~6 U8 O
  32.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;7 f+ m$ q" r+ Y
  33.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;$ P: ^3 _: M, Y" C, ~, h! [; ~
  34. 1 i" f9 D$ D! n# O5 Q

  35. " H% v4 _  T$ b$ X' F% ^
  36.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
    ( T2 N7 c) o3 ?6 G$ X/ L8 C
  37.   {3 F0 o8 a3 @0 d7 t: S) n
  38.     Error_Handler();
    2 g7 N5 l/ i" ^5 Y1 S; ]* V& s
  39.   }
    1 R" t. Q/ `, t+ g5 J$ G+ M
  40. # }, A: `& N8 [' W# F/ l8 J
  41. $ Z) {" Q/ ?/ d0 ~/ z( M
  42.     /**Configure the Systick interrupt time
    9 d! k& W  \6 n
  43.     */
    0 @9 u* e$ \, w- S( P
  44.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);2 }: g0 Y) f& i, r, r

  45. ' [, w& r. h3 g( Z! O5 S3 d
  46. 2 o3 l) o' r( k, {& f
  47.     /**Configure the Systick ' U6 K- Q6 f2 B. z
  48.     */
    8 C* w6 j$ q; X- |& X! L
  49.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
    ' m/ o' B3 I2 D1 ]% Z) Q8 }* C
  50. ' F; W1 ^. K& B# T6 M) g

  51. : v% e- r6 ~1 \$ z0 I5 i- ]0 W
  52.   /* SysTick_IRQn interrupt configuration */
    & f1 t/ m$ G. w: `0 W, l
  53.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);2 M* y2 l; a: U1 o% [3 u: ?$ ]( z+ m8 G
  54. }
    1 f0 w& A" G) Q* I8 C, x
  55. 9 s4 r7 S: A4 h" U8 F
复制代码

& f/ p" {6 E+ p; b& F' ^( U# A
  S8 w0 t7 H( C; v+ w
收藏 评论0 发布时间:2021-11-16 00:13

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版