购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 存储器的地址分配(映射)

STM32单片机的存储器由程序存储器、数据存储器和寄存器组成,为了能访问这些存储器,需要给它们分配地址,该过程又称存储器映射。

2.2.1 存储器的划分与地址分配

存储器通常以1字节(Byte,简写为B)为一个存储单元,1字节由8位(bit,简写为b)组成。STM32单片机可管理4GB的存储空间,其地址编号采用8位十六进制数,地址编号范围为0x0000 0000~0xFFFF FFFF,第1个字节单元的地址为0x0000 0000,第2个字节单元的地址为0x0000 0001。

为了方便管理与使用,STM32单片机将4GB空间均分成8个块(block0~block7),每个块为512MB,用作不同的功能,如图2-3所示,比如0x4000 0000~0x5FFF FFFF范围的地址分配给片上外设的存储器,其中0x4001 0800~0x4001 0BFF共1024个地址分配给单片机Port A端口(GPIOA端口,PA0~PA15)的寄存器。

图2-3 STM32单片机存储器的地址分配图

2.2.2 寄存器的命名

STM32单片机内部有大量的片上外设,这些外设都配置了一些寄存器,用户通过编写程序读/写这些寄存器来操作这些外设。

寄存器是具有特定功能的存储器,与其他类型的存储器一样,寄存器也分配有地址,利用地址可以访问寄存器。STM32单片机寄存器的地址编号由8位十六进制数组成。由于单片机内部有大量的外设,每个外设有不少特定功能的寄存器,若采用普通方法访问某个寄存器,一要知道其功能,二要知道其地址编号,这样很不方便。给寄存器取别名来代替地址编号可以很好地解决这个问题。

寄存器的名称尽量能反映其功能且容易记忆。比如,地址为0x4001 0C10的寄存器,其功能是对单片机GPIOB端口(PB0~PB15)进行置位(置1)或复位(清0),该寄存器默认的名称为GPIOB_BSRR,“GPIOB”表示GPIOB端口,“_”左边为寄存器所属的外设名称,右边为寄存器功能的英文头字母,BSRR意为“B——bit(位)、S——Set(置位)、R——Reset(复位)、R——Register(寄存器)”。

2.2.3 基地址与偏移地址

1.总线的基地址

片上外设通过APB1、APB2、AHB总线与Cortex-M3内核连接,APB1总线挂载低速外设(其寄存器地址为0x4000 0000~0x4000 77FF),APB2总线挂载高速外设(其寄存器地址为0x4001 0000~0x4001 3FFF),AHB总线挂载高速外设(其寄存器地址为0x4001 8000~0x4002 33FF),如图2-3所示。

总线的起始地址称为该总线的基地址,APB1总线的基地址(也即整个512MB block 2片上外设的基地址)为0x4000 0000,APB2总线的基地址为0x4001 0000,AHB总线的基地址为0x4001 8000。

2.外设的基地址

APB1、APB2、AHB总线都连接着很多外设,每个外设都占用一定的存储空间,也都有基地址。以GPIO端口为例,该端口属于APB2总线外设,可分为GPIOA~GPIOG共7个外设,其基地址见表2-1。更多外设的基地址可查看图2-3,比如图中标出定时器TIM3的地址范围为0x4000 0400~0x4000 07FF,TIM3的基地址为0x4000 0400。

表2-1 GPIOA~GPIOG外设的基地址

3.寄存器的地址

各个外设都配有寄存器,这些寄存器的地址在该外设的地址范围内,其地址一般采用“外设基地址+偏移地址”的方式给出。以GPIOB端口为例,该端口有7个寄存器,GPIOB端口的基地址为0x4001 0C00,其各个寄存器的地址见表2-2,这些寄存器为32位的,占用4个字节单元,以最低字节单元的地址作为寄存器的地址。

对于同类型外设的寄存器,采用“外设基地址+偏移地址”的方式表示非常方便。GPIOA端口的基地址是0x4001 0800,其置位/复位寄存器GPIOA_BSRR的地址为“0x4001 0800+0x10”,即该寄存器的地址为0x4001 0810。

表2-2 GPIOB端口各个寄存器的地址 VPuaIORmbEjc32Q3U30fT3w9CVJnbqFfKO5c71l5ApExKD+CqNwcSEQEh343Egze

点击中间区域
呼出菜单
上一章
目录
下一章
×