用寄存器点亮一个LED灯

如何用寄存器点亮一个led灯:
使用寄存器创建模板:
tu9
首先我们在stm32f4xx.h这个文件中来对外设端口(本次我还是用GPIOC3)
进行配置:
第一步:我们在这个文件中宏定义一下C语言的外设基地址,代码如下:

#define PERIPH_BASE ((unsigned int)0x40000000)、
(用到了数据类型的强制转换,避免遇到错误)
第二步:分别定义总线基地址,因为GPIO的总线基地址都是挂接在AHB1上,
所以我们定义的代码如下:

#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)
第三步:我们对GPIOC进行配置:
首先,对GPIOC的基地址定义,这个基地址我们需要查找stm32f4xx中文参考手册,
在中文参考手册的第二章的存储器和总线架构的存储器映射里有所有外设对应的地址和总线。
如图:
tu10
我们可以看到GPIO的边界地址是0x4002 0800,由前两行代码可知,AHB1PERIPH_BASE是0x4002 0000
所以对GPIOC的基地址的定义就可以写成:

#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800)
然后我们需要对GPIOC的模式寄存器进行定义,在中文参考手册的GPIO寄存器一节中由对模式寄存器的讲解。
如图:
tu11
我们可以看到,它的偏移地址是0x00,也就是说模式寄存器的地址就是GPIOC的基地址,下面我们对它进行定义:

#define GPIOC_MODER (unsigned int)(GPIOC_BASE+0x00)
然后是对置位复位寄存器(GPIOC_BSRR)进行定义,同样看中文参考手册,如图:
tu12
我们看到它的偏移地址是0x18,所以代码如下:

#define GPIOC_BSRR (unsigned int)(GPIOC_BASE+0x18)
(如果不进行强制类型转换,我们的编译器就会认为它是一个立即数,不是地址)
因为STM32要求每次使用外设都必须对相应外设开时钟,所以我们要对时钟外设基地址进行定义,
在存储器映射一章有,RCC的偏移地址是0x4002 3800,所以定义如下:

#define RCC_BASE (AHB1PERIPH_BASE + 0x3800)
然后对AHB1进行开时钟,对查看中文参考手册,在RCC寄存器的外设时钟使能一节,如图:
tu13
我们看到,它的偏移地址是0x30,所以它的定义如下:

#define RCC_AHB1ENR (unsigned int)(RCC_BASE+0x30)
这样我们对stm32f4xx.h就配置完了
第四步是写main函数
main函数代码如下:
int main()
{
RCC_AHB1ENR |= 1<<2;
GPIOC_MODER = (1<<(2*3));
while(1)
{
GPIOC_BSRR=(1<<(16+3));
delay(0xFFFFF);
GPIOC_BSRR=(1<<(3));
delay(0xFFFFF);
}
}
接下来我们对main函数进行分析:
首先查看中文参考手册,RCC AHB1外设时钟使能寄存器,即RCC_AHB1ENR,如图:
tu14
图中寄存器的第2位对应的是GPIOC,所以我们用1左移两位,进行与运算,从而让第2位置1,使能IO端口C时钟。

查看参考手册,如图:
tu11
将模式寄存器的第6位和第七位置为01,为通用输出模式。(写成(1<<(2*3)的好处是能看到是GPIOC的第几个端口)

查看参考手册,如图:
tu15
将置位复位寄存器的第19位置为1,是为了让PC3复位,点亮LED.
然后延时,再熄灭,最后达成闪烁的效果。