对寄存器操作的通用方法总结

转载 2016年08月30日 09:51:47

    接触了一阵子的STM32函数库,使用起来挺方便的,但是很少有处理器会有函数库,大部分情况下还是要自己来对寄存器进行操作,所以还是不要生疏了对寄存器的操作。

    对寄存器的操作有时候要考虑对其不同的位进行先后顺序不同的设置,因为这样可能达不到预期的效果,这个不太好总结,但是对寄存器操作的方法是固定的。

    在这之前,首先要明白逻辑运算符(! && ||)和位运算符(<< >> ~ | ^ &)的区别,对寄存器的操作使用的是位运算符,逻辑运算符一般用于在程序中判断逻辑中使用。

 

例如 定义一个8位的寄存器(0xf0是寄存器的地址):

#define   REG     0xFF

1)对单个的位进行赋值

(1)将寄存器REG的第5位置“1”

     REG |= (1 << 5);

 

(2)将寄存器REG的第5位清零

     REG &= ~(1 << 5);

 

(3)将寄存器REG的第3和第5位置“1”

     REG |= (1 << 5) | (1 << 3);

 

(4)将寄存器REG的第3和5位清零

     REG &= ~( (1 << 5) | (1 << 3) );

 

   该段总结如下:

                将某位置1,移位取反后使用位运算"|"

                将某位置0,移位取反后,使用位运算"&"

             

 

2)直接赋值

(1)将寄存器REG的1、2、3、5、7位置“1”

          REG = 0x5E;

(即给寄存器REG1赋值为1010 1110,这种方法多在初始化中使用)

 

(2)分别将寄存器REG的1、3、5、7位置“1”,0、2位置“0”

u8 temp;

tmep = REG;               

temp &= ~0x01;      //等价于 temp &= ~(1<<0)  将第0位清零       

temp |= (1 << 1); 

temp &= ~(1 << 2);

temp |= (1 << 3);

temp |= (1 << 5);

temp |= (1 << 7);

REG = temp;





rGPHCON &= ~((3 << 4) | (3 << 6)) ;//GPH2-GPH3是RX/TX
rGPHCON |= ((2 << 4) | (2 << 6)) ;//GPH2--TXD[0];GPH3--RXD[0]


rGPHUP = 0x00 ;

rULCON0 |= 0x03 ;     //8位数据,1位停止位
rUCON0 = 0x05 ;      

openwrt gpio控制与使用

查看datasheet和确认GPIO复用引脚scheme 通过查看mt7628 datasheet可以明确复用关系: 在这里我以I2S对应的GPIO引脚为例。 查看 mt7628...
  • JAZZSOLDIER
  • JAZZSOLDIER
  • 2017年03月23日 10:42
  • 2224

C/C++中的寄存器变量

在程序运行时,根据需要到内存中相应的存储单元中调用,如果一个变量在程序中频繁使用,例如循环变量,那么,系统就必须多次访问内存中的该单元,影响程序的执行效率。因此,C\C++语言还定义了一种变量,不是保...
  • what_can_I_say
  • what_can_I_say
  • 2014年08月31日 11:24
  • 2478

c++ 内存分配过程(通过汇编,寄存器和Memory分析)

内存分配 示例1 示例2 示例3 示例4内存分配示例1int a[5]; 汇编结果:没有分配内存示例2int a[5] = {1,2,3,4,5}汇编结果: movl $0x1c,0x1f(%e...
  • QuantumEnergy
  • QuantumEnergy
  • 2016年05月10日 18:22
  • 1170

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

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

寄存器某一位置位或者清零

应用一:将寄存器中的某一位置1或则清0,保持其他位不变。 int l_data; void SetBit(int pos)//将某一位置位的操作 { if((pos >= 0) && (p...
  • tkp2014
  • tkp2014
  • 2015年10月29日 19:24
  • 1478

对寄存器操作的通用方法总结

接触了一阵子的STM32函数库,使用起来挺方便的,但是很少有处理器会有函数库,大部分情况下还是要自己来对寄存器进行操作,所以还是不要生疏了对寄存器的操作。     对寄存器的操作有时候要考虑对其...
  • eydwyz
  • eydwyz
  • 2016年08月30日 09:51
  • 373

对寄存器操作的通用方法总结

接触了一阵子的STM32函数库,使用起来挺方便的,但是很少有处理器会有函数库,大部分情况下还是要自己来对寄存器进行操作,所以还是不要生疏了对寄存器的操作。对寄存器的操作有时候要考虑对其不同的位进行先后...
  • qq_34392093
  • qq_34392093
  • 2016年08月14日 17:07
  • 787

使用位运算对寄存器操作的通用方法

对寄存器的操作有时候要考虑对其不同的位进行先后顺序不同的设置,但是对寄存器操作的方法是固定的。      首先要明白逻辑运算符(!,&&,||)和位运算符(>,~,|,^,&)的区别:      对寄...
  • BrucePanIT
  • BrucePanIT
  • 2016年12月16日 11:30
  • 724

对寄存器操作的通用方法总结

接触了一阵子的STM32函数库,使用起来挺方便的,但是很少有处理器会有函数库,大部分情况下还是要自己来对寄存器进行操作,所以还是不要生疏了对寄存器的操作。对寄存器的操作有时候要考虑对其不同的位进行先后...
  • huangyangquan
  • huangyangquan
  • 2017年10月11日 15:17
  • 130

位操作,置位,清零

很久没有用到位相关的东东了,现在来回顾一下如何将一个变量的某位置位或清零。 #define SetBit(x, y)     (x |= 1 #define ClearBit(x, y)...
  • u012349696
  • u012349696
  • 2016年01月25日 14:37
  • 767
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对寄存器操作的通用方法总结
举报原因:
原因补充:

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