1. 程式人生 > >STM32入門學習之GPIO(STM32F030F4P6基於CooCox IDE)(暫存器操作版)

STM32入門學習之GPIO(STM32F030F4P6基於CooCox IDE)(暫存器操作版)

依然,直接上程式碼

#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的配置,也是如此。