首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GD32V输入引脚不是被拉下来的,而是像一个浮动引脚。

GD32V输入引脚不是被拉下来的,而是像一个浮动引脚。
EN

Stack Overflow用户
提问于 2020-11-10 11:07:55
回答 1查看 125关注 0票数 0

我在龙眼纳米板上使用GD32VF103CB芯片。

我试图用以下代码从这个板中读取一个引脚(Pin B15):

代码语言:javascript
复制
RCU_APB2EN |= 0x1 << 3; 
GPIO_OCTL(GPIOB) &= ~(0x1 << 15);
GPIO_OCTL(GPIOB) |= (0x0 << 15);

GPIO_CTL1(GPIOB) &= ~(0b1111 << 28);
GPIO_CTL1(GPIOB) |= (0b1000 << 28);
               
GPIO_BOP(GPIOB) &= 0x0;
bool x = (GPIO_ISTAT(GPIOB) & ( 0b1 << 15));

我使用的是官方的设备头文件,其中包含来自用户手册的值。

此配置引脚B15应作为输入引脚,具有下拉功能.然后我用ISTAT寄存器读取引脚的状态,并将其存储在'x‘中。然后我在引脚上写“x”。

然而,该别针然后作为一个浮动别针。基本上,LED引脚总是开着的,不管我把它连接到3.3v还是什么都没有。但是,如果我把它连接到地面上,它就会熄灭。

因此,我尝试了不同的引脚配置,如向上推和浮动,但它们都有相同的效果。我做错了什么?

编辑:作为澄清:我试图写的状态的引脚(针B15)在我的龙眼纳米板内置的发光二极管。我正在使用下面的函数来实现这个功能。请注意,这里的端口是0,引脚是1。(这意味着端口A,引脚1,这是内置的蓝色LED)。

代码语言:javascript
复制
     // Enable the peripheral clock on the rcu
            RCU_APB2EN &= ~(0x1 << (port+2));
            RCU_APB2EN |= 0x1 << (port+2);

            // Set the OCTL for the pin to 1(output high)
            GPIO_OCTL(GPIOA) &= ~(0x1 << pin);
            GPIO_OCTL(GPIOA) |= (0x1 << pin);

            // Set the pin as out push_pull with a speed of 50mhz(ctl0 or 1 based on the pin number)
            if(pin<8){
                GPIO_CTL0(GPIOA) &= ~(0b1111 << (pin*4));
                GPIO_CTL0(GPIOA) |= (0b0011 << (pin*4));
            }else{
                GPIO_CTL1(GPIOA) &= ~(0b1111 << ((pin-8)*4));
                GPIO_CTL1(GPIOA) |= (0b0011 << ((pin-8)*4));
            }

        GPIO_BOP(0x40010800U + (0x00000400U*port)) &= ~(0x1 << pin);
        GPIO_BOP(0x40010800U + (0x00000400U*port)) |= (0x1 << pin);
EN

回答 1

Stack Overflow用户

发布于 2020-11-12 21:03:40

你从来没有清理过这一点。

代码语言:javascript
复制
Port bit operate register (GPIOx_BOP, x=A..E)
15:0    BOPyPortSet bit y(y=0..15)
These bits are set and cleared by software
0: No action on the corresponding OCTLy bit
1: Set the corresponding OCTLy bit to 1

您需要使用GPIOx_BC来清除一点。

代码语言:javascript
复制
Port bit clear register (GPIOx_BC, x=A..E)
15:0    CRyPort Clear bit y(y=0..15)
These bits are set and cleared by software
0: No action on the corresponding OCTLy bit
1: Clear the corresponding OCTLy bit to 0

小心,当您执行RCU_APB2EN &= ~(0x1 << (port+2));时,您将禁用GPIO端口B时钟(当端口=0时)。

您的代码可能会类似于:

代码语言:javascript
复制
void init(int pin){
    RCU_APB2EN |= 0x1 << 3; 
    GPIO_OCTL(GPIOB) &= ~(0x1 << 15);
    GPIO_OCTL(GPIOB) |= (0x0 << 15);

    GPIO_CTL1(GPIOB) &= ~(0b1111 << 28);
    GPIO_CTL1(GPIOB) |= (0b1000 << 28);
               
    // Enable the peripheral clock on the rcu
    RCU_APB2EN |= 0x1 << 2;

    // Set the OCTL for the pin to 1(output high)
    GPIO_OCTL(GPIOA) &= ~(0x1 << pin);
    GPIO_OCTL(GPIOA) |= (0x1 << pin);

    // Set the pin as out push_pull with a speed of 50mhz(ctl0 or 1 based on the pin number)
    if(pin<8){
        GPIO_CTL0(GPIOA) &= ~(0b1111 << (pin*4));
        GPIO_CTL0(GPIOA) |= (0b0011 << (pin*4));
    }else{
        GPIO_CTL1(GPIOA) &= ~(0b1111 << ((pin-8)*4));
        GPIO_CTL1(GPIOA) |= (0b0011 << ((pin-8)*4));
    }

}

void pin_to_led(int pin)
{
    bool x = (GPIO_ISTAT(GPIOB) & ( 0b1 << 15));

    if (x){
        GPIO_BC(0x40010800U ) &= ~(0x1 << pin);
        GPIO_BOP(0x40010800U ) |= (0x1 << pin);
    }else{
        GPIO_BOP(0x40010800U ) &= ~(0x1 << pin);
        GPIO_BC(0x40010800U ) |= (0x1 << pin);
    }
        
}

我删除了端口,因为你在代码中使用了GPIOA。

函数init将被调用一次。应该在循环中调用pin_to_led函数以进行测试,或者从中断处理程序(例如,计时器)调用该函数。你还需要确保引脚在0到15之间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64767741

复制
相关文章

相似问题

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