对于STM32别名区的理解
2. 它有什么好处?
答1: 是这样的,记得MCS51吗? MCS51就是有位操作,以一位(BIT)为数据对象的操作,
答2:
//
//
//
//
//
//
//
//
// 支持位带操作的两个内存区的范围是:
// 0x2000_0000‐0x200F_FFFF(SRAM 区中的最低1MB)
// 0x4000_0000‐0x400F_FFFF(片上外设区中的最低1MB)
#define PERIPH_BB_BASE ((u32)0x42000000)
它 举 的 例子中, 这个 PERIPH_BB_BASE ((u32)0x42000000) 是如何确定的?
这个文档 是 STM32 的 Firware library
Bit-Banding的意思是:对Bit-Band区一个字的操作对应实际存储器中的一位。
在STM32F10xxx的技术参考手册中第2.3.3节,有这样的描述:
Cortex-M3存储器映像包括两个位段(bit-band)区。这两个位段区将别名存储器区中的每个字映射到位段存储器区的一个位,在别名存储区写入一个字具有对位段区的目标位执行读-改-写操作的相同效果。
在STM32F10x里,外设寄存器和SRAM都被映射到一个位段区里,这允许执行单一的位段的写和读操作。
下面的映射公式给出了别名区中的每个字是如何对应位带区的相应位的:
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)
其中:
- bit_word_addr 是别名存储器区中字的地址,它映射到某个目标位。
- bit_band_base 是别名区的起始地址。
- byte_offset 是包含目标位的字节在位段里的序号
- bit_number 是目标位所在位置(0-31)
下面的例子说明如何映射别名区中SRAM地址为0x20000300的字节中的位2:
0x22006008 = 0x22000000 + (0x300*32) + (2*4).
对0x22006008地址的写操作和对SRAM中地址0x20000300字节的位2执行读-改-写操作有着相同的效果。
读0x22006008地址返回SRAM中地址0x20000300字节的位2的值(0x01 or 0x00)。
请参考《Cortex-M3技术参考手册》以了解更多有关位段的信息。
上面例子中的基地址0x22000000和你所讲的基地址0x42000000是固定在芯片中,你必须用这两个地址;基地址0x22000000用于操作内置RAM,基地址0x42000000用于操作内置外设。
STM32位定义
你可以才用先用__at来指定一个变量的ARM地址
然后在定义,那么你在程序中就可以象51中一样使用了,我就是这么定义的.
例:
unsigned long System_Mark[10]
#define System_Mark0
#define System_Mark0_OFFSET
#define Moter_State_Changed
#define Moter0_Direction
那么我在程序就中就可以对:
Moter_State_Changed =1;/Moter_State_Changed =0/ if (Moter_State_Changed)
Moter_State_Changed =~Moter_State_Changed;Moter_State_Changed =!Moter_State_Changed;
STM32别名 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)