关于位带操作的问题

2019-07-20 05:13发布

C语言中,变量的地址是一个常量,因此不能被赋值。
那么为什么单片机中,可以通过操作地址,从而控制寄存器的某一位呢?
还有,如果一开始赋值某地址=0,那么后面可以这样赋值吗:某地址=某地址+1;?
初学者求解
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
machine369
2019-07-20 20:59
哦哦 好像明白了!

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))

#define GPIOF_ODR_Addr    (GPIOF_BASE+20) //0x40021414
  
#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出

上面这段代码是不是意思就是 由GPIOF_BASE(地址)加上偏移量,得到GPIOF_ODR_Addr(地址),
由BITBAND(addr, bitnum)对应的公式计算得PF的具体一位I/O的地址,
再由 MEM_ADDR(addr) ,先通过(volatile unsigned long  *)(addr)将addr转换为指针,在加个星号*((volatile unsigned long  *)(addr)) ,于是MEM_ADDR(addr)就不再是指针(地址),而是指针指向的变量。
于是有PFout(9)=1;操作I/O口的数据输出。其实就是操作了存放在这个地址的变量,ODR寄存器的某一位。
也就是其实还是对变量进行操作,而不是地址。

对吗?

一周热门 更多>