
STM32中的位带操作讲解
5星
- 浏览量: 0
- 大小:None
- 文件类型:PDF
简介:
本文深入浅出地介绍STM32微控制器中位带操作的概念、原理及其应用方法,帮助读者掌握如何高效进行寄存器位级别的编程控制。
STM32中的位带(bit-band)操作源自8051单片机的概念,并在CM3架构下得到了进一步的发展与增强。
位带操作使得通过普通的加载存储指令对单一比特进行读写成为可能,这一特性基于两个内存区域:SRAM区的最低1MB范围以及片上外设区的最低1MB范围。这两个区域内不仅支持常规RAM访问,还拥有各自的“位带别名区”,将每个比特映射为一个32位字。通过访问这些字的位置别名地址即可实现对原始比特的操作。
在CM3架构中,涉及到以下概念:
* 位带区域:能够执行位带操作的内存范围
* 别名地址:对于该地址的读写最终影响到的是原址中的单个比特(这一过程中包括了地址转换)
具体来说,在这两个支持位带功能的区域内,每个比特都会映射至别名区的一个32位字——仅最低有效位(LSB)有实际意义。当访问一个别名地址时,系统会将其转化为对应的位带地址。
- 对于读操作:首先从该位置的32位字中提取出所需比特,并右移以使其成为LSB。
- 对于写操作:需要被设置或清除的比特则向左移动到正确的位置上,并执行一个原子性的“读-改-写”过程来实现对目标内存单元的实际修改。
支持位带功能的具体地址范围如下:
* SRAM区域为0x2000_0000至0x200F_FFFF
* 片上外设区则从0x4000_000到延伸至 末尾的1MB
对于SRAM位带中的某一位,如果它位于字节地址A,并且其位置编号为n(范围在[0,7]之间),那么该比特对应的别名地址计算方式如下:
AliasAddr = 0x2200_0000 + ((A- 0x20_00_0) *8+n)*4
同样的,对于片上外设位带中的某一位,其字节的地址为A且位置编号为n(同样范围在[0,7]之间)时:
AliasAddr = 为了简化计算过程,上述公式中,“*4”表示一个32位整数由四个字节组成;“*8”则反映了每个字节包含八个比特的事实。
利用这种机制可以实现类似51单片机的GPIO控制功能。在实际应用过程中需要定义相应的IO口操作宏:
#define BITBAND(addr, bitnum) ((addr & 0xF0_00_00)+ 2 * (addr & 0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
同时,还需定义IO口地址映射:
GPIOA_ODR_Addr = GPIOA_BASE + 12
GPIOB_ODR_Addr = GPIOB_BASE + 12
GPIOC_ODR_Addr = GPIOC_BASE + 12
GPIOD_ODR_Addr = GPIOD_BASE + 12
GPIOE_ODR_Addr = GPIOE_BASE + 12
GPIOF_ODR_Addr = GPIOF_BASE + 12
全部评论 (0)


