我目前正在学习一 block LPC3141开发板。我试图关闭单个 GPIO 引脚,同时让其他引脚保持与原来相同的状态。我的问题是我可以单独打开它们,但是当我只想关闭一个坑时,它会进行“总线重置”并将它们全部关闭。我不明白为什么当我使用位移位时它会重置所有这些。这是我执行此操作的代码示例:
#define PINS (*((volatile unsigned int *)0x130031C0))
#define MODE0 (*((volatile unsigned int *)0x130031D0))
#define MODE0_SET (*((volatile unsigned int *)0x130031D4))
#define MODE0_RESET (*((volatile unsigned int *)0x130031D8))
#define MODE1 (*((volatile unsigned int *)0x130031E0))
#define MODE1_SET (*((volatile unsigned int *)0x130031E4))
#define MODE1_RESET (*((volatile unsigned int *)0x130031E8))
void delay (void);
void c_entry(void){
//Prg gpio pins (glej user manual str 312-318
//Bit manipulation (spremenim samo 1 bit v registru inne celega)
MODE1 = MODE1 | (0x1 << 6);
MODE1 = MODE1 | (0x1 << 8);
while(1){
MODE0 = MODE0 | (0x1 << 6);
MODE0 = MODE0 | (0x1 << 8);
delay();
MODE1 = MODE1 | (0x1 << 6);
MODE1 = MODE1 | (0x1 << 8);
MODE0 = MODE0 & !(0b1000000);
delay();
}
}
void delay (void){
volatile int stej = 1000000;
while(stej){
stej = stej - 1;
}
最佳答案
当您想清除位时,您使用了错误的运算符 - 您需要按位补码运算符~
,而不是逻辑 NOT 运算符 !
.
注意:按位运算符,顾名思义,对值中的各个位进行运算,而逻辑运算符将值视为单个真/假量(0 = 假,其他一切 = 真)。按位运算符:&
、|
、^
、~
。逻辑运算符:&&
、||
、!
。
例如你的行:
MODE0 = MODE0 & !(0b1000000);
应该是:
MODE0 = MODE0 & ~(0b1000000);
或更简洁/一致:
MODE0 &= ~(0x1 << 6);
关于c - 关闭 ARM9 (LPC3141) 上的单个 GPIO 引脚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30800881/