二、存储器与寄存器

188 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。​

 一、什么是存储器映射

存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射(具体地址分配参考芯片数据手册及中文参考手册) 

二、什么是寄存器及寄存器映射

通过给有特定功能的内存单元起一个别名,这个别名就是我们所说的寄存器。给已经分配好地址的有特定功能的内存单元起别名的过程就叫寄存器映射。

三、如何访问STM32寄存器内容

我们知道寄存器就是一些有特定功能的内存单元,所以要访问STM32寄存器也就是操作STM32的内存单元,根据C语言指针的特点,可以使用指针来操作STM32的内存单元。
假如我们要让STM32的GPIOC的第0管脚输出低电平,我们怎么使用C语言来处理?
首先我们要知道GPIOC挂接在哪个总线上,需要知道其地址,STM32总线地址如下:

总线名称总线基地址相对外设基地址的偏移
APB10x4000 00000x0
APB20x4001 00000x0001 0000
AHB0x4001 80000x0001 8000 
外设名称外设基地址相对APB2总线的地址偏移
GPIOA0x4001 08000x0000 0800
GPIOB0x4001 0C000x0000 0C00
GPIOC0x4001 10000x0000 1000
GPIOD0x4001 14000x0000 1400
GPIOE0x4001 18000x0000 1800
GPIOF0x4001 1C000x0000 1C00
GPIOG0x4001 20000x0000 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_CRL0x4001 10000x00
GPIOC_CRH0x4001 10040x04
GPIOC_IDR0x4001 10080x08
GPIOC_ODR0x4001 100C0x0C
GPIOC_BSRR0x4001 10100x10
GPIOC_BRR0x4001 10140x14
GPIOC_LCKR0x4001 10180x18

同样使用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仿真器,还需要设置仿真器