|
|
本帖最后由 xusheng 于 2025-11-23 22:35 编辑
【疑问】:
客户咨询GD32E235是否支持bit-band 位带功能,原厂专家回复不支持。
但在GD32E23x_Firmware_Library_V2.4.0固件包中,却看到相关定义如下,故产生疑问。
- /* FILE: Firmware\CMSIS\GD\GD32E23x\Include\gd32e23x.h */
- /* main flash and SRAM memory map */
- #define FLASH_BASE ((uint32_t)0x08000000U) /*!< main FLASH base address */
- #define SRAM_BASE ((uint32_t)0x20000000U) /*!< SRAM base address */
- /* SRAM and peripheral base bit-band region */
- #define SRAM_BB_BASE ((uint32_t)0x22000000U) /*!< SRAM bit-band base address */
- #define PERIPH_BB_BASE ((uint32_t)0x42000000U) /*!< peripheral bit-band base address */
复制代码
【信息整理】:
1. GD32E235内核为Cortex-M23,芯片用户手册的 “1. 系统及存储器架构 -- 1.3 存储器映射” 章节,没有位带操作相关说明;
2. GD32F4xx内核为Cortex-M4, 可以在用户手册中看到相关说明如下:
1.3.1. 位带操作
为了减少“读-改-写”操作的次数,Cortex®-M4处理器提供了一个可以执行单原子比特操作的位带功能。存储器映射包含了两个支持位带操作的区域。其中一个是SRAM区的最低1MB范围,第二个是片内外设区的最低1MB范围。 这两个区域中的地址除了普通应用外,还有自己的“位带别名区”。位带别名区把每个比特扩展成一个32位的字。当用户访问位带别名区时,就可以达到访问原始比特的目的。
下面的公式表明了位带别名区中的每个字如何对应位带区的相应比特或目标比特。
bit_word_addr =bit_band_base +(byte_offset×32)+(bit_number×4)
其中:
- bit_word_addr指的是位带区目标比特对应在位带别名区的地址;
- bit_band_base指的是位带别名区的起始地址;
- byte_offset指的是位带区目标比特所在的字节的字节地址偏移量;
- bit_number指的是目标比特在对应字节中的位置(0-7)。
3. Cortex-M 内核位带支持表
内核型号 架构版本 位带支持
M0 / M0+ v6-M 不支持
M23 v8-M 不支持
M33 v8-M 不支持
M3 v7-M 支持
M4 / M4F v7-M 支持
M7 v7-M 不支持
M55 v8.1-M 不支持
M85 v8.1-M 不支持
【结论】
1. 根据核对芯片数据手册及相关资料,确认GD32E235 不支持bit-banding。
2. 关于固件包代码中存在bit-banding相关定义,应该是有错误,具体还待与原厂核实确认。
【bit-banding 作用】
1. 位带操作是 ARM Cortex-M 系列中[color=var(--md-box-samantha-deep-text-color) !important]特定内核(M3, M4/M4F)的硬件原生特性,设计目的是通过 “别名地址映射” 机制,实现对 SRAM 和外设寄存器单个位的独立读写控制,简化位操作代码。
2. 实现对内存或外设寄存器中单个位的原子读写,地址转换和操作由硬件完成,无需软件干预。
3. 软件按位操作通过“读-修改-写”三步实现(如 *(reg) |= (1<<bit)),这不是原子操作,在多任务或中断环境下可能会发生错误。
【bit-banding使用说明】
1. 位带别名区:
ARM Cortex-M4 内核在内存映射中定义了两个固定的位带别名区:
- 外设位带别名区 基地址 0x4200 0000
- SRAM位带别名区 基地址 0x2200 0000
2. 硬件地址映射:
- Alias_Addr = PERIPH_BB_BASE + ((A - PERIPH_BASE) << 5) + (b << 2)
复制代码
- Alias_Addr = SRAM_BB_BASE + ((S - SRAM_BASE) << 5) + (b << 2)
复制代码
3. 使用bit-banding 访问内存0x2000 0200 的第7位
- // 该地址对应的SRAM位带别名区地址是
- bit_word_addr = 0x2200 0000 + (0x200 * 32) + (7 * 4)= 0x2200 401C
复制代码 说明:
- 位序号 → 32位字索引:每个bit位对应位带别名区中的一个32位字
- 地址 左移5位:等价于乘以32
- bit位 左移2位:位带别名区地址 按4字节对齐进行读写操作
|
|