创建寄存器模板
创建该寄存器模板时,需要先取找到适合的启动文件,可以去所购买的板子配套的资料中找到启动文件存放在创建的文件的目录下,打开keil时可以将这个文件包含进去,进行编译一下会发现会报两个错误,这是为什么呢?让我们来仔细看一下这个启动文件是如何开始这一个程序的。
可以看到一上电进行的是一个复位函数,先执行SystemInit(),再转而去执行我们的main文件。所以我们需要再添加一个main.c,在main.c文件中执行SystemInit()函数来欺骗编译器,其实这个SystemInit()是一个用来初始化时钟的函数,不过我们现阶段还没有使用到时钟所以就可以先不写内容进去。
使用寄存器点亮一个灯
1、首先看原理图查找引脚的位置是哪一个
例如:LED1的引脚是PE5
2、在数据手册中找到存储器的映射,即GPIOE的起始地址
0x40011800
找到寄存器ODR的偏移地址,用基地址加上偏移的地址
0x4001180C
#include "stm32f10x.h"
int main(void)
{
*(unsigned int *)0x4001180C &= ~(1<<5);
}
void SystemInit(void) //为了欺骗编译器
{
}
向这个寄存器所对应的引脚上写入0,这时可以试着向开发版上烧录这段代码,你会发现灯没有亮,这是为什么呢?
这是因为STM32的引脚还有其他的寄存器,例如端口配置寄存器。这个时候需要设置端口是什么状态,是输入还是输出。
3、端口配置寄存器
很显然,这个寄存器的偏移地址是0x00,即 0x40011800
所以
#include "stm32f10x.h"
int main(void)
{
*(unsigned int *)0x40011800 |= ((1)<<(5*4));
*(unsigned int *)0x4001180C &= ~(1<<5);
}
void SystemInit(void) //为了欺骗编译器
{
}
编译烧录发现,灯还是没有被点亮,这是为什么呢?
由这张图可以知道,GPIOE是挂载在APB2总线上的,是由RCC来控制的。现在RCC是关闭的情况,也就意味着GPIOE无法正常的工作。那我们就需要打开这个时钟。
4、打开时钟
#include "stm32f10x.h"
int main(void)
{
*(unsigned int *)0x40021018 |= (1<<6);//打开APB2上GPIOE的时钟
*(unsigned int *)0x40011800 &= ~(0x0F<<(5*4)); //清零端口配置低寄存器的5引脚对应的
*(unsigned int *)0x40011800 |= (3<<(5*4));//配置端口配置低寄存器的5引脚为通用输出,速度为50Hz
*(unsigned int *)0x4001180C &= ~(1<<5); //配置PE5的输出寄存器为0
}
void SystemInit(void) //为了欺骗编译器
{
}
最后,灯成功被点亮