依然,直接上代码
#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,大家可尝试在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的配置,也是如此。