基于Cortex-M3内核的处理器位操作技术——“位带”

基于Cortex-M3内核的处理器位操作技术——“位带”

1.传统的位操作

我们传统的位操作方法是用“&(与)”、“|(或)”指令来实现对数据某一位的置一或者清零。而这个过程一般是:
1.把数据加载到寄存器中
2.在寄存器间对数据进行运算
3.将算好的数据写入到内存中
所以单个位操作过程将耗时数个时钟周期,并且增加了代码量。

2. 位带操作

位带技术
1.作用:用一个物理地址(32位),控制一位数据。可实现对设备区和SRAM区存储空间寄存器的位操作而不需要任何特殊的指令。

2.原理:Cortex-M3系列处理器的可位寻址区由位带区(SRAM存储区和外设存储区地址的前1MB区域)和位带别名区(SRAM和外设存储区的前32MB~64MB(大小为32MB))组成。分别将位带区1MB大小空间的每一位映射(可以理解为将字的地址作为对应位的地址)到位带别名区中的一个字(32位)。通过对字地址写入数据控制位。

3.计算公式:
寄存器地址物理地址A(位于前1MB)
位数目n
位带区基地址B
位带别名区基地址C
位带别名区地址D
D = C ( 位 带 别 名 区 基 地 址 ) + ( A − B ) ∗ 0 X 20 + 4 ∗ n D=C(位带别名区基地址)+(A-B)*0X20+4*n D=C+AB0X20+4n
注意:上述位带别名区地址计算公式为16进制和10进制的混合运算(4*n为10进制。
1 ∗ 0 X 20 代 表 1 个 字 节 膨 胀 32 字 节 1*0X20代表1个字节膨胀32字节 10X20132(一个地址代表的是一个字节))
上面公式看起来比较复杂,其实理解起来就是两个区域从头到尾分别为1位膨胀为4字节(32位),依次对应。

3.C语言举例

3.1硬件led灯的电路

在这里插入图片描述
低电平有效

3.2代码

首先用keil5建立好工程,导入基本文件。

#include "system.h"
#include "stm32f10x_it.h"
#define pc0 (*((unsigned long*) 0x42220180 )) //宏定义一个指针,指向位带别名区
void LED_Configure(void);  //c端口初始化函数声明
void main()
{
    
    
	  LED_Configure();   //c端口初始化    
		pc0 = 0;          //按照我stm32单片机上面的硬件电路,低电平点亮
}	
void LED_Configure(void)
{
    
    
	GPIO_InitTypeDef GPIO_InitStructure;   //声明结构体变量GPIO_InitStructure
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//打开c口时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  //定义工作引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //最大输出频率
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //定义为推挽输出
	GPIO_Init(GPIOC,&GPIO_InitStructure);
    GPIO_SetBits(GPIOC,GPIO_Pin_0); //熄灭灯
}

3.3得到的结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44464349/article/details/112859019