STM32入門學習之GPIO(STM32F030F4P6基於CooCox IDE)(暫存器操作版)
阿新 • • 發佈:2019-01-30
依然,直接上程式碼
#include "stm32f0xx.h" #include "stm32_lib/inc/stm32f0xx_rcc.h" #include "stm32_lib/inc/stm32f0xx_gpio.h" int main(void) { //IOPAEN=1,使能GPIOA的時鐘 RCC->AHBENR |= RCC_AHBENR_GPIOAEN; //設定IO口工作模式,GPIOA_MODER4=0x01,通用IO口 GPIOA->MODER |= GPIO_MODER_MODER4_0; GPIOA->MODER &= ~GPIO_MODER_MODER4_1; //設定輸出型別,GPIO_OTYPER_OT_4=1,推輓輸出 GPIOA->OTYPER &= ~GPIO_OTYPER_OT_4; //設定速率,GPIO_OSPEEDER_OSPEEDR4=0x01,中速,10MHz GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR4_0; GPIOA->OSPEEDR &= GPIO_OSPEEDER_OSPEEDR4_1; //設定上下拉,GPIO_PUPDR_PUPDR4=0x00,無上拉,無下拉 GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR4_0; GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR14_1; //GPIOA->BSRR |= GPIO_BSRR_BS_4;//輸出高電平 GPIOA->BSRR &= ~GPIO_BSRR_BS_4;//輸出低電平 while(1){} }
首先,我們看,RCC->AHBENR是什麼意思?
-> 很形象,箭頭,指示的意思。
其實,這個RCC是一個指標,AHBENR是結構體成員
RCC->AHBENR 等同 RCC.AHBENR,大家可嘗試在CooCox IDE中輸入“RCC.",結果點會自動變成->
我們可以在stm32f0xx.h標頭檔案中找到關於RCC結構體的定義
上面定義的是RCC_TypeDef,我們可以繼續檢視關於”RCC” 的定義,見STM32F0xx.h第791行。
知道了RCC,那RCC_BASE又是什麼呢,見STM32F0xx.h第735行。
AHBPERIPH_BASE又是什麼呢?
好了,一切真相大白,RCC->AHBENR,就是指暫存器地址。
我們看該暫存器到底有哪些東西,如下圖所示,我們要配置GPIOA的時鐘,只需要將IOPA置1即可。
方法很多,第一種就是純粹的移位與或操作。
RCC->AHBENR |=(1<<17);
另外一種方法,我們繼續檢視標頭檔案stm32f0xx_rcc.h
檢視stm32f0xx.h,這裡就得到了IOPAEN的位置了,其巨集定義為 RCC_AHBENR_GPIOAEN
如果要設定這個位的值為1,就直接用“或” RCC->AHBENR |= RCC_AHBENR_GPIOAEN
如果要設定這個位的值為0,就先取反,再“與” RCC->AHBENR &= ~RCC_AHBENR_GPIOAEN;
那其他GPIO的配置,也是如此。