关于IO口程序问题

2019-07-14 16:20发布

帮忙解释两句程序,关于IO口的。作为小白,用STM32的时候一直用的是库函数,所以遇到这两句就蒙圈了,快来一波大神砸死我吧~

1. GPIOG->MODER&=~(3<<(9*2));GPIOG->MODER|=0<<9*2;
2. GPIOG->MODER&=~(3<<(9*2));GPIOG->MODER|=1<<9*2;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
huzp_123
1楼-- · 2019-07-14 23:51
就是普通的操作寄存器语句。c语言基础好好看看。在看看对应寄存器那些位的含义。就明白了。
ZXH22770
2楼-- · 2019-07-15 03:26
GPIOG->MODER&=~(3<<(9*2));GPIOG->MODER|=0<<9*2;
这么写主要是为了方便对应,3代表2位操作,9代表第九组,2代表每组两位
&非清0,| 置位
这种逻辑操作很多,主要目的是不影响其它无关位
fgfFsG
3楼-- · 2019-07-15 05:10
为什么 stm32F405中,操作第15个端口像下面这样写就提示超出范围?
GPIOG->MODER&=~(3<<(15*2));GPIOG->MODER|=0<<15*2;
huangdajiang
4楼-- · 2019-07-15 09:14
 精彩回答 2  元偷偷看……
fgfFsG
5楼-- · 2019-07-15 09:52
是的,提示超出范围,不知道为什么
DigCore
6楼-- · 2019-07-15 12:54
GPIOG->MODER&=~(3<<(9*2));GPIOG->MODER|=0<<9*2;
运算过程:
1.数值3的二进制0000,0011那么3左移18位,即0x03000000,
2.再用运算符~来取非,即0xFCFFFFFF,
3.将寄存器GPIOG->MODER中的值读出,和0xFCFFFFFF进行位与的运算&;
假如寄存器GPIOG->MODER中的值是0x11FFFFFF,则位与的运算结果是:0x10FFFFFF,可见,最后是把偏移18位的那两个bit清零。

同理, |= 的运算结果,是把偏移18位的那一位置1.

一周热门 更多>