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

【经验分享】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
    7 H% ?' |* q- q. k9 U
  2.   uint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;     /*!< System Clock Frequency (Core Clock) */& x& [# E6 z" d6 N1 P2 m, {
  3. #elif defined SYSCLK_FREQ_24MHz
    - z( q  x+ Q# W; s* X# O/ ^
  4.   uint32_t SystemCoreClock         = SYSCLK_FREQ_24MHz;   /*!< System Clock Frequency (Core Clock) */
    ! ~$ I. ?, G. X6 T$ t
  5. #elif defined SYSCLK_FREQ_36MHz* @) _% U3 d) x: X8 u
  6.   uint32_t SystemCoreClock         = SYSCLK_FREQ_36MHz;   /*!< System Clock Frequency (Core Clock) */$ S/ ^" `) D3 K
  7. #elif defined SYSCLK_FREQ_48MHz
    & D8 W  E9 D: e- y( z
  8.   uint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz;   /*!< System Clock Frequency (Core Clock) */% j2 M# D! v. \
  9. #elif defined SYSCLK_FREQ_56MHz0 L% Z; t! P; @
  10.   uint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz;   /*!< System Clock Frequency (Core Clock) */
    : h4 K* E5 V: E5 r
  11. #elif defined SYSCLK_FREQ_72MHz
    ; K% y( c( c% Q% F4 G3 o! }
  12.   uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;   /*!< System Clock Frequency (Core Clock) */. F% O+ a) e2 R6 H) I
复制代码
  1. static void SetSysClock(void)
    8 e9 Y4 h; B0 M3 _
  2. {
    4 m0 w) h, e9 E% T& x
  3. #ifdef SYSCLK_FREQ_HSE$ D3 }! E0 R- d9 A7 }
  4.   SetSysClockToHSE();
    2 t7 M1 O! ?/ k8 U* e- q
  5. #elif defined SYSCLK_FREQ_24MHz3 {, ], }: X4 u! O0 L5 [+ l
  6.   SetSysClockTo24();" g% L9 }) f  N
  7. #elif defined SYSCLK_FREQ_36MHz) G7 b) E& ?# p1 {& z. Z
  8.   SetSysClockTo36();
    9 l$ s! q! r/ N5 l/ Y. F4 i
  9. #elif defined SYSCLK_FREQ_48MHz# m& E3 l9 H  O) M
  10.   SetSysClockTo48();
    ' V# q/ J- a9 p1 ^9 y
  11. #elif defined SYSCLK_FREQ_56MHz5 \2 g4 B5 {5 x8 Z
  12.   SetSysClockTo56();  3 Z4 J9 N6 i- P2 }9 h
  13. #elif defined SYSCLK_FREQ_72MHz
    2 I. m" e2 j: ]$ i" q0 i! k# v
  14.   SetSysClockTo72();* J4 A4 U; U; R% v. Y
  15. #endif
    7 R, {# M/ h: R! T! q% i: X8 P6 o
复制代码
$ S# i4 I3 H& I0 B
在system_stm32f10x.c文件中可更改宏定义改变系统时钟频率
  1. #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)5 W: m5 u; n0 P& s% n1 ~! o$ Z, f) O
  2. /* #define SYSCLK_FREQ_HSE    HSE_VALUE */  j( b  k( B% |# A" ~$ G3 }
  3. #define SYSCLK_FREQ_24MHz  240000007 O8 X+ H+ a! x+ w5 S1 a0 p
  4. #else  @" `+ q- t3 C. \: x+ t: {4 |2 V
  5. /* #define SYSCLK_FREQ_HSE    HSE_VALUE */8 j' c; [3 O$ V& E! ]6 N7 Z
  6. /* #define SYSCLK_FREQ_24MHz  24000000 */ 5 G+ t% W3 |" j6 r( K% m
  7. /* #define SYSCLK_FREQ_36MHz  36000000 */+ X$ h# S% l' Y! _/ f6 S/ ~
  8. /* #define SYSCLK_FREQ_48MHz  48000000 */" f# G- M. N0 o5 A7 D
  9. /* #define SYSCLK_FREQ_56MHz  56000000 */# e5 k' G! [1 z. d' H2 H% X
  10. #define SYSCLK_FREQ_72MHz  72000000' f. e% C4 E( Y; n7 A4 x
  11. #endif
    1 w( U# a! p$ O: h/ V
复制代码

4 q* X9 u6 f, q5 K& P- k7 W( L! J2 g' V, d" L- |+ K! [' C
1、时钟树" t: V) Y2 S7 C) c/ ^0 B7 Y9 b
8 C" e6 ]  ~' ^4 [; U
2604878-20220111094549623-739236124.png 1 y. F4 \! G8 l% L# `
主要时钟" y1 L  i5 _8 C4 E/ W
  • 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]

    0 w& h" O, ~7 G3 l
其他时钟
  • 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配置4 W" x8 ~( J3 d+ R1 x9 ^
0 A5 |' }& h; v/ y
2、时钟配置; X( r# f: i1 v% E8 P

, V8 K! Z4 M+ y; D相关库函数+ ~& z* e% Q* a& f. E' e
配置函数" y- z* X9 C; H7 N. U6 S
  1. /*
    : ]- X; U( A4 X: X4 g
  2.         将RCC外设初始化为复位状态2 W. u4 [- K$ c$ n! E
  3. */. u* p) s9 o  E) q( t
  4. void RCC_DeInit(void);                ; L& w7 U- G9 D3 N# w
  5. /*$ `5 T! x8 r1 R7 Y0 S
  6.         使能HSE,可选参数RCC_HSE_OFF,RCC_HSE_ON,RCC_HSE_Bypass
    5 z! x+ o, C- r
  7. */+ k* l; ?7 W- h. Y. i% M' X& _
  8. void RCC_HSEConfig(uint32_t RCC_HSE);        
    : X5 ^1 \* c9 Q! C9 c
  9. /*6 `1 D. S% f2 p" B5 b
  10.         等待时钟源启动稳定,返回SUCCESS,ERROR, \% q, [' `6 x
  11. */4 K3 z0 U$ x* D+ W
  12. ErrorStatus RCC_WaitForHSEStartUp(void); & x5 E6 o& I) R: y; H8 d; ?3 Q
  13. /*
    , y! o5 T1 @5 A$ K
  14.         配置PLL时钟源和PLL倍频因子
    * R+ L( w8 |9 P& E, x2 _
  15.         RCC_RLLSource:RCC_PLLSource_HSE_Div1,RCC_PLLSource_HSE_Div2,RCC_PLLSource_HSI_Div2
    . t. X9 t3 k9 ?: J' ^
  16.         RCC_PLLMul:RCC_PLLMul_2 [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]# C- d7 h5 l$ U& P5 m
  17. */
    % w& E' P4 H2 [+ ~% C( R
  18. void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);
    8 q5 H1 ^3 E; h/ B6 Z+ E
  19. /*  C  S, W# j4 _3 }/ M. T
  20.         配置系统时钟,可选参数RCC_SYSCLKSource_HSI,RCC_SYSCLKSource_HSE,RCC_SYSCLKSource_PLLCLK
    # b* {$ T9 e( \) ]' q; u
  21. */0 e- t3 a# X8 G" v; G( R
  22. void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);
    2 P8 t* W- C/ X5 v
  23. /*/ M) _. y) D& V+ n
  24.         配置HCLK,可选参数RCC_SYSCLK_Div1 [1,2,4,8,16,64,128,256,512]- A1 y' @: A$ I& S, k8 e3 M2 G
  25. */9 v: H0 ]0 \) @4 _
  26. void RCC_HCLKConfig(uint32_t RCC_SYSCLK);% u* z6 x% t1 ^. t. J7 j- U& f& Q
  27. /*
    7 e8 L2 T# n+ E& E
  28.         配置PCLK1,可选参数RCC_HCLK_Div1 [1,2,4,8,16]
    ; q, L1 o$ P# ]5 b: f
  29. */
      k7 F7 `2 L, ~1 V% A1 T" I
  30. void RCC_PCLK1Config(uint32_t RCC_HCLK);; g6 u# l' g9 x2 }, X$ r
  31. /*0 E/ r$ S' J$ q% Q. _9 l
  32.         配置PCLK2,可选参数RCC_HCLK_Div1 [1,2,4,8,16]4 O* J) v( s% C6 Y( k9 V' W
  33. */
    2 D  T7 s; `1 b8 q; M$ L6 S( R# I8 i1 V
  34. void RCC_PCLK2Config(uint32_t RCC_HCLK);
    , N. U3 Q* j3 @! _4 x
复制代码
1 x9 |0 I$ s8 Y1 o

$ w& B1 W" G$ C使用HSE配置系统时钟
  • 1、开启HSE ,并等待 HSE 稳定
  • 2、设置 AHB、APB2、APB1的预分频因子
  • 3、设置PLL的时钟来源,和PLL的倍频因子,设置各种频率主要就是在这里设置
  • 4、开启PLL,并等待PLL稳定
  • 5、把PLLCK切换为系统时钟SYSCLK
  • 6、读取时钟切换状态位,确保PLLCLK被选为系统时钟. O9 u" K4 j; J8 i( |% e4 h% m

+ n$ N  @- R; w; T使用HSI配置系统时钟
  • 1、开启HSI ,并等待 HSI 稳定
  • 2、设置 AHB、APB2、APB1的预分频因子
  • 3、设置PLL的时钟来源,和PLL的倍频因子,设置各种频率主要就是在这里设置
  • 4、开启PLL,并等待PLL稳定
  • 5、把PLLCK切换为系统时钟SYSCLK
  • 6、读取时钟切换状态位,确保PLLCLK被选为系统时钟' l  J' U9 L$ ^3 a% ^$ t4 I
  1. /* 设置 系统时钟:SYSCLK, AHB总线时钟:HCLK, APB2总线时钟:PCLK2, APB1总线时钟:PCLK13 F1 T, i& X4 ?' p
  2. * PCLK2 = HCLK = SYSCLK
    & G; m6 m) l8 d% N
  3. * PCLK1 = HCLK/2,最高只能是36M# x1 E- P" v% S& S" W
  4. * 参数说明:pllmul是PLL的倍频因子,在调用的时候可以是:RCC_PLLMul_x , x:[2,3,...16]
    - ?" u. b' W" Z5 e" V. G
  5. * 举例:HSI_SetSysClock(RCC_PLLMul_9);  则设置系统时钟为:4MHZ * 9 = 72MHZ/ D. k3 F$ Z8 O4 l# _: d: d
  6. *       HSI_SetSysClock(RCC_PLLMul_16); 则设置系统时钟为:4MHZ * 16 = 64MHZ& m+ \6 w8 P! {$ w) y9 O; |
  7. *" l% V3 g: f. Y, r, O) S
  8. * HSI作为时钟来源,经过PLL倍频作为系统时钟,这是在HSE故障的时候才使用的方法7 x! q. B: O5 C! t  m2 n, C
  9. * HSI会因为温度等原因会有漂移,不稳定,一般不会用HSI作为时钟来源,除非是迫不得已的情况
    - @5 b$ v* F  d! |
  10. * 如果HSI要作为PLL时钟的来源的话,必须二分频之后才可以,即HSI/2,而PLL倍频因子最大只能是16
    3 W1 t) `) H* @- J4 y# |
  11. * 所以当使用HSI的时候,SYSCLK最大只能是4M*16=64M  z# W6 a% G8 E4 Y+ n- b
  12. */
    8 u: S( g% v% U0 n; g. A
  13. void HSI_SetSysClock(uint32_t pllmul)
    % H0 d! @3 O2 z% o, }) m
  14. {  b& J8 l/ D! v( I
  15.     __IO uint32_t HSIStartUpStatus = 0;5 |+ s4 y6 J! x1 N
  16.     // 把RCC外设初始化成复位状态,这句是必须的
    ! }! t4 I" }* B) G. t+ K8 z
  17.     RCC_DeInit();
    9 B3 c" e+ ^" o. t

  18. 2 g- u/ D8 p0 V- \( o
  19.     //使能HSI  I+ @: o  D2 K: |7 v; c2 w
  20.     RCC_HSICmd(ENABLE);/ H! d  k3 [4 o
  21.     // 等待 HSI 就绪
    " P/ T  |: o3 z  ^4 E
  22.     HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;
    . h* }3 }5 h7 h& c1 l
  23.     // 只有 HSI就绪之后则继续往下执行
    & A3 D7 ]( i% d1 L9 m" R
  24.     if (HSIStartUpStatus == RCC_CR_HSIRDY)1 N8 t/ m  ?3 _2 Y8 v
  25.     {6 [/ I6 C" Y3 {  U! D; ?
  26. //----------------------------------------------------------------------//
    ; |$ r# L8 e3 i0 G2 y8 o8 m* X
  27.         // 使能FLASH 预存取缓冲区
    ( l$ F: M9 K  H, Y) K
  28.         FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    7 g) G. f/ I/ A
  29.         // SYSCLK周期与闪存访问时间的比例设置,这里统一设置成2
    * R; ~3 b- Z) c) k
  30.         // 设置成2的时候,SYSCLK低于48M也可以工作,如果设置成0或者1的时候,
    $ @0 t/ W3 k/ E; r( d7 Z# m9 t, O
  31.         // 如果配置的SYSCLK超出了范围的话,则会进入硬件错误,程序就死了* ?" P2 w  g8 x# t4 Q3 c" T5 t
  32.         // 0:0 < SYSCLK <= 24M
    " K, C9 j% v9 d: q3 K7 F' F! C
  33.         // 1:24< SYSCLK <= 48M
      \# h* T+ g' f  ]. V9 M; ], q
  34.         // 2:48< SYSCLK <= 72M
    ' h. b7 U: o" D0 A: B) G
  35.         FLASH_SetLatency(FLASH_Latency_2);
    * C) J5 n# H% N$ m
  36. //----------------------------------------------------------------------//
    ( L/ d3 M( W/ V) q6 `, L6 {
  37.         // AHB预分频因子设置为1分频,HCLK = SYSCLK$ `" [) W, |2 O/ C" x& M. F
  38.         RCC_HCLKConfig(RCC_SYSCLK_Div1);9 B* s) P( B+ I
  39.         // APB2预分频因子设置为1分频,PCLK2 = HCLK& M4 i0 H" T8 p; v+ x  L5 b1 q
  40.         RCC_PCLK2Config(RCC_HCLK_Div1);
    * D7 N! h1 m+ E3 w  X
  41.         // APB1预分频因子设置为1分频,PCLK1 = HCLK/2: x3 [1 {' y# r* O$ s4 b5 H2 X" c4 b
  42.         RCC_PCLK1Config(RCC_HCLK_Div2);' ~+ C! U( {4 n
  43. //-----------------设置各种频率主要就是在这里设置-------------------//2 }5 F9 ^  N+ M8 ^! ]. k- K" [
  44.         // 设置PLL时钟来源为HSE,设置PLL倍频因子
    0 M$ Y% Z) @& }: C2 w. l) W8 @
  45.         // PLLCLK = 4MHz * pllmul& y4 v' e% p! F8 H
  46.         RCC_PLLConfig(RCC_PLLSource_HSI_Div2, pllmul);
    4 m! p2 Z& R9 [) g
  47. //------------------------------------------------------------------//7 O* |8 |. C! |& j( P2 x' W- c
  48.         // 开启PLL
    . a2 Q( \! ]' ~2 v  o0 X
  49.         RCC_PLLCmd(ENABLE);  ]; c/ f2 ~( Z# j0 k6 E
  50.         // 等待 PLL稳定4 z, ~. z) j3 S9 H- {2 n3 A( ~
  51.         while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    , M1 j2 p2 d+ v( e; A3 s% N
  52.         {
    + z0 T% l& M* U5 V- x1 q, v0 q: q
  53.         }: z9 ?" U2 r- @# s/ r& A/ f
  54.         // 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLK. Y9 D8 r: b) W9 V& c3 a1 @
  55.         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);9 x4 B3 g# F4 r7 T+ z9 ^
  56.         // 读取时钟切换状态位,确保PLLCLK被选为系统时钟' b9 @+ k6 _: t6 o8 }
  57.         while (RCC_GetSYSCLKSource() != 0x08); X" j8 v# t/ m. x1 ?* Z
  58.         {1 Q# X# R5 e; H/ t9 o8 w7 \
  59.         }
    0 m3 L: d! {# N3 ^
  60.     }
    % d. g/ P! n6 L; t" b' n
  61.     else+ P5 X3 E! A: K
  62.     {
    * r# d4 }/ J0 c; h
  63.         // 如果HSI开启失败,那么程序就会来到这里,用户可在这里添加出错的代码处理0 A7 @6 x! T$ L, \) Y5 g0 I
  64.         // 当HSE开启失败或者故障的时候,单片机会自动把HSI设置为系统时钟,* ~) E, X, I+ F( q3 h' C! h! a
  65.         // HSI是内部的高速时钟,8MHZ# C4 j& |5 h9 P' x4 a  u' }
  66.         while (1)2 x) P+ J  T) m' p# W. Y) C
  67.         {% K5 V, p1 A! z% Q9 u6 Y
  68.         }  u" V9 [$ o( S
  69.     }
    ( N$ }, i  C: Z
  70. }
复制代码
; h5 f( F  {' H  L0 x. }3 f

/ o# @* B0 C2 v) @1 L8 L: V9 xMCO输出
MCO GPIO初始化
  1. /*
    3 L6 m# B" U# M% q4 v: t
  2. * 初始化MCO引脚PA8
    8 `) ?% x! k+ i- F4 w+ T) {# m/ w
  3. * 在F1系列中MCO引脚只有一个,即PA8,在F4系列中,MCO引脚会有两个
    ( y. F3 Q7 l& j, Z2 v+ d3 U( E
  4. */3 i  H6 g" |' R" [
  5. void MCO_GPIO_Config(void)
    2 ?2 d& D7 N( u/ V; N* O
  6. {: O2 M; W9 ^4 O; O
  7.     GPIO_InitTypeDef GPIO_InitStructure;
    # l2 n4 b( u9 i( ?7 N0 d
  8.     // 开启GPIOA的时钟
    + y% S( N/ l6 N% @
  9.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);7 e/ i+ `1 U* H* m- T$ F/ p) m) E
  10.     // 选择GPIO8引脚' ?7 h/ U% w1 j; `7 m" R
  11.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
      ]$ {, a* T/ m, s; }" U1 H! o
  12.     //设置为复用功能推挽输出8 _" n  [( n& ~) R9 T2 b
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;, z9 A9 j4 O* W3 f
  14.     //设置IO的翻转速率为50M( A& k) i# j- o4 R. j8 S) p
  15.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ( O* J  `9 \, a4 ]& n" R) k
  16.     // 初始化GPIOA85 w# w2 @* j6 Y1 L9 T
  17.     GPIO_Init(GPIOA, &GPIO_InitStructure);# F5 w6 a+ L. Y1 Q9 G. |' `  E9 o, t
  18. }
    - ~/ j' g" z' U, C7 J$ b% u
复制代码
" C! b$ K: S6 N6 v2 V
输出
  1. // MCO 引脚初始化( d9 T7 x# E! }8 h7 l# ]5 S
  2. MCO_GPIO_Config();/ D: f& k# I  H  v3 E3 b' ^% P  d
  3. // 设置MCO引脚输出时钟,用示波器即可在PA8测量到输出的时钟信号,
    8 e0 j7 n: m: ]
  4. // 我们可以把PLLCLK/2作为MCO引脚的时钟来检测系统时钟是否配置准确, d6 N* @$ t( ^2 o
  5. // MCO引脚输出可以是HSE,HSI,PLLCLK/2,SYSCLK
    3 `! p# v" A) V3 r( E# ]2 X( A
  6. //RCC_MCOConfig(RCC_MCO_HSE);
    2 ^8 j0 v, t3 P) B$ v& H1 e
  7. //RCC_MCOConfig(RCC_MCO_HSI);% @$ ^( v% D" a; i, ]4 u! P% [
  8. //RCC_MCOConfig(RCC_MCO_PLLCLK_Div2);7 N5 V6 Y' p! c4 a3 E& L; D3 G
  9. RCC_MCOConfig(RCC_MCO_SYSCLK);
复制代码

* N9 C0 C- v, u2 `$ e& j; g
3 ~7 `0 N2 [& _5 a- ?Systick系统定时器简介
SysTick——系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。
系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。
因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。
相关库函数
  • SysTick配置函数
    1. static __INLINE uint32_t SysTick_Config(uint32_t ticks)# K9 f/ o3 b# b4 ^0 j: _
    2. { - t- B, w  b& R' p/ L7 A- S
    3.   if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */  u* v7 O- K: \3 |) c* `9 m
    4.                                                                5 {' e" i3 I; ^: w% [2 A
    5.   SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */, d, V8 t. u3 z3 `" ^. g8 w
    6.   NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */! F* J' a% ^& g. P
    7.   SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */! X& Q. j2 D3 s9 `
    8.   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
      - m/ o$ J& j& V: R; N- {0 ?
    9.                    SysTick_CTRL_TICKINT_Msk   |
      1 ]* S' D. s! o
    10.                    SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */; s5 T9 _+ b/ R8 _6 D
    11.   return (0);                                                  /* Function successful */
      5 c$ y' O+ s2 c7 \. ]+ I1 V% x) l' D
    12. }+ C: C( l& u  |. F
    复制代码

    ( b( N% [3 |. K- p8 s6 k2 S* G! d
    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);
        g2 R3 D' k! L! `/ G9 q. ^2 m- {$ J
    复制代码
    , Z+ j3 Y) _1 f1 |5 B$ l
  • 对应中断函数
    1. void SysTick_Handler(void)
      5 l$ v  B/ J7 D+ a9 g3 v
    2. {
      1 ~" J6 C2 Y. M2 S
    3.     ) P/ B: C) E7 L' F6 ~
    4. }: L/ \% j  t8 V; e/ O
    复制代码
    . `4 l2 ~: r+ }, A# X# K

    , L6 y  W0 f, d/ ^0 }9 ^

' T# J, z6 E& x, [
/ \1 g: i! R1 u' z. X2 D3 r  D; m3 q- L: h/ \/ ?

7 v6 H5 Z6 x% p. t3 d2 c
赞 收藏 评论0 发布时间:2022-1-25 17:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版