第四章 什么是寄存器

第四章 什么是寄存器

目录

第四章 什么是寄存器

1 什么是寄存器

2 W55MH32

3 芯片里面有什么

3.1 ICode总线

3.2 驱动单元

3.2.1 DCode总线

3.2.2 系统总线

3.2.3 DMA总线

3.3 被动单元

3.3.1 内部的闪存存储器

3.3.2 内部的SRAM

3.3.3 FSMC

3.3.4 AHB到APB的桥

4 存储器映射

4.1 存储器映射

4.1.1 存储器区域功能划分

4.1.1.1 存储器Block0内部区域功能划分

4.1.1.2 储存器Block1内部区域功能划分

4.1.1.3 储存器Block2内部区域功能划分

5 寄存器映射

5.1 W55MH32的外设地址映射

5.1.1 总线基地址

5.1.2 外设基地址

5.2 C语言对寄存器的封装

5.2.1 封装总线和外设基地址

5.2.2 封装寄存器列表

5.3 修改寄存器的位操作方法

5.3.1 把变量的某位清零

5.3.2 把变量的某几个连续位清零

5.3.3 对变量的某几位进行赋值。

5.3.4 对变量的某位取反


本章参考资料:《W55MH32_数据手册_V1.0.0》、《W55MH 32参考手册_V1.0.0》

学习本章时,配合《W55MH 32参考手册_V1.0.0》“存储器和总线架构”及“通用I/O(GPIO)”章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。

1 什么是寄存器

        我们经常说寄存器,那么什么是寄存器?这是我们本章需要讲解的内容,在学习的过程中,大家带着这个疑问好好思考下,到最后看看大家能否用一句话给寄存器下一个定义。

2 W55MH32

        我们开发板中使用的芯片是100pin的W55MH32L,具体见下图。这个就是我们接下来要学习的高性能以太网单片机,它将带领我们进入嵌入式的殿堂。

        芯片四周是引脚,开发板中把芯片的引脚引出来,连接到各种传感器上,然后在W55MH32L上编程(实际就是通过程序控制这些引脚输出高电平或者低电平)来控制各种传感器工作, 通过做实验的方式来学习W55MH32芯片的各个资源。开发板是一种评估板,板载资源非常丰富,引脚复用比较多, 力求在一个板子上验证芯片的全部功能。

3 芯片里面有什么

        我们看到的芯片是已经封装好的成品,主要由内核和片上外设组成。若与电脑类比,内核与外设就如同电脑上的CPU与主板、内存、显卡、硬盘的关系。

        W55MH32采用的是Cortex-M3内核,内核即CPU,负责在内核之外设计部件并生产整个芯片,这些内核之外的部件被称为核外外设或片上外设。 如GPIO、USART(串口)、I2C、SPI等都叫做片上外设。

        芯片(这里指内核,或者叫CPU)和外设之间通过各种总线连接,其中驱动单元有4个,被动单元也有4个, 具体见图 W55MH32系统框图 。为了方便理解,我们都可以把驱动单元理解成是CPU部分,被动单元都理解成外设。 下面我们简单介绍下驱动单元和被动单元的各个部件。

3.1 ICode总线

        ICode中的I表示Instruction,即指令。我们写好的程序编译之后都是一条条指令,存放在FLASH中, 内核要读取这些指令来执行程序就必须通过ICode总线,它几乎每时每刻都需要被使用,它是专门用来取指的。

3.2 驱动单元

3.2.1 DCode总线

        DCode中的D表示Data,即数据,那说明这条总线是用来取数的。我们在写程序的时候,数据有常量和变量两种, 常量就是固定不变的,用C语言中的const关键字修饰,是放到内部的FLASH当中的,变量是可变的,不管是全局变量还是局部变量都放在内部的SRAM。 因为数据可以被Dcode总线和DMA总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。

3.2.2 系统总线

        系统总线主要是访问外设的寄存器,我们通常说的寄存器编程,即读写寄存器都是通过这根系统总线来完成的。

3.2.3 DMA总线

        DMA总线也主要是用来传输数据,这个数据可以是在某个外设的数据寄存器,可以在SRAM,可以在内部的FLASH。 因为数据可以被Dcode总线和DMA总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。

3.3 被动单元

3.3.1 内部的闪存存储器

        内部的闪存存储器即FLASH,我们编写好的程序就放在这个地方。内核通过ICode总线来取里面的指令。

3.3.2 内部的SRAM

        内部的SRAM,即我们通常说的RAM,程序的变量,堆栈等的开销都是基于内部的SRAM。内核通过DCode总线来访问它。

3.3.3 FSMC

        FSMC的英文全称是Flexible static memory controller,叫灵活的静态的存储器控制器, 是W55MH32中一个很有特色的外设, 通过FSMC,我们可以扩展内存,如外部的SRAM,NANDFLASH和NORFLASH。但有一点我们要注意的是,FSMC只能扩展静态的内存, 即名称里面的S:static,不能是动态的内存,比如SDRAM就不能扩展。

3.3.4 AHB到APB的桥

        从AHB总线延伸出来的两条APB2和APB1总线,上面挂载着W55MH32各种各样的特色外设。我们经常说的GPIO、串口、I2C、SPI这些外设就挂载在这两条总线上, 这个是我们学习W55MH32的重点,就是要学会编程这些外设去驱动外部的各种设备。

4 存储器映射

        在W55MH32系统框图中,程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个 4GB 的线性地址空间内。数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。可访问的存储器空间被分成 8 个主要块,每个块为 512MB。我们在编程的时候,可以通过他们的地址找到他们,然后来操作他们(通过C语言对它们进行数据的读和写)。

4.1 存储器映射

        存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射, 具体见图 存储器映射 。如果给存储器再分配一个地址就叫存储器重映射。

4.1.1 存储器区域功能划分

        在这4GB的地址空间中,ARM已经粗线条的平均分成了8个块,每块512MB,每个块也都规定了用途,具体分类见表格 存储器功能分类 。 每个块的大小都有512MB,显然这是非常大的,芯片厂商在每个块的范围内设计各具特色的外设时并不一定都用得完,都是只用了其中的一部分而已。

序号

用途

地址范围

Block 0

Code

0x0000 0000 ~ 0x1FFF FFFF(512MB)

Block 1

SRAM

0x2000 0000 ~ 0x3FFF FFFF(512MB)

Block 2

片上外设

0x4000 0000 ~ 0x5FFF FFFF(512MB)

Block 3

FSMC 的 bank1 ~ bank2

0x6000 0000 ~ 0x7FFF FFFF(512MB)

Block 4

FSMC 的 bank3 ~ bank4

0x8000 0000 ~ 0x9FFF FFFF(512MB)

Block 5

FSMC 寄存器

0xA000 0000 ~ 0xCFFF FFFF(512MB)

Block 6

没有使用

0xD000 0000 ~ 0xDFFF FFFF(512MB)

Block 7

Cortex-M3 内部外设

0xE000 0

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值