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

猜你喜欢

转载自blog.csdn.net/mrlixirong/article/details/48793871