Cortex M3内核有两个位带区,对应的是片上RAM区和片上外设的最低的1MB地址范围,而位带别名区里面的每个字对应位带区的一个比特,也就是对位带别名区的一个字的操作相当于对位带区对应一个位的置零或者置一。Cortex M3的位带区和位带别名区如下图所示。 ' d9 p7 P1 |& E* o' y0 G" @( @ 从位带区到位带别名区有如下的映射关系:/ A. z7 R( a. z4 n6 n- {$ R3 o6 N bit_word_addr =bit_band_base + (byte_offset×32) + (bit_number×4) 6 L5 R) k/ s# I0 E$ a; n2 V - `& T; _0 ~7 D- y 其中:bit_word_addr是别名存储器区中字的地址,它映射到某个目标位。 bit_band_base是别名区的起始地址。 byte_offset是包含目标位的字节在位段里的序号 bit_number是目标位所在位置(0-31) " B8 h$ g3 x4 m$ y- r- x; X8 r3 u 7 _0 B& O. y' ^/ a$ }2 l% |1 f 例子: 下面的例子说明如何映射别名区中SRAM地址为0x20000300的字节中的位2: 0x22006008 = 0x22000000 + (0x300×32) +(2×4). 对0x22006008地址的写操作与对SRAM中地址0x20000300字节的位2执行读-改-写操作有着相同的效果。! K0 v! u/ m* w5 p2 d 7 P& p0 Z! z* P9 U: K3 U 下面在STM32F1用一段简单的程序实践一下。如下:在主函数中定义了一个短整数a = 0x1001,然后对其第一位的位别名进行写操作,观察位带操作前后a的变化。
结果如下图所示。位带操作前,a = 0x1001;位带操作后,a = 0x1003,咋一看好像有问题,但其实没问题。0x1001为16进制,每位代表4个二进制位,展开为0001 0000 0000 0001,而0x1003展开为0001 0000 0000 0011,所以位带操作是可以的。 但同时也带来了一个问题:加入我向位别名中写入2,3,4或者10,11会怎么样。经过测试,位别名一个字中就最后一位起作用,即最后一位是0就向位带区中对应位写0,否则,写1。所以,总结起来就是,位别名中写入奇数代表向位带区中对应位写1,偶数代表写0。如下图所示:- |- @2 P7 k g) f. B |
【经验分享】STM32F1 GPIO工作原理
【经验分享】STM32F0xx_DMA收发USART数据配置详细过程
【经验分享】STM32F1和STM32F4 区别
【经验分享】STM32F1系列之常用外设说明
【经验分享】STM32介绍
【经验分享】STM32F1x系列——Flash 模拟 EEPROM
【经验分享】STM32F1在MDK下新建标准库函数工程
【经验分享】stm32f1的存储器与复位
【经验分享】STM32F10X-架构
【经验分享】stm32F1 us延时函数