STM32单片机的位带操作(Bit-Banding)是一种特殊的内存映射技术,允许开发者以原子操作的方式对特定的内存位进行读写,从而提高了对GPIO端口、寄存器以及其他外设单个位的操作效率。
1、位带区与位带别名区
STM32单片机的内存空间分为位带区和位带别名区。
位带区包括SRAM区的最低1MB(地址范围0x2000_0000-0x200F_FFFF)和片内外设区的最低1MB(地址范围0x4000_0000-0x400F_FFFF)。
位带别名区将位带区中的每个位映射到一个32位的字,实现了从按字节寻址到按位寻址的转变。
2、地址映射关系
位带别名区中的每个字都对应到位带区的一个位。
映射公式为:bit_word_addr = bit_band_base + (byte_offset × 32) + (bit_number × 4)。
bit_word_addr:别名存储器区中字的地址。
bit_band_base:别名区的起始地址(SRAM位带别名区起始地址为0x22000000,外设位带别名区起始地址为0x42000000)。
byte_offset:包含目标位的字节在位带区中的序号。
bit_number:目标位所在位置(0-31)。
3、位带操作的优势
提高了代码的可读性和执行效率,尤其是对GPIO端口和寄存器的单个位进行操作时。
实现了原子操作,避免了多线程或中断环境下可能出现的竞态条件和数据不一致性问题。
简化了对硬件I/O密集型底层程序的操作,以及对大范围使用位标志的系统程序的管理。
4、C语言中的位带操作
在C语言中,使用宏定义来实现位带操作。
通过定义将“位带地址+位序号”转换成别名地址的宏,以及将别名地址转换成指针类型的宏,可以在C代码中方便地进行位带操作。
示例宏定义:
#define BITBAND(addr, bitnum) ((addr & 0xF0000000) + 0x2000000 + ((addr & 0xFFFFF) << 5) + (bitnum << 2))
#define MEM_ADDR(addr) *((volatile unsigned long *) (addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
使用volatile关键字定义要访问的变量,以确保编译器每次都如实地把新数值写入存储器。
本文凡亿企业培训原创文章,转载请注明来源!
暂无评论