嵌入式 寄存器某一位置位或清零

原创 2013年12月02日 14:55:19

应用一:将寄存器中的某一位置1或则清0,保持其他位不变。

int l_data;
void SetBit(int pos)//将某一位置位的操作
{
if((pos >= 0)&& (pos <=31))
{
l_data |= BIT_MASK(pos);//BIT_MASK是 掩码。就是除了这一位其余位均为0

}
}
void ClrBit(int pos)//将某一位清0的操作
{
if((pos >= 0)&& (pos <=31))
{
l_data &= ~BIT_MASK(pos);
}
}

说明:

该操作的依据如下:

1.0|1 == 1,1|1 ==1,故无论0还是1同1执行|操作,结果为1;无论0还是1同0执行|操作,都将保持不变。

2.1&0 == 0,0&0 ==0,故无论0还是1同0执行&操作,结果为0;无论0还是1同1执行&操作,都将保持不变。

应用二、判断寄存器某一位为0还是1

bool is1(int pos)//判断某一位是否为1
{
if((pos >= 0)&& (pos <=31))
{
if(l_data & (BIT_MASK(pos)) ==0x1)
{
return true;
}
else
{
return false;
}
}
}

应用三、将寄存器的某一位取反(1->0;0->1)

void ReverseBit(int pos)//将某一位取反
{
if((pos >= 0)&& (pos <=31))
{
l_data ^= BIT_MASK(pos);
}
}

说明:与0异或,保持不变;与1异或,取反。

应用四、保留2个数的不同部分,将它们合并为1个数

方法一:这两个数除了有效位之外,其他位均为0,可以将其先适当移位操作,然后在"|"运算。

例一:将temp中的低8位和t中的高4位组合成一个12位数

unsigned short temp =0x00AB;
unsigned char t = 0xC0;
temp = temp<<4;
temp |=(t>>4);

例二:保留channel的底4位,将其作为result的高4位,result的低4位设置为0xC;

channel =(channel<<4) | 0x0C;

方法二:如果这2个数除了有效位之外,其他位需要保留为1,方法是先与适当的数"|",之后2个数"&"

例一:保留temp的高4位和line的底4位,并将其组合成result。由于line的其他位全位1,所以必须先将temp的其他位全部设置为1,之后2个数"&"即可。

unsigned char result;
unsigned char temp = 0xAB;
unsigned char line = 0xFE;
temp |= 0x0F;
result = temp&line;

应用五、将一个16位数的高低8位分别拆成2个8位数,方法是通过多字节数赋给少字节数,多字节数高位字节部分将被自动截取的原理。

unsigned short temp =0xCDAB;
unsigned char fir;
unsigned char sec;
fir = temp>>8;
sec = temp;

应用六、如果CPU没有来算数移位操作,如何用逻辑移位操作实现。

例如:line = 0xFE,如何实现其的左移操作后,右边补入的是1而不是默认的0。

line =(line<<1)|0x01;

相关文章推荐

嵌入式 select用于实现I/O多路复用示例

阻塞和非阻塞   阻塞函数在完成其指定的任务以前不允许程序调用另一个函数。例如,程序执行一个读数据的函数调用时,在此函数完成读 操作以前将不会执行下一程序语句。当服务器运行到accept语句时,而没有...
  • skdkjxy
  • skdkjxy
  • 2013年12月02日 14:58
  • 497

嵌入式 信号机制经典详解以及示例

一,前言  信号是进程之间互传消息的一种方法俗称软件中断。很多比较重要的应用程序都需处理信号。信号提供了一种  处理异步事件的方法:终端用户键入中断键,则会通过信号机构停止一个程序。所以,信号可...
  • skdkjxy
  • skdkjxy
  • 2013年12月05日 09:47
  • 1222

【汇编ASM】寄存器指定位置清零

【汇编ASM】寄存器指定位置清零

嵌入式学习--step11 寄存器地址名称映射/系统时钟

1、先定义到外设基地址 #define PERIPH_BASE ((uint32_t)0x40000000) 2、定义到AHB1的外设基地址 #define AHB1PERIPH_BASE ...

嵌入式硬件寄存器操作层次

嵌入式硬件寄存器操作层次 寄存器操作—>基于CMSIS-CORE操作—>基于硬件抽象层hal操作—>基于API操作(针对hal api再次作了面向对象的封装)...

嵌入式C语言编程与AVR技巧(一)——C语言环境访问MCU寄存器

单片机的特殊功能寄存器SFR,是SRAM地址已经确定的SRAM单元,在C语言环境下对其访问归纳起来有两种方法。 1、采用标准C的强制类型转换和指针来实现 采用标准C的强制转换和指针的概念来实现访问...

嵌入式 hi3518c裸板烧写uboot简记以及内存初始化寄存器修改技巧

7、加载uboot.bin  J-Link>loadbin g:\3518\uboot_tools\3518a.bin 0x80800000  Loading binary file... [g:...
  • skdkjxy
  • skdkjxy
  • 2014年04月20日 13:49
  • 1131

嵌入式 Linux应用程序如何读取(修改)芯片寄存器的值

这一问题来自项目中一个实际的需求: 我需要在Linux启动之后,确认我指定的芯片寄存器是否与我在uboot的配置一致。 举个例子: 寄存器地址:0x20000010负责对DDR2的时序配置,该寄存器是...
  • skdkjxy
  • skdkjxy
  • 2013年12月02日 14:54
  • 1625

嵌入式寄存器操作-----C语言位操作的学习

学习嵌入式的过程中发现。C的位操作比较多,现根据资料整理如下。待以后查阅。 根据芯片手册配置寄存器的过程中,时常碰到要设置某一位或某几位的数据,根据情况置0或者置1。而对于该寄存器其他的位,我们不...
  • zeroqvb
  • zeroqvb
  • 2014年02月21日 16:11
  • 2915

嵌入式 Linux应用程序如何读取(修改)芯片寄存器的值 -学习路上

这一问题来自项目中一个实际的需求: 我需要在Linux启动之后,确认我指定的芯片寄存器是否与我在uboot的配置一致。 举个例子: 寄存器地址:0x20000010负责对DDR2的时序配置,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 寄存器某一位置位或清零
举报原因:
原因补充:

(最多只允许输入30个字)