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

标签 c io arm embedded bit-manipulation

我目前正在学习一 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/

相关文章:

c - 如何让线程2,3和4等待来自线程1的相同信号?

java - PipeInputStream 和 PipeOutputStream 同步还是异步?

sockets - 阻止调用和Linux调度程序

c++ - 如何通过串行终端检索数据而不破坏其在 GNU ARM 嵌入式中的基本值(value)?

c - 递归释放C中的TRIE结构

c - 系统调用 - 如何在字符串中查找字符(如果该字符存在)

multithreading - ARM STLR 内存排序语义

linux - 在 --gc-sections 之后更新链接器变量

c++ - `intmax_t` 在具有 64 位 `long int` 和 `long long int` 的平台上应该是什么?

Java:使用文本文件