【小技巧】STM32中如何使能GPIO对应端口的时钟

  打开GPIO对应端口的时钟,这个操做在STM32的开发中再日常不过了,通常的情形大概是下面这样的:函数

P1.jpg

  可是,当某个函数中GPIO端口号是做为参数传递进来,而咱们又须要打开端口对应的时钟时,直接写RCC_XXX等参数的法子行不通了,咱们得想个办法,找到参数之间的对应关系,而且作一些运算。测试

  首先看看咱们一直使用的RCC_APB2Periph_GPIOC究竟是个啥东西,以下:ui

  (stm32f10x_rcc.h)spa

P2.jpg

  唔,琢磨琢磨,这些家伙好像也能够表示成((uint32_t)1<<2)((uint32_t)1<<3)······3d

  再来看看GPIOA、GPIOC又都是些什么:code

  (stm32f10x.h)
P4.jpgblog

P3.jpg

  能够看到,各个端口的基址(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)

相关文章
相关标签/搜索