关于位带操作的问题

2019-07-20 05:13发布

C语言中,变量的地址是一个常量,因此不能被赋值。
那么为什么单片机中,可以通过操作地址,从而控制寄存器的某一位呢?
还有,如果一开始赋值某地址=0,那么后面可以这样赋值吗:某地址=某地址+1;?
初学者求解
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
Psheng
1楼-- · 2019-07-20 09:50
不能给常量赋值  但是可以给指针指向的地址赋值啊。也可以随意加减运算的
peng1554
2楼-- · 2019-07-20 13:03
 精彩回答 2  元偷偷看……
edmund1234
3楼-- · 2019-07-20 17:07
C语言跟STM对地址的操作没啥分别, C能做的STM也可以, STM能做的C也可以, 是你的理解有误了
又或者你给一例子, STM做了些是C没有的
machine369
4楼-- · 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寄存器的某一位。
也就是其实还是对变量进行操作,而不是地址。

对吗?
warship
5楼-- · 2019-07-20 23:32
 精彩回答 2  元偷偷看……
machine369
6楼-- · 2019-07-21 04:30
还有下面这条语句
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
为什么不直接写成
#define MEM_ADDR(addr)  *(addr)  
呢?

一周热门 更多>