目录
前言
CM3有着非常复杂的存储器系统。对于原来只接触过51单片机的初学者来说,这种指令系统真的是令人头疼。
CM3的存储器系统可以说是有着脱胎换骨的变化,有着相当多的特性。我自己水平有限,在这里就简单说说自己对于这套系统的了解。
存储器映射
CM3的存储器的映射是预定义好的,规定了存储器的哪个位置使用哪条总线。CM3只有一个单一固定的存储器映射,无论是哪个芯片厂商生产的任何一款CM3单片机,器NVIC和MPU都在相同的位置。不过,虽然如此,CM3对于存储器所定出的条条框框仍然具有相当大的变化空间的。不同的芯片厂商生产的不同型号的单片机有着不相同的存储器空间分配的方法,这在我学习的一开始给我照成了相当大的困扰。
在学习前我们首先应该搞清楚实物单片机与理论上的CM3的差别。CM3理论上的SRAM的空间为512MB,地址为0X20000000--0X3FFFFFFF。但是在我用实物STM32F103ZE上这个SRAM只有64KB的大小,地址为0X20000000--0X20100000。类似的还有储存空间的代码区。CM3理论上给出的空间为从0X00000000到0X1FFFFFFF,总共为512MB。但是到实物上,代码区的空间为0X80000000--0X1FFFFFFF,总共为512KB。
这个问题我一开始并没有注意到,导致我在0X20100000以后的地址空间写数据时都无法成功写入,并且也解决了为什么我的PC指针总是0X80000000以后的数值(因为芯片制造商根本就没有给代码区0X80000000之前的空间,那么程序计数器指针当然不可能会有0X80000000之前的值!)
让我们先看下CM3理论上的预定义的存储器映射
因为不同的芯片生产商的储存空间分配方案不同,在这里只说下存储器高512MB空间的情况。高512MB地址空间为0XE0000000--0XFFFFFFFF,这里面是CM3的内核。这里面包含了系统级的组件件,内部私有外设总线,外部私有外设总线以及提供者定义的系统级外设。
私有的外设总线有两条:
AHB 私有外设总线,这个只能用于CM3的内部的AHB外设,分别是NVIC,FPB,DWT以及ITM。
APB 私有外设总线,这个既用在CM3内部的APB设备也可以用于外部设备(相对于CPU内核而言 的外部,例如GPIO口),CM3还能允许芯片制造商再添加一些片上的APB外设到APB总线 上,这些外设是通过APB接口进行访问的。
存储器的缺省访问
CM3拥有一个缺省的储存访问许可,这个能够防止用户代码访问系统关键储存空间,保护类似于NVIC等的关键部件,缺省访问在以下的条件生效:
没有配备MPU
配备了MPU,但是MPU没有启动。
缺省访问许可如下:
位带操作
这个操作能够使我们使用普通的加载、储存指令来操作单一的比特。在CM3中,有两个带设计了这种位带操作。一个是SRAM的最低1MB的范围,另一个是片内外设区的最低的1MB区域。(对于STM32F103系列的单片机,其SRAM和外设寄存器全部都被映射到了一个位段区内,允许执行单一的位操作。)
这些区域中的地址除了可以像普通的RAM一样使用外,它们还有各自的“位带别名区”,位带别名区把原来的每一位都膨胀为32位的字。当通过位带别名区去访问这些字时就可以实现直接操作原始的位。如SRAM的1MB的位带区对应的位带别名区为32M。位膨胀的示意图如下所示:
非对齐数据传输
CM3支持使用非对齐的地址访问数据存储器。就是说,传递的地址值可以不是4的倍数,具体的来说就是传输半字数据的地址可以不是2的倍数,传输一字数据的地址可以不是4的倍数。
存储器可以理解成一块一块的,每一块都是一个字节大小,里面存放着八位的二进制数据,每一块都有着独一无二的编号也就是所谓的地址。若干块组成一层,对于不同位数的机器每层所以含有的储存块的数量是不相同的,不过都要保证每层都要放下与该芯片对应位数的二进制数据。比如,51单片机是8位机器,每层只有一个数据块,而CM3为32位的,每层就得有有四个才能放下一个完整的32位数据,所谓的对齐就是这些数据要放在相同的层内。51单片机为8位的,也就没有所谓的对齐,但是对于32位的机器就可能出现低十六位存在一层而高十六位放在了另外一层,这个就是所谓的没有对齐。在之前的ARM处理器上,这种不对齐的操作室非法的,会引发数据流产(Data abort)异常。而对于CM3这种操作是被允许的。非对齐示例如下: