
讲述如何使用C语言来对底层寄存器进行封装
内容:
存储器映射
寄存器与寄存器映射
C语言访问寄存器
存储器映射
程序存储器、数据存储器、寄存器和I/O 端口排列在同一个顺序的4 GB 地
址空间内
存储器映射:
存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器
分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。
存储器区域划分
ARM 将这4GB 的存储器空间,平均分成了8 块区
域,每块区域的大小是512MB,这个容量是非常大的,因此芯片厂商就在每块容
量范围内设计各自特色的外设,要注意一点每块区域容量占用越大,芯片成本就
越高,所以说我们使用的STM32 芯片都是只用了其中一部分。

在这8 个Block 里面,Block0、Block1 和Block2 这3 个块是我们最为关
心的。因为它包含了STM32 芯片的内部Flash、RAM 和片上外设。
Block0 内部又划分了好多个功能块,我们按地址从低到高顺序依次
介绍。c语言内存分配对应
0x0000 0000-0x0007 FFFF:取决于BOOT 引脚,为FLASH、系统存储器、
SRAM 的别名。
0x0008 0000-0x07FF FFFF:预留。
0x0800 0000-0x0807 FFFF:片内FLASH,我们编写的程序就放在这一区域
(512KB)。
0x0808 0000-0x1FFF EFFF:预留。
0x1FFF F000-0x1FFF F7FF:系统存储器,里面存放的是ST 出厂时烧写好的
isp 自举程序,用户无法改动。使用串口下载的时候需要用到这部分程序。
0x1FFF F800-0x1FFF F80F:选项字节,用于配置读写保护、
BOR 级别、软件/硬件看门狗以及器件处于待机或停止模式下的复位。当芯片不
小心被锁住之后,我们可以从RAM 里面启动来修改这部分相应的寄存器位。
0x1FFF F810-0x1FFF FFFF:预留。
(2)Block1 内部区域功能划分
Block1 用于设计片内的SRAM,我们使用的STM32F103ZET6 的SRAM 是64KB。
从图5.1.1 中可以看到Block1 内部又划分了几个功能块,我们按地址从低到高
顺序依次介绍。
0x2000 0000-0x2000 FFFF:SRAM,容量为64KB。
0x2001 0000-0x3FFF FFFF:预留。
(3)Block2 内部区域功能划分
Block2 用于设计片内外设,根据外设总线速度的不同,Block2 被划分为AHB
和APB 两部分,APB 又被分成APB1 和APB2 总线。这些都可以在图5.1.1 中看到,
我们按地址从低到高顺序依次介绍。
0x4000 0000-0x4000 77FF:APB1 总线外设。
0x4000 7800-0x4000 FFFF:预留。
0x4001 0000-0x4001 3FFF:APB2 总线外设。
0x4001 4000-0x4001 7FFF:预留。
0x4001 8000-0x4002 33FF:AHB 总线外设。
0x4002 4400-0x5FFF FFFF:预留。
在Block3/4/5 中还包含了FSMC 扩展区域,这3 个块可用于扩展外部存储器,
比如SRAM,NORFLASH 和NANDFLASH 等。
寄存器和寄存器映射
lock2 这片区域是用来设计片上外设的,
由于Cortex-M3 内核是32 位的,所以存储器内部是以四个字节为一个单元,每
一个单元对应不同的功能,当我们控制这些单元时也就可以控制外设。每一个单
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-66178-1.html
中国可以在附近海