【小技巧】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)

相關文章
相關標籤/搜索