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

【经验分享】STM32 时钟配置与使用

[复制链接]
STMCU小助手 发布时间:2022-1-25 17:00
0、前言
RCC-复位和时钟控制器
可以实现配置系统时钟SYSCLK,配置AHB(HCLK)总线时钟,配置外设APB1(PCLK1)和APB2(PCLK2)时钟
库函数的标准配置为PCLK2=HCLK=SYSCLK=PLLCLK=72M,PCLK1=HCLK/2=36M
系统初始化时会调用函数实现时钟配置。
  1. #ifdef SYSCLK_FREQ_HSE. j/ O9 y" C) f) @
  2.   uint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;     /*!< System Clock Frequency (Core Clock) */
    - `6 w$ H/ @  n: _' x- k
  3. #elif defined SYSCLK_FREQ_24MHz
    $ u  W1 T# f1 x  A, f
  4.   uint32_t SystemCoreClock         = SYSCLK_FREQ_24MHz;   /*!< System Clock Frequency (Core Clock) */# b. w$ o. m. C$ u3 a: D4 E
  5. #elif defined SYSCLK_FREQ_36MHz0 S, I; k' L' R. P- z& _5 F
  6.   uint32_t SystemCoreClock         = SYSCLK_FREQ_36MHz;   /*!< System Clock Frequency (Core Clock) */. S/ _% T, l: Y- d( E$ i  l
  7. #elif defined SYSCLK_FREQ_48MHz
    9 h) F5 }2 Z$ O4 U9 E# w
  8.   uint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz;   /*!< System Clock Frequency (Core Clock) */% Z9 e+ _) }0 `( h
  9. #elif defined SYSCLK_FREQ_56MHz+ `3 A' L3 \# S# t: e( z
  10.   uint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz;   /*!< System Clock Frequency (Core Clock) */% j4 [6 s6 `2 r: s* k1 l0 a+ e) }
  11. #elif defined SYSCLK_FREQ_72MHz
    - w! `: \/ l) W( O7 M/ |
  12.   uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;   /*!< System Clock Frequency (Core Clock) */+ g- L" j$ K6 B4 C
复制代码
  1. static void SetSysClock(void)
    + a9 ?2 v, x! w! Q6 h
  2. {
    / n( Q6 }  Y( k$ |/ r
  3. #ifdef SYSCLK_FREQ_HSE
    7 B& U) K  t" d8 }
  4.   SetSysClockToHSE();9 m4 t/ j6 @' T. g) l( q. O
  5. #elif defined SYSCLK_FREQ_24MHz9 e5 O" f. w, \2 `8 _) Y0 z' i
  6.   SetSysClockTo24();
    & C+ v% C/ u: B& t, ?6 _- S
  7. #elif defined SYSCLK_FREQ_36MHz
    : |1 P1 P+ `4 s! M* {6 ?
  8.   SetSysClockTo36();
    ! M$ D( b$ Y( c: h
  9. #elif defined SYSCLK_FREQ_48MHz
    & |# |# {- ^4 g: e
  10.   SetSysClockTo48();2 v& |& P, ?* o( `
  11. #elif defined SYSCLK_FREQ_56MHz( _* s9 g! v9 B4 p
  12.   SetSysClockTo56();  - m; @% Z1 e- i- O
  13. #elif defined SYSCLK_FREQ_72MHz& W4 J& S% @# |: h* |
  14.   SetSysClockTo72();! A5 B8 ?' V5 q
  15. #endif) o1 ?# ]% y6 {$ o
复制代码

0 R: x+ r8 L# h/ F6 F6 ~
在system_stm32f10x.c文件中可更改宏定义改变系统时钟频率
  1. #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL), P5 s5 E. s: M& h8 v
  2. /* #define SYSCLK_FREQ_HSE    HSE_VALUE */
    8 D( Y, V. P* S' N
  3. #define SYSCLK_FREQ_24MHz  24000000
    " Y! t" p5 z) g3 |9 Z, z# ]
  4. #else
    + i) `; k* F  i( j! R
  5. /* #define SYSCLK_FREQ_HSE    HSE_VALUE *// E. V% B5 V1 p/ q" ]! u& J
  6. /* #define SYSCLK_FREQ_24MHz  24000000 */ ! _" l/ E" `& j, Y
  7. /* #define SYSCLK_FREQ_36MHz  36000000 */* z3 g5 h% ?9 Y, {1 I
  8. /* #define SYSCLK_FREQ_48MHz  48000000 */
    2 i' E/ n6 K3 ~) W3 s2 R# A
  9. /* #define SYSCLK_FREQ_56MHz  56000000 */6 [1 ?4 \. |9 d! M  n9 J; `
  10. #define SYSCLK_FREQ_72MHz  72000000
    4 i* ?( T. u% N
  11. #endif$ E* m9 B# v/ d% \6 K
复制代码
' s! B" w; Q, i6 C# ?

8 H* x3 I: Q0 n" D0 Z1、时钟树
: y; h. y: W' ?: m
5 N, [/ R# l$ N( P 2604878-20220111094549623-739236124.png 6 q% s# Y4 _% R) U4 |3 b0 z
主要时钟
" B3 b3 C2 Z* D; G, _* g+ Q/ |# l
  • HSE:高速外部时钟,可由有源晶振或无源晶振提供,4-16MHz
    PLL以HSE为来源时可设置不分频或2分频
  • PLL:锁相环时钟源,可配置来自HSE或HSI/2
  • PLLCLK:锁相环时钟,可设置倍频[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
  • SYSCLK:系统时钟
  • HCLK:AHB总线时钟,系统时钟经AHB预分频得到,分频因子[1,2,4,8,16,64,128,256,512]
  • PCLK1:APB1总线时钟,由HCLK通过低速APB1预分频得到,分频因子[1,2,4,8,16]
  • PCLK2:APB2总线时钟,由HCLK通过高速APB2预分频得到,分频因子[1,2,4,8,16]

    . p, N( @) h& P" @- c4 o+ M
其他时钟
  • USB时钟:由PLLCLK通过USB预分频器得到,分频因子[1,1.5]
  • Cortex系统时钟:由HCLK8分频得到,用来驱动内核的系统定时器SysTick
  • ADC时钟:由PCLK2经ADC预分频得到,分频因子[2,4,6,8]
  • RTC时钟:由HSE/128或LSE或LSI得到
  • MCO时钟:输出时钟,可由PLLCLK/2,HSI,HSE,SYSCLK配置8 J9 B; j# `4 h3 m( M- O

4 F" N# F+ @+ F" X) r+ H2、时钟配置/ c: W: g8 |) J+ i0 a, [: @
- s/ i, N4 U1 y5 U
相关库函数& y0 B. o3 f- W6 e( U/ o+ @
配置函数
% S& ^2 c6 }! C+ q: ^
  1. /*
    # b. V7 u+ A! a: z
  2.         将RCC外设初始化为复位状态( Q; m) Y" Q+ \+ E( _
  3. */
    ( t! B$ J# D# p4 [. b
  4. void RCC_DeInit(void);                - }# z# ?$ v# V7 N+ S$ X1 W
  5. /*
    3 ?; q# B: m+ i6 y7 c: |
  6.         使能HSE,可选参数RCC_HSE_OFF,RCC_HSE_ON,RCC_HSE_Bypass " P# Z. k/ w& I+ R  M
  7. */
    ' ~* D# g& m5 Y6 J  D
  8. void RCC_HSEConfig(uint32_t RCC_HSE);        ( w7 |4 v, R8 z' e
  9. /*, V9 u/ a/ c5 P
  10.         等待时钟源启动稳定,返回SUCCESS,ERROR
    - e6 W9 b4 ~. [
  11. */  ]7 }2 t1 ^3 C# n; U
  12. ErrorStatus RCC_WaitForHSEStartUp(void); : ?/ n$ C5 V1 B' U& S1 _/ p
  13. /*6 @8 M% T! ~  t: E& x- c, B: X
  14.         配置PLL时钟源和PLL倍频因子2 d7 @# K+ g1 ], q
  15.         RCC_RLLSource:RCC_PLLSource_HSE_Div1,RCC_PLLSource_HSE_Div2,RCC_PLLSource_HSI_Div2" y2 T0 S; b4 K" J! V' \, ?
  16.         RCC_PLLMul:RCC_PLLMul_2 [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]  j" X5 o! V) M& N$ W" M0 ~, b
  17. */
    + E! w* X! S% z
  18. void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);- E" G  w* R! B. @$ A/ c6 L  r
  19. /*, W7 Y3 k* X4 i! m
  20.         配置系统时钟,可选参数RCC_SYSCLKSource_HSI,RCC_SYSCLKSource_HSE,RCC_SYSCLKSource_PLLCLK
    ( k# m( c' l4 J
  21. */
    $ ~2 B# B  i+ e$ x
  22. void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);
    $ F" i& n. c  z  E3 v$ \' i( P2 {
  23. /*9 O% D$ u* z: _% h( S! ~
  24.         配置HCLK,可选参数RCC_SYSCLK_Div1 [1,2,4,8,16,64,128,256,512]' N1 H2 }# r1 j- r6 y, Y# X3 I& \
  25. */* T& F& v( K( p' ]& c/ A
  26. void RCC_HCLKConfig(uint32_t RCC_SYSCLK);
    8 n, {" C& {. r' w6 M2 t
  27. /*
    . B  y' l3 t. e. S
  28.         配置PCLK1,可选参数RCC_HCLK_Div1 [1,2,4,8,16]+ @& z7 _4 K& l4 f+ _. Z! J# u
  29. */
    0 [; {, c- S) L' J3 K% K0 b+ S
  30. void RCC_PCLK1Config(uint32_t RCC_HCLK);
    7 z3 V, p3 v3 C# e) X
  31. /*" R7 s4 c1 l1 S) ~
  32.         配置PCLK2,可选参数RCC_HCLK_Div1 [1,2,4,8,16]9 z( m4 |, `! B. o" j7 j" U7 x
  33. */3 Z# w( ]$ [# U7 [" b! Q# u
  34. void RCC_PCLK2Config(uint32_t RCC_HCLK);
    0 C9 D' |3 Y3 {
复制代码
; t# ]2 ~1 [, L7 i
( b+ c- M9 {+ M* s' v+ s- Z
使用HSE配置系统时钟
  • 1、开启HSE ,并等待 HSE 稳定
  • 2、设置 AHB、APB2、APB1的预分频因子
  • 3、设置PLL的时钟来源,和PLL的倍频因子,设置各种频率主要就是在这里设置
  • 4、开启PLL,并等待PLL稳定
  • 5、把PLLCK切换为系统时钟SYSCLK
  • 6、读取时钟切换状态位,确保PLLCLK被选为系统时钟% O" ]$ z+ S& X7 |) S  F

. n0 ], P) `" z' t使用HSI配置系统时钟
  • 1、开启HSI ,并等待 HSI 稳定
  • 2、设置 AHB、APB2、APB1的预分频因子
  • 3、设置PLL的时钟来源,和PLL的倍频因子,设置各种频率主要就是在这里设置
  • 4、开启PLL,并等待PLL稳定
  • 5、把PLLCK切换为系统时钟SYSCLK
  • 6、读取时钟切换状态位,确保PLLCLK被选为系统时钟
    9 \2 C9 b" _8 F  y1 F+ Y  C, V/ R
  1. /* 设置 系统时钟:SYSCLK, AHB总线时钟:HCLK, APB2总线时钟:PCLK2, APB1总线时钟:PCLK1* C( m- j6 Y8 z8 k
  2. * PCLK2 = HCLK = SYSCLK- ~! ?( K2 x. o
  3. * PCLK1 = HCLK/2,最高只能是36M' R% M. d8 C9 U. A
  4. * 参数说明:pllmul是PLL的倍频因子,在调用的时候可以是:RCC_PLLMul_x , x:[2,3,...16]
    / p3 c2 c' c4 B8 O, i3 [
  5. * 举例:HSI_SetSysClock(RCC_PLLMul_9);  则设置系统时钟为:4MHZ * 9 = 72MHZ
    # {8 j) l- U. k. K5 T- R* B6 t8 Q! S
  6. *       HSI_SetSysClock(RCC_PLLMul_16); 则设置系统时钟为:4MHZ * 16 = 64MHZ! z  L' \1 w7 b1 l: Y3 I! j4 h  k
  7. *
    $ x7 b* e5 S! L8 n
  8. * HSI作为时钟来源,经过PLL倍频作为系统时钟,这是在HSE故障的时候才使用的方法
    3 |3 e" `" I1 W: {: d
  9. * HSI会因为温度等原因会有漂移,不稳定,一般不会用HSI作为时钟来源,除非是迫不得已的情况
    . {3 `3 Q2 [* h5 X2 X4 _
  10. * 如果HSI要作为PLL时钟的来源的话,必须二分频之后才可以,即HSI/2,而PLL倍频因子最大只能是16
    , ~- W1 v5 w9 A  u
  11. * 所以当使用HSI的时候,SYSCLK最大只能是4M*16=64M7 {  D/ z) H- A- a( ]: u. X
  12. */
    . [4 h: o* m& V& m
  13. void HSI_SetSysClock(uint32_t pllmul)' a3 R  O- |3 L5 _
  14. {8 l: Z$ A: B0 p* R
  15.     __IO uint32_t HSIStartUpStatus = 0;
    3 O- l/ z: y! z: x
  16.     // 把RCC外设初始化成复位状态,这句是必须的" w" u* e# J4 @$ _5 L9 B7 `7 Y  G7 R
  17.     RCC_DeInit();3 N+ F' k. y" T" c/ n, G
  18. / }0 b# Z2 N  x; g3 j
  19.     //使能HSI  G8 b9 [+ O" b5 \8 Q, O
  20.     RCC_HSICmd(ENABLE);
    8 q- {$ a7 U' `+ ~, Q
  21.     // 等待 HSI 就绪( M" v! X+ |) ^: Y6 C
  22.     HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;! B( c5 z2 f1 d# Y
  23.     // 只有 HSI就绪之后则继续往下执行  N: B; @, ?1 }: |
  24.     if (HSIStartUpStatus == RCC_CR_HSIRDY)+ E( h  \4 a9 }$ K. O, R
  25.     {
    & Q4 x' p! T% g& e/ U2 b% e
  26. //----------------------------------------------------------------------//7 ]+ C. r. N/ H8 T& x+ L
  27.         // 使能FLASH 预存取缓冲区5 n8 Q/ }# J5 d2 g  m- }2 g
  28.         FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);; \! x8 C/ U8 ^' M, g  a3 B8 n
  29.         // SYSCLK周期与闪存访问时间的比例设置,这里统一设置成2; A7 @! ^) D& v
  30.         // 设置成2的时候,SYSCLK低于48M也可以工作,如果设置成0或者1的时候,
    9 `! x* K8 z# [! o  j  Q' ]
  31.         // 如果配置的SYSCLK超出了范围的话,则会进入硬件错误,程序就死了) n* x# x; m9 m3 k1 v6 i
  32.         // 0:0 < SYSCLK <= 24M: Y  j& R0 g9 [3 G( x: t% I& J/ C7 Y
  33.         // 1:24< SYSCLK <= 48M1 y* ?6 x/ \, w4 a
  34.         // 2:48< SYSCLK <= 72M
    7 n% @, j; j% V' x/ C- ]( N
  35.         FLASH_SetLatency(FLASH_Latency_2);
    - T6 \5 F" E* Q* y$ U7 V8 l- j
  36. //----------------------------------------------------------------------//
    * f- w4 u- a! J( f. e1 n2 {% v
  37.         // AHB预分频因子设置为1分频,HCLK = SYSCLK
    / a6 h! j: V+ M3 P- v) W
  38.         RCC_HCLKConfig(RCC_SYSCLK_Div1);4 S5 Z, v4 T. k% G5 k2 P
  39.         // APB2预分频因子设置为1分频,PCLK2 = HCLK
    5 ?) Q) d  G! S
  40.         RCC_PCLK2Config(RCC_HCLK_Div1);$ h' k; c% d# t/ M' {! i) @; Z
  41.         // APB1预分频因子设置为1分频,PCLK1 = HCLK/2
    " B/ _2 V9 v3 i' ?3 P( n9 _, e
  42.         RCC_PCLK1Config(RCC_HCLK_Div2);
    ) }) u9 X+ T9 T
  43. //-----------------设置各种频率主要就是在这里设置-------------------//
    1 b1 Y9 N1 B) D. x3 m
  44.         // 设置PLL时钟来源为HSE,设置PLL倍频因子
    ' S" U# d; D" w' M; g
  45.         // PLLCLK = 4MHz * pllmul" X* U/ L, o) G& O
  46.         RCC_PLLConfig(RCC_PLLSource_HSI_Div2, pllmul);
    9 t5 X( p1 [7 F' A( o. U0 e
  47. //------------------------------------------------------------------//
    & k2 _5 q& \, m. \
  48.         // 开启PLL9 {5 P: q. T" C; n( i6 D
  49.         RCC_PLLCmd(ENABLE);5 Y# X' c9 ?2 ^
  50.         // 等待 PLL稳定
    # e- V& A. X$ R+ K$ z
  51.         while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    1 |- U. ]7 d; N
  52.         {
    ) a; k7 X$ V- p, W* p
  53.         }* r6 }" c: q5 J: L: }- d/ J
  54.         // 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLK) A4 `  p( u7 v7 E2 ?
  55.         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  }3 u1 {. f2 p, Q" M% E
  56.         // 读取时钟切换状态位,确保PLLCLK被选为系统时钟! q! S/ R) m1 m' i* o3 u5 {
  57.         while (RCC_GetSYSCLKSource() != 0x08)
    : A' a$ n$ Z7 u2 X( a6 v# {5 a5 t
  58.         {* D" z" L2 w/ N
  59.         }  w1 M$ ^( f( J: t" J1 D
  60.     }7 Y! @0 y. V# ^
  61.     else
    2 M+ E$ K2 T. T4 g
  62.     {
    / q- B6 J$ Z& Z( O5 w
  63.         // 如果HSI开启失败,那么程序就会来到这里,用户可在这里添加出错的代码处理
    & ]- x6 w4 n# t" O
  64.         // 当HSE开启失败或者故障的时候,单片机会自动把HSI设置为系统时钟,: A' e2 Q7 s; J
  65.         // HSI是内部的高速时钟,8MHZ
    " D7 X7 D( h1 l3 n% ?" z
  66.         while (1)
    8 ^1 V) ]5 s. T4 q: W6 Z' `8 @5 Z  X
  67.         {
    , B  C6 R* f6 _1 W; p2 U% b( W3 S
  68.         }- y: {5 I3 e7 o/ G
  69.     }0 a8 g1 |+ I; B
  70. }
复制代码
6 F, W- ?: A& l  {8 r  a

( D5 Q: K6 ]3 ]% {% L6 C$ jMCO输出
MCO GPIO初始化
  1. /*
    : W) B8 G2 t" ?& Q, B# \. c
  2. * 初始化MCO引脚PA8
    . ~# V, K9 m0 [! f* F6 m4 X
  3. * 在F1系列中MCO引脚只有一个,即PA8,在F4系列中,MCO引脚会有两个
    5 ^, k% A' d# |: k# ?/ @; O# i
  4. */) N, u' m6 n. ]$ _  T
  5. void MCO_GPIO_Config(void)
    ' Y" A' Z9 i# l5 }' {% h! a% x5 m
  6. {, y  j  n3 L, L3 F! N
  7.     GPIO_InitTypeDef GPIO_InitStructure;6 K0 x9 |0 L6 X4 J( t3 C0 ?
  8.     // 开启GPIOA的时钟
    $ d" G, p  l! k. L* i
  9.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);9 E6 R6 ?9 a2 Z4 H; w9 X' ~) A
  10.     // 选择GPIO8引脚4 y4 F; O0 K* |
  11.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    . O, L5 y3 H( I
  12.     //设置为复用功能推挽输出5 Y  W, j% m5 o
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    - I0 @7 R$ r# |6 P  Z
  14.     //设置IO的翻转速率为50M
    + s3 y5 O% {0 e) d
  15.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    / B& t/ k! ]* j6 V; \9 x1 s
  16.     // 初始化GPIOA8& ]0 n/ t2 b9 k  G. D
  17.     GPIO_Init(GPIOA, &GPIO_InitStructure);
    * N& {5 h$ v+ j% e
  18. }
    * f4 ]6 A- Q' N. B& T/ t
复制代码
" e! x1 L" N* i8 J* R/ s
输出
  1. // MCO 引脚初始化
    0 c# b% p: I: J4 \) i  x
  2. MCO_GPIO_Config();  _: _6 C# \4 B
  3. // 设置MCO引脚输出时钟,用示波器即可在PA8测量到输出的时钟信号,
    ' z4 R+ Z) f7 T+ Z4 d
  4. // 我们可以把PLLCLK/2作为MCO引脚的时钟来检测系统时钟是否配置准确
    ! }- I: t$ W9 G2 {5 y3 O
  5. // MCO引脚输出可以是HSE,HSI,PLLCLK/2,SYSCLK  o1 Z& ]8 q4 M2 E; k
  6. //RCC_MCOConfig(RCC_MCO_HSE);
    2 a7 }8 Z0 V4 y8 h' Z$ y
  7. //RCC_MCOConfig(RCC_MCO_HSI);
    $ S/ Z0 y. G/ n4 m& @' `- h+ s
  8. //RCC_MCOConfig(RCC_MCO_PLLCLK_Div2);
    6 C  w  b/ o- [( G; n
  9. RCC_MCOConfig(RCC_MCO_SYSCLK);
复制代码
- {9 F' h' w) z1 h8 C+ F. p: U

' o7 P4 x& z* `( V" OSystick系统定时器简介
SysTick——系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。
系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。
因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。
相关库函数
  • SysTick配置函数
    1. static __INLINE uint32_t SysTick_Config(uint32_t ticks)
      , M' v! S+ C  [. N" t+ M
    2. {
      * H# q$ J2 R  `7 i0 T" @
    3.   if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
      1 v7 R: g3 w6 |3 j, p
    4.                                                                0 Q" u, A+ I# _" R
    5.   SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */4 }- }5 _! y; M( n
    6.   NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
      ( j6 T- C, ~1 J: M
    7.   SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
      " t, P1 P+ \6 O7 z2 |1 n) l
    8.   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 1 D1 _+ z, |: m6 J1 V' e
    9.                    SysTick_CTRL_TICKINT_Msk   |
      1 i4 t/ K# W) U
    10.                    SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer *// u/ U( Q. |' t6 N% W
    11.   return (0);                                                  /* Function successful */
      1 r( E3 P7 C/ v1 h% J* l
    12. }8 ?/ J/ E0 v2 J
    复制代码

    + F4 z, l# X! {0 |# p
    ticks用来设置重载寄存器的值,最大不超过 B3@0${X[3K]3($GOL5KF~TF.png ,当寄存器值递减到0时产生中断,随后重载、递减,循环往复。
    每一个tick对应1/SYSCLK 秒
    每次中断间隔时间为 WAU946P@$BUWH_~)IV}WJMA.png
  • ,当寄存器值递减到0时产生中断,随后重载、递减,循环往复。
  • 修改系统定时器中断优先级(非必要)
    1. NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);7 E) K+ X8 w; B
    复制代码

    4 x6 J; A( b# V6 X. ]2 ]
  • 对应中断函数
    1. void SysTick_Handler(void)1 \4 G8 w/ q2 x6 ^0 M1 v
    2. {5 u$ S2 Y0 l4 d  N
    3.    
      $ v  h1 j9 h" t) C" `
    4. }
      ( O- d# G6 p6 F3 s  v( w2 ^
    复制代码
      A1 k0 X' b8 a# h4 y( e4 u/ {

    & V% X) z) U5 T6 T: d' o' Y

; D% `! c6 Y6 Z! l( Y  c3 A% {0 I1 o5 ^
" r+ b0 B7 t6 b6 D% U
1 T5 A+ Z) q2 t
收藏 评论0 发布时间:2022-1-25 17:00

举报

0个回答

所属标签

相似分享

官网相关资源

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