微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用PINSEL寄存器设置GPIO位时出现问题

如何解决使用PINSEL寄存器设置GPIO位时出现问题

有人可以解释一下这是怎么回事

LPC_PINCON->PINSEL1 &= ~(0x03 << 18);

清除端口1的位18和19?会

LPC_PINCON->PINSEL1 &= ~(1 << 18);
LPC_PINCON->PINSEL1 &= ~(1 << 19);

给出相同的结果吗?

解决方法

您需要学习逻辑和二进制运算的问题鞋子

来自codescope.com \

Setting a bit. Use the bitwise OR operator ( | ) to set a bit. `number |= 1 << x;` That will set a bit x .
Clearing a bit. Use the bitwise AND operator ( & ) to clear a bit. `number &= ~(1 << x);` That will clear bit x . ...
Toggling a bit. The XOR operator ( ^ ) can be used to toggle a bit. `number ^= 1 << x;`

如果使用另一个数字代替1,则适用相同的规则。 3以二进制11表示,它将清除两位。

,

从布尔值的角度来看,是的,这两个选项是等效的-使用Qalculate来声明显而易见的内容(它可以计算诸如~(0x03 << 18)之类的表达式):

~(0x03 << 18) = 1111 1111 1111 0011 1111 1111 1111 1111
~(1 << 18)    = 1111 1111 1111 1011 1111 1111 1111 1111
~(1 << 19)    = 1111 1111 1111 0111 1111 1111 1111 1111

和布尔运算的真值表为:

A   B   Q
0   0   0
0   1   0
1   0   0
1   1   1

当针对同一位置的位掩码中的LPC_PINCON->PINSEL1值执行按位and操作时,1中的所有[0..31]位将保持不变。

当在同一位置对位掩码中的LPC_PINCON->PINSEL1值执行按位and操作时,0中的所有位[0..31]将都设置为零

是的,LPC_PINCON->PINSEL1最终将在两种情况下都包含相同的值。

但是分两步执行操作将导致连续两次或两次更改引脚的功能角色,具体取决于您开始对其进行修改时的LPC_PINCON->PINSEL1的值。

例如,如果您已经在相应的LPC_GPIOn –> FIODIR中或在为该特定引脚配置任何可能的替代功能的寄存器中已经设置了值,则这可能会影响连接到引脚的行为

这意味着在单个操作中配置GPIO模式可能是一个更好的选择,因此从硬件的角度来看,这两个选项并不相同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。