打印
[技术问答]

位操作的实现原理是什么

[复制链接]
4598|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gejigeji521|  楼主 | 2021-9-22 12:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pi, gp, IO, GPIO, AD, se
P12 = 0;
比如我们这么直接给某个管脚写1或者写0
这是怎么实现呢、
#define GPIO_PIN_ADDR(port, pin)    (*((volatile uint32_t *)((GPIO_PIN_DATA_BASE+(0x20*(port))) + ((pin)<<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 */

我们分解这个宏
(*((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

使用特权

评论回复
5
mutable| | 2021-9-22 17:31 | 只看该作者
我还好奇,这不是做芯片的人,考虑的事么?
原来说的是程序

使用特权

评论回复
6
木木guainv| | 2021-10-14 16:54 | 只看该作者
就是c语言的基础啊

使用特权

评论回复
7
tpgf| | 2021-10-14 16:56 | 只看该作者
这个我没法解释啊

使用特权

评论回复
8
heimaojingzhang| | 2021-10-14 16:58 | 只看该作者
就是为了对其中的一个引脚操作啊

使用特权

评论回复
9
keaibukelian| | 2021-10-14 16:59 | 只看该作者
独立管教操作啊

使用特权

评论回复
10
labasi| | 2021-10-14 17:03 | 只看该作者
如何分解宏啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

177

主题

2229

帖子

8

粉丝