意法半导体的官方库函数里有一些define定义的标识符,如下所示:
#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)
等等定义标识符在以下的使用中
/* GPIOD Periph clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
从上面的define定义中,我们可以看出后面跟着((uint32_t)0x********)是无符号型整形数据,重点是他们在二进制中都是只有一位是1,其余位都是0的;再结合寄存器的说明。这样就不难看出,每用一个标识符只能打开一个外设的时钟,想要打开多个外设时钟应该多个标识符先或后传递给函数void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)。
本质就是将APB2 外设时钟使能寄存器(RCC_APB2ENR)中的特定一个二进制位1或置0(置1或置0,取决于传递的后一项参数是ENABLE还是DISABLE),置1的话就是把该位所对应的外设时钟打开。