[技术问答] 位操作的实现原理是什么

[复制链接]
4800|9
 楼主| gejigeji521 发表于 2021-9-22 12:41 | 显示全部楼层 |阅读模式
pi, gp, IO, GPIO, AD, se
P12 = 0;
比如我们这么直接给某个管脚写1或者写0
这是怎么实现呢、
  1. #define GPIO_PIN_ADDR(port, pin)    (*((volatile uint32_t *)((GPIO_PIN_DATA_BASE+(0x20*(port))) + ((pin)<<2))))
  2. #define P00             GPIO_PIN_ADDR(0, 0) /*!< Specify P00 Pin Data Input/Output */
#define P12             GPIO_PIN_ADDR(1, 2) /*!< Specify P12 Pin Data Input/Output */

我们分解这个宏
  1. (*((volatile uint32_t *)((GPIO_PIN_DATA_BASE+(0x20*(port))) + ((pin)<<2))))
(*( X ))
X 代表下面的一行,表示通过地址x找到这个位置的数据
(volatile uint32_t *)     ((GPIO_PIN_DATA_BASE+(0x20*(port))) + ((pin)<<2))
上面的第一个括号标准强制转换成uint32类型的指针,表示后面跟的是地址
(GPIO_PIN_DATA_BASE+(0x20*(port)))      +      ((pin)<<2)
上面左边第一个宏表示PIN的起始地址,后面是偏移地址
0x20表示每一个port具备32个PIN,通过乘以32找到该端口的第一个地址段,而对应的pin的地址在这个地址基础上加上某个数,这个数字是从第三位的二进制开始的。

 楼主| gejigeji521 发表于 2021-9-22 12:41 | 显示全部楼层
不知道我这么理解是不是对的。
 楼主| gejigeji521 发表于 2021-9-22 12:41 | 显示全部楼层
我看16位的单片机也是这么玩的。
twjiang 发表于 2021-9-22 13:06 | 显示全部楼层
看看 2's Complement Trick 窍门大集 Trick 骚操作

https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

mutable 发表于 2021-9-22 17:31 | 显示全部楼层
我还好奇,这不是做芯片的人,考虑的事么?
原来说的是程序
木木guainv 发表于 2021-10-14 16:54 | 显示全部楼层
就是c语言的基础啊
tpgf 发表于 2021-10-14 16:56 | 显示全部楼层
这个我没法解释啊
heimaojingzhang 发表于 2021-10-14 16:58 | 显示全部楼层
就是为了对其中的一个引脚操作啊
keaibukelian 发表于 2021-10-14 16:59 | 显示全部楼层
独立管教操作啊
labasi 发表于 2021-10-14 17:03 | 显示全部楼层
如何分解宏啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

196

主题

2465

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部