打开GPIO对应端口的时钟,这个操做在STM32的开发中再日常不过了,通常的情形大概是下面这样的:函数
可是,当某个函数中GPIO端口号是做为参数传递进来,而咱们又须要打开端口对应的时钟时,直接写RCC_XXX等参数的法子行不通了,咱们得想个办法,找到参数之间的对应关系,而且作一些运算。测试
首先看看咱们一直使用的RCC_APB2Periph_GPIOC
究竟是个啥东西,以下:ui
(stm32f10x_rcc.h)spa
唔,琢磨琢磨,这些家伙好像也能够表示成((uint32_t)1<<2)
、((uint32_t)1<<3)
······3d
再来看看GPIOA、GPIOC又都是些什么:code
(stm32f10x.h)blog
能够看到,各个端口的基址(BASE)相对于APB2PERIPH_BASE
的偏移量分别为0x0800、0x0c00······总之,以0x0400为一档,线性增加。ip
若是你把这些参数按位往右移10位的话,你会发现,获得的数字(十进制表示)是二、三、4······好像有点眼熟?开发
没错,就是这样的,根据这个规律,咱们能够写出这样的函数来使能GPIO对应端口的时钟:it
RCC_APB2PeriphClockCmd((uint32_t)(1<<(((uint32_t)GPIOC - APB2PERIPH_BASE)>>10)),ENABLE);
封装一下变成函数的话就是这样:
void gpio_clk_enable(GPIO_TypeDef * gpio) { //打开对应端口的时钟,对应关系根据地址规律得出。 RCC_APB2PeriphClockCmd((uint32_t)(1<<(((uint32_t)gpio - APB2PERIPH_BASE)>>10)),ENABLE); }
(以上规律仅适用于STM32F1系列,测试代码基于库函数版本V3.5)