当前位置:   article > 正文

Cortex M3 Bit-banding简介_cortex m3地址空间为啥用b

cortex m3地址空间为啥用b
bit-band是Cortex-M3内核中针对某一段区域进行位和字映射的机制,对于位操作,如IO控制LED,相比传递的C语言的位操作,提供了很大的方便.
bit-band 区域将存储器别名区(bit-band alias region)的一个字映射为 bit-band区的一个位. 处理器存储器映射包括两个 bit-banding 区域, 它们分别为 SRAM 和外设存储区域中的最低的 1MB.
下图是处理器的地址空间映射,包含了(bit-banding区域的映射)



Cortex-M3 存储器映射有2个32MB别名区,它们被映射为两个1MB的bit-band 区:

  • 对 32MB SRAM 别名区的访问映射为对1MB SRAM bit-band区的访问
  • 对 32MB 外设别名区的访问映射为对1MB外设bit-band区的访问


映射公式显示如何将别名区中的字与 bit-band 区中的对应位或目标位关联,映射公式如下:
bit_word_offset = (byte_offset x 32) + (bit_number x 4)
bit_word_addr = bit_band_base + bit_word_offset

这里:
  • Bit_word_offset 为bit-band存储区中的目标位的位置
  • Bit_word_addr为别名存储区中映射为目标位的字的地址
  • Bit_band_base 是别名区的开始地址
  • Byte_offset 为bit-band 区中包含目标位的字节的编号
  • Bit_number 为目标位的位位置(0-7)
下图显示了 SRAM bit-band 别名区和 SRAMbit-band 区之间的 bit-band 映射的例子:
  • 地址 0x23FFFFE0 的别名字映射为 0x200FFFFF 的bit-band 字节的位 0:
    0x23FFFFE0=0x22000000+(0xFFFFF*32)+0*4
  • 地址 0x23FFFFFC 的别名字映射为 0x200FFFFF 的bit-band 字节的位 7:
    0x23FFFFFC=0x22000000+(0xFFFFF*32)+7*4
  • 地址 0x22000000 的别名字映射为 0x20000000 的bit-band 字节的位 0:
    0x22000000=0x22000000+(0*32)+0*4
  • 地址 0x220001C 的别名字映射为 0x20000000 的bit-band 字节的位 0:
    0x2200001C=0x22000000+(0*32)+7*4


向别名区写入一个字与在 bit-band 区的目标位执行读-修改-写操作具有相同的作用.
写入别名区的字的位0决定了写入bit-band 区的目标位的值。将位 0 为1的值写入别名区表示向 bit-band 位写入1, 将位0 为0 的值写入别名区表示向bit-band 位写入 0.
别名字的位[31:1]在 bit-band 位上不起作用。写入 0x01 与写入 0xFF 的效果相同, 写入0x00 与写入0x0E 的效果相同.
读别名区的一个字返回 0x01 或0x00, 0x01 表示 bit-band 区中的目标位置位, 0x00 表示目标位清零。位[31:1]将为 0。
注:采用大端格式时,对 bit-band 别名区的访问必须以字节方式。否则访问值不可预知。 

以下是一个根据bit-band区域地址和目标位来计算bit-band alias region映射的对应字节的宏(来源于Atmel ASF的bit-banding Example):
  1. /**
  2. * \brief Calculate bit band alias address.
  3. *
  4. * Calculate the bit band alias address and return a pointer address to word.
  5. *
  6. * \param addr The byte address of bitbanding bit.
  7. * \param bit The bit position of bitbanding bit.
  8. * \callergraph
  9. */
  10. #define BITBAND_ALIAS_ADDRESS(addr, bit) \
  11. ((volatile uint32_t*)((((uint32_t)(addr) & 0xF0000000) + 0x02000000) \
  12. +((((uint32_t)(addr)&0xFFFFF)*32)\
  13. +( (uint32_t)(bit)*4))))

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/219852
推荐阅读
相关标签
  

闽ICP备14008679号