2

  打开GPIO对应端口的时钟,这个操作在STM32的开发中再平常不过了,一般的情形大概是下面这样的:

P1.jpg

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

  首先看看我们一直使用的RCC_APB2Periph_GPIOC到底是个啥东西,如下:

  (stm32f10x_rcc.h)

P2.jpg

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

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

  (stm32f10x.h)
P4.jpg

P3.jpg

  可以看到,各个端口的基址(BASE)相对于APB2PERIPH_BASE的偏移量分别为0x0800、0x0c00······总之,以0x0400为一档,线性增长。

  如果你把这些参数按位往右移10位的话,你会发现,得到的数字(十进制表示)是2、3、4······好像有点眼熟?

  没错,就是这样的,根据这个规律,我们可以写出这样的函数来使能GPIO对应端口的时钟:

    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)


ngHackerX86
22 声望24 粉丝

000000