一、什么是存储器映射
存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射(具体地址分配参考芯片数据手册及中文参考手册)
二、什么是寄存器及寄存器映射
通过给有特定功能的内存单元起一个别名,这个别名就是我们所说的寄存器。给已经分配好地址的有特定功能的内存单元起别名的过程就叫寄存器映射。
三、如何访问STM32寄存器内容
我们知道寄存器就是一些有特定功能的内存单元,所以要访问STM32寄存器也就是操作STM32的内存单元,根据C语言指针的特点,可以使用指针来操作STM32的内存单元。
假如我们要让STM32的GPIOC的第0管脚输出低电平,我们怎么使用C语言来处理?
首先我们要知道GPIOC挂接在哪个总线上,需要知道其地址,STM32总线地址如下:
总线名称 | 总线基地址 | 相对外设基地址的偏移 |
---|---|---|
APB1 | 0x4000 0000 | 0x0 |
APB2 | 0x4001 0000 | 0x0001 0000 |
AHB | 0x4001 8000 | 0x0001 8000 |
外设名称 | 外设基地址 | 相对APB2总线的地址偏移 |
---|---|---|
GPIOA | 0x4001 0800 | 0x0000 0800 |
GPIOB | 0x4001 0C00 | 0x0000 0C00 |
GPIOC | 0x4001 1000 | 0x0000 1000 |
GPIOD | 0x4001 1400 | 0x0000 1400 |
GPIOE | 0x4001 1800 | 0x0000 1800 |
GPIOF | 0x4001 1C00 | 0x0000 1C00 |
GPIOG | 0x4001 2000 | 0x0000 2000 |
所以使用C语言宏可以定义外设基地址:#define PERIPH_BASE ((unsigned int)0x40000000)
然后分别定义APB2总线基地址:#define APB2PERIPH_BASE (PERIPH_BASE+0x00010000)
然后还需要知道端口外设地址,同样使用C语言宏定义其端口地址:#define GPIOC_BASE (APB2PEARIPH_BASE+0x1000)
有了外设端口地址后,还需要知道GPIOC端口的寄存器地址,如下表格:
寄存器名称 | 寄存器地址 | 相对GPIOC基址的偏移 |
---|---|---|
GPIOC_CRL | 0x4001 1000 | 0x00 |
GPIOC_CRH | 0x4001 1004 | 0x04 |
GPIOC_IDR | 0x4001 1008 | 0x08 |
GPIOC_ODR | 0x4001 100C | 0x0C |
GPIOC_BSRR | 0x4001 1010 | 0x10 |
GPIOC_BRR | 0x4001 1014 | 0x14 |
GPIOC_LCKR | 0x4001 1018 | 0x18 |
同样使用C语言宏定义其端口寄存器地址:
#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14)
#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18)
在编译器里认为(GPIOC_BASE+0x00)是一个立即数,所以要强制转换为地址,要操作里面的数,所以要加上*
(四)寄存器模板创建
1、创建两个文件夹Obj和User
0bj文件夹:用于存放编译产生的c/汇编/链接的列表清单、调试信息、hex文件、预览信息、封装库等文件。
User 文件夹:用于存放用户编写的main.c、STM32F1启动文件、stm32f10x.h头文件。/2、/2
2、新建工程
打开μVision Keil5软件,点击Project->New uVision Project...新建工程,选择芯片STM32103ZE
点击确定,后面弹出的界面为在线软件包升级界面,不用管,直接关掉,会出现工程目录
3、添加文件
双击工程目录
将文件类型选择为*.*
工程目录下的Object文件和Listings文件是Keil5生成中间文件用的,将头文件及启动文件添加到工程中
4、配置魔术棒选项卡
点击魔术棒,将Use MicroLIB打对勾,这个库用printf输出要用
生成hex文件,hex文件是下载进入单片机使用的
可以自己选择Object文件的生成路径
同样也可以自己选择Listings文件的生成路径
如何设置了ARM仿真器,还需要设置仿真器