RCC_APB2PeriphClockCmd函数用来开启或关闭APB2外设时钟,
该函数总览如下,
- /**
- * @brief Enables or disables the High Speed APB (APB2) peripheral clock.
- * @param RCC_APB2Periph: specifies the APB2 peripheral to gates its clock.
- * This parameter can be any combination of the following values:
- * @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
- * RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
- * RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
- * RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
- * RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
- * RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
- * RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11
- * @param NewState: new state of the specified peripheral clock.
- * This parameter can be: ENABLE or DISABLE.
- * @retval None
- */
- void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
- {
- /* Check the parameters */
- assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
- assert_param(IS_FUNCTIONAL_STATE(NewState));
- if (NewState != DISABLE)
- {
- RCC->APB2ENR |= RCC_APB2Periph;
- }
- else
- {
- RCC->APB2ENR &= ~RCC_APB2Periph;
- }
- }
复制代码
如下,FunctionalState是枚举类型,DISABLE 值为0,ENABLE 值为1,使用该参数判断是否要开相应的时钟。
- typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
复制代码
在stm32f10x_rcc.h中,有APB2_peripheral的宏定义。
- /** @defgroup APB2_peripheral
- * @{
- */
- #define RCC_APB2Periph_AFIO ((uint32_t)0x00000001)
- #define RCC_APB2Periph_GPIOA ((uint32_t)0x00000004)
- #define RCC_APB2Periph_GPIOB ((uint32_t)0x00000008)
- #define RCC_APB2Periph_GPIOC ((uint32_t)0x00000010)
- #define RCC_APB2Periph_GPIOD ((uint32_t)0x00000020)
- #define RCC_APB2Periph_GPIOE ((uint32_t)0x00000040)
- #define RCC_APB2Periph_GPIOF ((uint32_t)0x00000080)
- #define RCC_APB2Periph_GPIOG ((uint32_t)0x00000100)
- #define RCC_APB2Periph_ADC1 ((uint32_t)0x00000200)
- #define RCC_APB2Periph_ADC2 ((uint32_t)0x00000400)
- #define RCC_APB2Periph_TIM1 ((uint32_t)0x00000800)
- #define RCC_APB2Periph_SPI1 ((uint32_t)0x00001000)
- #define RCC_APB2Periph_TIM8 ((uint32_t)0x00002000)
- #define RCC_APB2Periph_USART1 ((uint32_t)0x00004000)
- #define RCC_APB2Periph_ADC3 ((uint32_t)0x00008000)
- #define RCC_APB2Periph_TIM15 ((uint32_t)0x00010000)
- #define RCC_APB2Periph_TIM16 ((uint32_t)0x00020000)
- #define RCC_APB2Periph_TIM17 ((uint32_t)0x00040000)
- #define RCC_APB2Periph_TIM9 ((uint32_t)0x00080000)
- #define RCC_APB2Periph_TIM10 ((uint32_t)0x00100000)
- #define RCC_APB2Periph_TIM11 ((uint32_t)0x00200000)
- #define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFC00002) == 0x00) && ((PERIPH) != 0x00))
复制代码
APB2 外设时钟使能寄存器(RCC_APB2ENR)如下,可见APB2_peripheral的宏定义正好对应了寄存器RCC_APB2ENR的对应位。
IS_RCC_APB2_PERIPH(PERIPH)宏定义实现了输入判断,当输入参数不符合RCC_APB2Periph的数据格式时,返回0。
- if (NewState != DISABLE)
- {
- RCC->APB2ENR |= RCC_APB2Periph;
- }
- else
- {
- RCC->APB2ENR &= ~RCC_APB2Periph;
- }
复制代码
这段代码是开启对应APB2外设时钟的主要实现语句。
如下,RCC是指向RCC_TypeDef结构体类型的指针,RCC_BASE就是RCC寄存器的映射地址,也就是RCC指针的值。
- #define RCC ((RCC_TypeDef *) RCC_BASE)
复制代码
RCC_TypeDef结构体的定义如下,
- /**
- * @brief Reset and Clock Control
- */
- typedef struct
- {
- __IO uint32_t CR;
- __IO uint32_t CFGR;
- __IO uint32_t CIR;
- __IO uint32_t APB2RSTR;
- __IO uint32_t APB1RSTR;
- __IO uint32_t AHBENR;
- __IO uint32_t APB2ENR;
- __IO uint32_t APB1ENR;
- __IO uint32_t BDCR;
- __IO uint32_t CSR;
- #ifdef STM32F10X_CL
- __IO uint32_t AHBRSTR;
- __IO uint32_t CFGR2;
- #endif /* STM32F10X_CL */
- #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
- uint32_t RESERVED0;
- __IO uint32_t CFGR2;
- #endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */
- } RCC_TypeDef;
复制代码
|