打印

STM32(cortex_m3) 的 Bit-Banding 怎样理解?

[复制链接]
8142|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
michaelc21|  楼主 | 2007-11-14 15:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32(cortex_m3) 的 Bit-Banding 该怎样理解?

原文是这样的:

Bit-Banding
The Cortex-M3 memory map includes two bit-band memory regions. These regions map each word in an alias region of memory to a bit in a bit-band region of memory. Writing to a word in the alias region has the same effect as a read-modify-write operation on the targeted bit in the bit-band region.
All the STM32F10x peripheral registers are mapped in a bit-band region. This feature is consequently intensively used in functions which perform single bit set/reset in order to reduce and optimize code size.
......
/* Peripheral address in the alias region */
#define PERIPH_BB_BASE ((u32)0x42000000)

它 举 的 例子中, 这个 PERIPH_BB_BASE ((u32)0x42000000) 是如何确定的?

这个文档 是 STM32 的 Firware library  的 PDF文件。





沙发
浪淘沙| | 2007-11-14 17:06 | 只看该作者

Bit-Banding 怎样理解?

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用于操作内置外设。

使用特权

评论回复
板凳
michaelc21|  楼主 | 2007-11-14 17:49 | 只看该作者

谢谢你! 在继续阅读,试验...


   正在 关注 《Cortex-M3技术参考手册》有关位段的信息 , 及其它。
 
   谢谢。

   

使用特权

评论回复
地板
andychenli| | 2008-9-4 18:06 | 只看该作者

STM32位定义

你可以才用先用__at来指定一个变量的ARM地址
然后在定义,那么你在程序中就可以象51中一样使用了,我就是这么定义的.
例:
unsigned long System_Mark[10]    __attribute__  ((at(0x20000200)));       //开辟了10个32位的RAM来定义位标志
#define System_Mark0             0x20000200
#define System_Mark0_OFFSET     (System_Mark0 - SRAM_BASE)
#define Moter_State_Changed        ( *(vu32 *)(SRAM_BB_BASE | (System_Mark0_OFFSET<<5 | 0<<2)))
#define Moter0_Direction                 ( *(vu32 *)(SRAM_BB_BASE | (System_Mark0_OFFSET<<5 | 0<<2)))

那么我在程序就中就可以对:
Moter_State_Changed =1;/Moter_State_Changed =0/ if (Moter_State_Changed)
Moter_State_Changed =~Moter_State_Changed;Moter_State_Changed =!Moter_State_Changed;

使用特权

评论回复
5
28182900| | 2013-1-25 12:26 | 只看该作者

使用特权

评论回复
6
h3243212| | 2013-7-25 10:31 | 只看该作者
浪淘沙 发表于 2007-11-14 17:06
Bit-Banding的意思是:对Bit-Band区一个字的操作对应实际存储器中的一位。在STM32F10xxx的技术参考手册中第 ...

你的例子没看懂呃- -不是0x2000 0300的字节中的位2么,怎么等式里变成了0x2200 0000,不应该是0x2000 0000作为bit_band_base么

使用特权

评论回复
7
人生之际| | 2013-8-3 19:16 | 只看该作者
虽然有某些便利性,但其实并不推荐使用bit-band,因为ST也提供了BSSR和BRR寄存器来置位复位。
不如以后如果有降本要求,转到STM32F100或STM32F0xx的时候,程序要改过,因为Cortex-M0的核心,不支持bit-band

使用特权

评论回复
8
outstanding| | 2013-8-3 21:01 | 只看该作者

使用特权

评论回复
9
人生之际| | 2013-8-4 08:53 | 只看该作者
h3243212 发表于 2013-7-25 10:31
你的例子没看懂呃- -不是0x2000 0300的字节中的位2么,怎么等式里变成了0x2200 0000,不应该是0x2000 0000 ...

那是你没看懂

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

31

帖子

0

粉丝