你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F1(Cortex M3内核)位带操作

[复制链接]
STMCU小助手 发布时间:2021-11-27 09:47
Cortex M3内核有两个位带区,对应的是片上RAM区和片上外设的最低的1MB地址范围,而位带别名区里面的每个字对应位带区的一个比特,也就是对位带别名区的一个字的操作相当于对位带区对应一个位的置零或者置一。Cortex M3的位带区和位带别名区如下图所示。

20170620201032702.png

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

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的变化。
  1. <p>int main ()</p><p>{</p><p>short a = 0x1001;</p><p>int p = (int)&a;</p><p>SystemInit();</p><p>USART_Configration();</p><p>printf("地址:0x%x 数据:0x%x \r\n",p,a);</p><p>
  2. </p><p>int * a_bit1 = (int *)(0x22000000+(p-0x20000000)*32+4*1); //位带地址映射</p><p>* a_bit1 = 1;                                                                           //对位带别名区中的别名进行写操作</p><p>printf("地址:0x%x 数据:0x%x \r\n",p,a);</p><p>
  3. </p><p>}</p>
复制代码

结果如下图所示。位带操作前,a = 0x1001;位带操作后,a = 0x1003,咋一看好像有问题,但其实没问题。0x1001为16进制,每位代表4个二进制位,展开为0001 0000 0000 0001,而0x1003展开为0001 0000 0000 0011,所以位带操作是可以的。

20170620203716226.png

但同时也带来了一个问题:加入我向位别名中写入2,3,4或者10,11会怎么样。经过测试,位别名一个字中就最后一位起作用,即最后一位是0就向位带区中对应位写0,否则,写1。所以,总结起来就是,位别名中写入奇数代表向位带区中对应位写1,偶数代表写0。如下图所示:

20170620210534178.png

收藏 评论0 发布时间:2021-11-27 09:47

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版