打开GPIO对应端口的时钟,这个操作在STM32的开发中再平常不过了,一般的情形大概是下面这样的:
但是,当某个函数中GPIO端口号是作为参数传递进来,而我们又需要打开端口对应的时钟时,直接写RCC_XXX等参数的法子行不通了,我们得想个办法,找到参数之间的对应关系,并且做一些运算。
首先看看我们一直使用的RCC_APB2Periph_GPIOC
到底是个啥东西,如下:
(stm32f10x_rcc.h)
唔,琢磨琢磨,这些家伙好像也可以表示成((uint32_t)1<<2)
、((uint32_t)1<<3)
······
再来看看GPIOA、GPIOC又都是些什么:
(stm32f10x.h)
可以看到,各个端口的基址(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)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。