×
单片机 > 单片机程序设计 > 详情

STM32F1(Cortex M3内核)位带操作

发布时间:2020-05-28 发布时间:
|

 本文参考《STM32_参考手册》2.3.2 位段


               《CM3权威指南》第五章 存储器系统


Cortex M3内核有两个位带区,对应的是片上RAM区和片上外设的最低的1MB地址范围,而位带别名区里面的每个字对应位带区的一个比特,也就是对位带别名区的一个字的操作相当于对位带区对应一个位的置零或者置一。Cortex M3的位带区和位带别名区如下图所示。



从位带区到位带别名区有如下的映射关系:


bit_word_addr =bit_band_base + (byte_offset×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执行读-改-写操作有着相同的效果。


下面在STM32F1用一段简单的程序实践一下。如下:在主函数中定义了一个短整数a = 0x1001,然后对其第一位的位别名进行写操作,观察位带操作前后a的变化。


int main ()

{

short a = 0x1001;

int p = (int)&a;

SystemInit();

USART_Configration();

printf("地址:0x%x 数据:0x%x rn",p,a);


int * a_bit1 = (int *)(0x22000000+(p-0x20000000)*32+4*1); //位带地址映射

* a_bit1 = 1;                                                                           //对位带别名区中的别名进行写操作

printf("地址:0x%x 数据:0x%x rn",p,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。如下图所示:



关键字:STM32F1  Cortex  M3内核  位带操

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机中断源的扩展方法