打開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)