什么是寄存器
大纲
- 认识芯片的顺序
- 芯片里面有什么
- 存储器映射
- 存储器区域功能划分
- 寄存器映射
- 手册怎么看
- 小结
具体案例
认识芯片的顺序
在绝大多数时候在芯片上是有个点的(如下图),按照这个芯片上的点逆时针旋转,即为从第一个引脚到最后一个引脚
在极个别情况下,芯片可能是没有小点或者有几个小点,此时,我们可以通过从丝印左边开始逆时针旋转,当然在有点时,优先点(小的为准)
首先这个芯片上一块连续的内存,其中又分为了几个区间进行不同的操作功能,对于其中的某一个区间如block2,是来操作外设的,而外设又根据速度不同划分APB1,APB2,AHB几个部分,而在这块block区,内存也是连续的,不同的功能对应的内存不同,所以可以通过想对偏移,来找到绝对地址
芯片里面有什么
芯片(这里指内核,或者叫 CPU)和外设之间通过各种总线连接,其中驱动单元有 4 个,被动单元也有 4 个,具体见图 STM32F10xx 系统框图 。为了方便理解,我们都可以把驱动单元理解成是CPU 部分,被动单元都理解成外设。
ICode
ICode 中的 I 表示 Instruction,即指令。我们写好的程序编译之后都是一条条指令,存放在 FLASH中,内核要读取这些指令来执行程序就必须通过 ICode 总线,它几乎每时每刻都需要被使用,它是专门用来取指的。
DCode 总线
DCode 中的 D 表示 Data,即数据,那说明这条总线是用来取数的。我们在写程序的时候,数据有常量和变量两种,常量就是固定不变的,用 C 语言中的 const 关键字修饰,是放到内部的 FLASH当中的,变量是可变的,不管是全局变量还是局部变量都放在内部的 SRAM。因为数据可以被Dcode 总线和 DMA 总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。
系统总线
系统总线主要是访问外设的寄存器,我们通常说的寄存器编程,即读写寄存器都是通过这根系统总线来完成的。
DMA 总线
DMA 总线也主要是用来传输数据,这个数据可以是在某个外设的数据寄存器,可以在 SRAM,可以在内部的 FLASH。因为数据可以被 Dcode 总线和 DMA 总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。
内部的闪存存储器
内部的闪存存储器即 FLASH,我们编写好的程序就放在这个地方。内核通过 ICode 总线来取里面的指令。
内部的 SRAM
内部的 SRAM,即我们通常说的 RAM,程序的变量,堆栈等的开销都是基于内部的 SRAM。内核通过 DCode 总线来访问它。
FSMC
FSMC 的英文全称是 Flexible static memory controller,叫灵活的静态的存储器控制器,是STM32F10xx 中一个很有特色的外设,通过 FSMC,我们可以扩展内存,如外部的 SRAM,NANDFLASH 和 NORFLASH。但有一点我们要注意的是,FSMC 只能扩展静态的内存,即名称里面的
S:static,不能是动态的内存,比如 SDRAM 就不能扩展。
AHB 到 APB 的桥
从 AHB 总线延伸出来的两条 APB2 和 APB1 总线,上面挂载着 STM32 各种各样的特色外设。我们经常说的 GPIO、串口、I2C、SPI 这些外设就挂载在这两条总线上,这个是我们学习 STM32 的重点,就是要学会编程这些外设去驱动外部的各种设备。
存储器映射
存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射,具体见图存储器映射 。如果给存储器再分配一个地址就叫存储器重映射<