首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关闭ARM9 (LPC3141)上的单个GPIO引脚

关闭ARM9 (LPC3141)上的单个GPIO引脚
EN

Stack Overflow用户
提问于 2015-06-12 18:31:44
回答 1查看 75关注 0票数 0

我目前在一个LPC3141开发板上学习。我试图关闭单个GPIO引脚,而让其他引脚保持相同的状态。我的问题是,我可以单独打开它们,但当我只想关闭一个pit时,它会进行“总线重置”,并将它们全部关闭。我不明白为什么当我使用位移位时,它会重置所有它们。下面是我的代码示例,它可以做到这一点:

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

发布于 2015-06-12 18:34:22

当您想要清除位时,您使用了错误的运算符-您需要的是按位补码运算符~,而不是逻辑not运算符!

注意:按位运算符,顾名思义,是对一个值中的单个位进行操作,而逻辑运算符将一个值视为单个true/false数量(0 = false,其他所有内容= true)。按位运算符:&|^~。逻辑运算符:&&||!

以你的代码为例:

代码语言:javascript
复制
MODE0 = MODE0 & !(0b1000000);

应该是:

代码语言:javascript
复制
MODE0 = MODE0 & ~(0b1000000);

或者更简洁/始终如一:

代码语言:javascript
复制
MODE0 &= ~(0x1 << 6);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30800881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档