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

【经验分享】STM32F103固件库源码解析——RCC_APB2PeriphClockCmd

[复制链接]
STMCU小助手 发布时间:2022-5-2 09:13
RCC_APB2PeriphClockCmd函数用来开启或关闭APB2外设时钟,
6 L6 i, b* y& U: `6 H
$ Q* E3 a0 e% R该函数总览如下,
  h* H; |. l2 X* g: c! P; G; p( s5 a: s# \
  1. /**" q$ \! r, {% Q# m' i. J
  2.   * @brief  Enables or disables the High Speed APB (APB2) peripheral clock.
    : i! ?' z7 _8 s' {' r8 i
  3.   * @param  RCC_APB2Periph: specifies the APB2 peripheral to gates its clock.
    ( g5 g8 p% B( o5 m1 Z5 u3 z
  4.   *   This parameter can be any combination of the following values:
    8 u* a, p( o& N$ {- ?9 s; X
  5.   *     @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
    * \9 k: @7 z, D' J
  6.   *          RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,( ]  s2 O+ A7 P, G
  7.   *          RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
    : Y9 o4 P2 m& y6 K
  8.   *          RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
    1 R+ z0 {* T+ N: D) ^
  9.   *          RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
    ; a1 w0 {8 m9 C9 C
  10.   *          RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,9 C% k2 S; B! v: N8 ^' q! V' F
  11.   *          RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11     
    ! P5 u# |6 }. U9 q* T
  12.   * @param  NewState: new state of the specified peripheral clock.
    # r, ?4 H* N/ L0 r9 l" j# w2 R0 D
  13.   *   This parameter can be: ENABLE or DISABLE.+ l8 ^9 ]% r5 z7 E" ^4 z
  14.   * @retval None
    9 e/ a0 c7 Z; {6 v3 E$ W5 r" F
  15.   */
    7 L/ w1 g# s% O1 Y- B  p* D9 Z
  16. void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
    * m' d) Y1 F) R5 `* H: s
  17. {
    ' e, _3 i- H2 |7 i- G
  18.   /* Check the parameters */4 s& b3 {& }# H0 e- l
  19.   assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
    8 j5 S1 `0 f& V" W6 _
  20.   assert_param(IS_FUNCTIONAL_STATE(NewState));8 [; e+ v# M: o) g
  21.   if (NewState != DISABLE)
    . B5 g6 Q4 H' n( X9 \0 @& O
  22.   {, h; ~$ ]! T' M+ D  v4 q2 ~
  23.     RCC->APB2ENR |= RCC_APB2Periph;* K) b0 u3 t2 ]6 k: ?9 [( ?6 @! S3 g
  24.   }% r. v* D$ w$ ~  n1 t- O5 e
  25.   else/ k1 k6 ?0 y; l; L& u
  26.   {! P6 n* N9 i: f; A
  27.     RCC->APB2ENR &= ~RCC_APB2Periph;
    1 @3 ?  s/ ~3 I/ m; E  c
  28.   }
    ' A2 A) ^$ |6 H6 t# Y
  29. }
复制代码
; n( h5 h' w: L

9 h& \% R% P# ]3 G如下,FunctionalState是枚举类型,DISABLE 值为0,ENABLE 值为1,使用该参数判断是否要开相应的时钟。
# S: a$ K$ ^! _( l
) b7 A! a" p& }( |& I
  1. typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
复制代码

  e* S* S# u* E+ h% r在stm32f10x_rcc.h中,有APB2_peripheral的宏定义。) S6 v8 k0 t* k* a# m, z) |/ x
  H. ^4 p1 @( B. m1 g
  1. /** @defgroup APB2_peripheral - n1 e4 l+ n/ a; a" j6 ^
  2.   * @{
    ! H7 m) D  C5 p
  3.   */
    ' ~" F. \5 R( X/ H/ Z, X

  4. ! g* \& b- U- a6 h/ ?1 \! [. i
  5. #define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)
    ( W4 G% X1 |- t- r$ G9 v
  6. #define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
    % N5 j$ W1 U: Y8 _( F7 m
  7. #define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)( v7 G6 Y7 \! p/ Y% g; }  ^: |5 q
  8. #define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)2 \+ F6 o/ p# {  n6 J6 W* Y# a0 [
  9. #define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)
    6 C1 x; m. c) b
  10. #define RCC_APB2Periph_GPIOE             ((uint32_t)0x00000040)& T4 t5 m7 g4 d" o' S! R
  11. #define RCC_APB2Periph_GPIOF             ((uint32_t)0x00000080)7 J# g  ^# j# h1 @5 H
  12. #define RCC_APB2Periph_GPIOG             ((uint32_t)0x00000100)
    ( X$ G5 v  P3 G* R1 `1 M( ]: `
  13. #define RCC_APB2Periph_ADC1              ((uint32_t)0x00000200)9 f. Q( l3 H' x% C+ l
  14. #define RCC_APB2Periph_ADC2              ((uint32_t)0x00000400)
    0 h. M/ y& x) q0 n4 z( b( Y
  15. #define RCC_APB2Periph_TIM1              ((uint32_t)0x00000800)1 c  G0 D. }- ~! E0 Q2 U
  16. #define RCC_APB2Periph_SPI1              ((uint32_t)0x00001000)3 P. ]; y) Y6 ], N+ s8 t/ m
  17. #define RCC_APB2Periph_TIM8              ((uint32_t)0x00002000)
    . p7 B8 k  K3 t' m4 m2 w
  18. #define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)' D: V' s3 e$ U9 C5 |& R
  19. #define RCC_APB2Periph_ADC3              ((uint32_t)0x00008000)' E, }8 i4 e. h1 i, a8 R, t
  20. #define RCC_APB2Periph_TIM15             ((uint32_t)0x00010000)$ N4 U2 c4 o8 R: U1 k. q$ E
  21. #define RCC_APB2Periph_TIM16             ((uint32_t)0x00020000)
    " Y( w# e% D* Q
  22. #define RCC_APB2Periph_TIM17             ((uint32_t)0x00040000)$ ^1 b1 v& I+ n
  23. #define RCC_APB2Periph_TIM9              ((uint32_t)0x00080000); P" R/ I+ Y* u) m6 {: o3 v
  24. #define RCC_APB2Periph_TIM10             ((uint32_t)0x00100000)0 V) n9 I+ H: M% P8 d0 R7 T  J' N- W
  25. #define RCC_APB2Periph_TIM11             ((uint32_t)0x00200000)
    - _  z& r& ?5 {. F

  26. 2 L: A/ s. m2 [: m! J9 w! X. k
  27. #define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFC00002) == 0x00) && ((PERIPH) != 0x00))
复制代码
2 m% T7 C+ u( A
APB2 外设时钟使能寄存器(RCC_APB2ENR)如下,可见APB2_peripheral的宏定义正好对应了寄存器RCC_APB2ENR的对应位。% _, E) W" _$ Q& d7 v

4 Z; U4 h5 l+ A& I' J/ }5 T. _IS_RCC_APB2_PERIPH(PERIPH)宏定义实现了输入判断,当输入参数不符合RCC_APB2Periph的数据格式时,返回0。
# Y3 t) o, H: s5 U7 a- b- z' t$ A5 @- q; G. {$ P2 R5 Z: z
4T8[C(JI8{E4GB(`WEFK@VR.png ' f: u/ z4 X& \9 }# D

$ u6 ]7 M9 ?' P% i. e
  1. if (NewState != DISABLE)
    % }+ i* U: e; N! I
  2.   {6 p6 {: n3 m& o% O" G% D
  3.     RCC->APB2ENR |= RCC_APB2Periph;: l, \0 w# k: `1 [
  4.   }
    , ^" Y# H" H! s+ L/ U! O  K) v9 c
  5.   else
      S! X6 f+ G: d$ c7 T1 ]# S: y
  6.   {, ]) Z; I. j; u' p
  7.     RCC->APB2ENR &= ~RCC_APB2Periph;
    , W) I, ]& h" l9 x) p9 ?
  8.   }
复制代码
! E3 D7 f2 c, f$ u) s% c, N$ B! O
这段代码是开启对应APB2外设时钟的主要实现语句。
; W. T2 X$ n) K0 N8 }7 E
9 A1 Z. p, P. {! j如下,RCC是指向RCC_TypeDef结构体类型的指针,RCC_BASE就是RCC寄存器的映射地址,也就是RCC指针的值。
. _- ?8 l" v$ J! r$ \& Z9 s! B! {- x* W' m
  1. #define RCC                 ((RCC_TypeDef *) RCC_BASE)
复制代码
0 _6 z0 O; n# j& Y/ \# o3 w
RCC_TypeDef结构体的定义如下,
5 M* w2 n* q& `- R3 z- B4 W/ V% k' W, j) Q  J% q& B
  1. /** % l) w# U- S* d( t2 N5 j
  2.   * @brief Reset and Clock Control
      c# T9 Y5 A1 Q4 S/ i. K' U
  3.   */. Q' r. Z3 h' d4 D  A# R

  4. ' S) t& g% R2 g& p$ F9 M
  5. typedef struct
    / G, U8 ?' L$ s1 \* `0 A; D* D
  6. {5 p5 K% n' l& v6 |' C+ W' S
  7.   __IO uint32_t CR;" O  U; t8 O; l. s) E5 F
  8.   __IO uint32_t CFGR;0 W& J. k5 r( [' v0 J, H) w1 t
  9.   __IO uint32_t CIR;- V, _' y! T9 h; x) t- a  Y
  10.   __IO uint32_t APB2RSTR;
    + s' [. U6 O% K8 k
  11.   __IO uint32_t APB1RSTR;# M" ?' |, `8 P. C1 T7 j& r
  12.   __IO uint32_t AHBENR;
    1 u  i% `+ x5 f0 c. Y
  13.   __IO uint32_t APB2ENR;
    3 R9 R- d' _- @2 c( E% x
  14.   __IO uint32_t APB1ENR;
    # L2 g, J: y  y+ j
  15.   __IO uint32_t BDCR;
    7 I" o% a+ E  ]/ p3 v
  16.   __IO uint32_t CSR;
    ! l; D3 X6 U9 Y# ?3 x! W7 _# H
  17. #ifdef STM32F10X_CL  : U$ B) v: _0 \; ?+ l5 p, a  m8 R
  18.   __IO uint32_t AHBRSTR;; z. W' c3 G" T/ q: Y. f7 Z/ U
  19.   __IO uint32_t CFGR2;
    7 W% G" g& ~; j  R
  20. #endif /* STM32F10X_CL */
    % `0 X" Y/ z/ i* U8 |
  21. #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)   
    ! r9 P( S! W, O" I8 ^
  22.   uint32_t RESERVED0;
    0 S% F; k) }2 k2 @2 z
  23.   __IO uint32_t CFGR2;5 ^5 b" G* ]9 R" Q: U  W7 z
  24. #endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */ & [- Z4 |0 _) J' Y2 Y
  25. } RCC_TypeDef;
复制代码

5 m1 P' [2 U' P0 P( ?5 h* I8 `& `

" b3 P" ^" A7 c* K$ H" |/ D9 v/ m
' Z4 L7 x) Z1 D% ^/ B. o1 `! [0 V
收藏 评论0 发布时间:2022-5-2 09:13

举报

0个回答

所属标签

相似分享

官网相关资源

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