我在龙眼纳米板上使用GD32VF103CB芯片。
我试图用以下代码从这个板中读取一个引脚(Pin B15):
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)。
// 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);发布于 2020-11-12 21:03:40
你从来没有清理过这一点。
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来清除一点。
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时)。
您的代码可能会类似于:
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之间。
https://stackoverflow.com/questions/64767741
复制相似问题