关于使用GD32 MCU实现位带操作的指南

描述

MCS-51单片机可以简单的将P1口的第2位独立操作,如P1.2=0;P1.2=1,就是这样把P1口的第三个脚(BIT2)置0置1。对于32位ARM MCU 我们可以像51单片机一样单独的对某个端口的某一个IO单独操作吗?答案是可以的。并且这样就引入了“位带操作”的概念。简而言之,为了能够实现单独的位控制,所以就有了位带这样的操作机制。

ARM Cortex-M3处理器采用哈佛结构,可以使用相互独立的总线来读取指令和加载/存储数据。指令代码和数据都位于相同的存储器地址空间,但在不同的地址范围。程序存储器,数据存储器,寄存器和I/O端口都在同一个线性的4 GB的地址空间之内。这是Cortex-M3的最大地址范围,因为它的地址总线宽度是32位。此外,为了降低不同客户在相同应用时的软件复杂度,存储映射是按Cortex-M3处理器提供的规则预先定义的。

ARM Cortex-M3的自带的系统外设也占用了一些地址空间。如GD32F1x0系列设备的存储映射,包括指令代码、SRAM、外设和其他预先定义的区域。为了简化外设的地址译码,每个外设分配的地址空间都是1KB。

为了实现位带操作,我们可以设置GD32的位带别名区。对象可以是SRAM、I/O外设空间,从而实现对这些地方的某一位的操作。这样就可以把代码缩小、速度更快、效率更高也更安全。

在寻址空间(32位地址是 4GB)的另一地方,取个别名区空间,从这地址开始处,每一个字(32BIT)就对应SRAM或I/O的一位。这样,1MB SRAM就可以有32MB的对应别名区空间,就是1位膨胀到32位(1BIT 变为1个字)。我们对这个别名区空间开始的某一字操作,置0或置1,就等于它映射的SRAM或I/O相应的某地址的某一位的操作。

支持了位带操作后,用户可以使用普通的加载/存储指令来对单一的比特进行读写。Cortex-M3处理器提供了两个支持位带操作的区域。其中一个是SRAM区的最低1MB范围,第二个是片内外设区的最低1MB范围。这两个区域中的地址除了普通应用外,还有自己的“位带别名区”。位带别名区把每个比特扩展成一个32位的字。当用户访问位带别名区时,就可以达到访问原始比特的目的。

下面的映射公式表明了位带别名区的每个32位字如何对应位带区的某个比特。

位带别名区地址 = 位带别名区基地址 + (字节偏移×32) + (位数×4)

其中:

位带别名区地址指的是位带区目标比特对应在位带别名区的地址

位带别名区基地址指的是位带别名区的起始地址

字节偏移指的是位带区目标比特所在的字节的字节地址偏移量

位数指的是目标比特在对应字节中的位置

例如,要想访问0x2000 0200地址的第7位, 可访问的位带别名区地址是:

位别名地址= 0x2200 0000 + (0x200 * 32) + (7 * 4) = 0x2200 401C

如果对0x2200 401C进行写操作,那么0x2000 0200的第7位将会相应变化;

如果对0x2200 401C进行读操作,那么视0x2000 0200的第7位状态而返回0x0000 0001或0x0000 0000。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
gsgsg 2021-06-22
0 回复 举报
所以GD32位带别名基地址是0x2200 0000? 收起回复

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分