打印

GD32F103CBT6的IO上拉能力问题

[复制链接]
7040|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhxi|  楼主 | 2013-7-27 23:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
刚刚拿到了5个片子,把板子上原来的ST芯片换上GD的后,调试按键输入功能:PA4、PA5、PB1、PB2作为输入,外部电路未加上拉电阻,IO串入了51R的电阻后直接接轻触开关(开关的另外一个脚接地)。软件里面把IO配置为输入上拉GPIO_Mode_IPU,结果会一直检测到有按键按下。用万用表测IO口的电压,都在2.5V以下,有2个的电压在1V以下。

void KeyBoard_Init(void)
{
        u32 i;
        GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
        for(i=0;i<MAX_KEY_NUM;i++)
        {
                RCC_APB2PeriphClockCmd(RCC_GPIO_KEY[i], ENABLE);

            GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_KEY[i];
            GPIO_Init(GPIO_KEY[i], &GPIO_InitStructure);
        }
}
换回ST的芯片后,按键输入功能就正常了。

QQ图片20130727232649.jpg (93.92 KB )

QQ图片20130727232649.jpg
沙发
zhxi|  楼主 | 2013-7-28 15:51 | 只看该作者
发现ST的芯片也有类似的问题。看来还是得在外部加上拉电阻。

使用特权

评论回复
板凳
jack888518| | 2013-7-29 10:20 | 只看该作者

“结果会一直检测到有按键按下”
这个结果是“轻触开关”之后还是没有接触开关一直都有低电平?
如果是前者,就是正常的,如果是后者,问题可能就是电阻小了。
芯片应该就是这么设计的,ST,GD都是。

使用特权

评论回复
地板
zhxi|  楼主 | 2013-7-30 00:03 | 只看该作者
jack888518 发表于 2013-7-29 10:20
“结果会一直检测到有按键按下”
这个结果是“轻触开关”之后还是没有接触开关一直都有低电平?
如果是前 ...

没按下按键也会有输入。另外焊了一个板子后,情况好很多,不知道是不是阻焊剂没洗干净造成的。

使用特权

评论回复
5
zhxi|  楼主 | 2013-7-30 00:04 | 只看该作者
GONGO 发表于 2013-7-29 10:24
少年,你没设置 GPIO->ODR,当然不行啦!

ODR那是输出的寄存器,我现在使用的是输入功能,所以应该是不用管ODR的。

使用特权

评论回复
6
周立功GD32| | 2013-7-30 11:12 | 只看该作者

/*********************************************************************************************************
【功能】GPIO管脚配置
【参数】GPIOx   端口,取值GPIOA~GPIOE
        Pins    管脚组合,取值PIN0~PIN15或者它们之间任意“或运算”的组合形式
        Mode    模式,取下列值之一:
                    GPIO_MODE_IN        //  浮空输入(高阻抗)
                    GPIO_MODE_IN_PU     //  弱上拉输入(典型值40KΩ)
                    GPIO_MODE_IN_PD     //  弱下拉输入(典型值40KΩ)
                    GPIO_MODE_OUT       //  推挽输出(±5mA驱动)
                    GPIO_MODE_OD        //  开漏输出(需外接2.2~47KΩ上拉,用作输入时必须先置1)
【返回】无
【说明】在函数内部,GPIO_Speed参数被设置为10MHz,速度适中、功耗也不大
【示例】
void exam__gpioPinConfig(void)
{
    gpioPeriphInit(GPIOA);                                  //  初始化PA端口
    gpioPinConfig(GPIOA, PIN1, GPIO_MODE_IN_PU);            //  配置PA1为弱上拉输入
    gpioPinConfig(GPIOA, PIN0 | PIN12, GPIO_MODE_OUT);      //  配置PA0、PA12为推挽输出
    gpioPeriphInit(GPIOC);                                  //  初始化PC端口
    gpioPinConfig(GPIOC, PIN_LOW | PIN8, GPIO_MODE_OD);     //  配置PC0~PC8为开漏
}
*********************************************************************************************************/
void gpioPinConfig (GPIO_TypeDef *GPIOx, uint16_t Pins, GPIOMode_TypeDef Mode)
{
    //  定义GPIO初始化结构体对象
    GPIO_InitTypeDef  init;

    //  设定GPIO属性
    init.GPIO_Pin   = Pins;
    init.GPIO_Speed = GPIO_Speed_10MHz;
    init.GPIO_Mode  = Mode;

    //  正式配置
    GPIO_Init(GPIOx, &init);
}

楼主是否可以参考一下?
详见:【原创】《wdxLib_for_GD32F103》驱动开发(提供高质量源代码)

使用特权

评论回复
7
zhxi|  楼主 | 2013-7-30 23:18 | 只看该作者
谢谢楼上的。我已经习惯使用ST的库了。

使用特权

评论回复
8
周立功GD32| | 2013-7-31 08:31 | 只看该作者
我用的也是STM固件库,只是换个思路使用方法更进一步而已,呵呵

使用特权

评论回复
9
jack888518| | 2013-7-31 11:48 | 只看该作者
zhxi 发表于 2013-7-30 00:03
没按下按键也会有输入。另外焊了一个板子后,情况好很多,不知道是不是阻焊剂没洗干净造成的。 ...

恩,感觉应该是你板子上管脚焊接出了点小问题,打磨清洁一下管脚周边应该就好了。
功能上肯定能符合你的预期。

使用特权

评论回复
10
dami| | 2013-7-31 20:44 | 只看该作者
这个电路如果设置为输入上拉就可以,设置浮空就不定状态。设置下拉就肯定不行。

使用特权

评论回复
11
dami| | 2013-7-31 20:47 | 只看该作者
内部上拉利用起来可以节省空间。外面电阻多了麻烦。

使用特权

评论回复
12
lirunze| | 2013-7-31 21:11 | 只看该作者
保险起见,还是加一个上拉好一点啊

使用特权

评论回复
13
zhxi|  楼主 | 2013-8-1 22:38 | 只看该作者
dami 发表于 2013-7-31 20:44
这个电路如果设置为输入上拉就可以,设置浮空就不定状态。设置下拉就肯定不行。 ...

我设置为上拉输入了,可是就是不行。

使用特权

评论回复
14
zhxi|  楼主 | 2013-8-1 22:47 | 只看该作者
同样的IO输入问题出现在了PA3、PA6、PA7。IO口引脚直接悬空着,IO配置为GPIO_Mode_IPD(输入下拉)模式,读取到的这几个引脚的输入全部为1,用万用表测IO的电压,发现都在2.4V左右,供电为3.3V,真的是太奇怪了。换过片子也是这样,难道真的说是板子的焊接不好,可是这几个脚旁边的引脚要么配置为浮空输入,下拉输入,要么配置为输出(并且输出都为0)?明天去搞个酒精或者清洗剂把板子清洗下看看,再去搞几个ST的芯片对比试试看。这次IO的输入把我搞得有点难受啊,以前用ST的其他芯片100脚、144脚、48脚的都没怎么遇到过问题啊,而且都已经量产了的。

使用特权

评论回复
15
zhxi|  楼主 | 2013-8-1 22:51 | 只看该作者
找到GD的datasheet,上面的上拉、下拉参数为:
RPU  Internal pull-up resistor   VIN=VSS 30 40 50 kΩ
RPD  Internal pull-down resistor VIN=VDD 30 40 50 kΩ

从参数看,这个阻值的话,还是用能力把IO拉为高电平,或者低电平的啊。

使用特权

评论回复
16
zhxi|  楼主 | 2013-8-2 21:05 | 只看该作者
我今天用清洗剂洗了电路,吹干后还是不行。后来又去买了医用酒精,再用牙刷刷洗,吹干后,终于正常了。我用的是上海华光焊剂厂的HP-290助焊剂,大家有没有遇到过类似的问题?还有,GD的芯片管脚好像比ST的要稍微粗一点点的,管脚的外圈尺寸比st的也要打一点点,这个不知道是不是造成我的问题的原因之一。

使用特权

评论回复
17
人生之际| | 2013-8-3 12:17 | 只看该作者
老兄的KEY4居然接在BOOT1管脚上,还是悬浮的。真是奇葩了,这个脚在复位时是要被读入状态的,决定内核从哪里启动

使用特权

评论回复
18
乌月明星稀| | 2013-8-4 22:42 | 只看该作者
zhxi 发表于 2013-7-30 00:04
ODR那是输出的寄存器,我现在使用的是输入功能,所以应该是不用管ODR的。 ...

在输入模式下,让ODR输出相应通道为1,则表示为配置为上拉输入模式!!!ODR并不是简单的用作输出模式下。Do you get it?

使用特权

评论回复
19
zhxi|  楼主 | 2013-8-5 09:58 | 只看该作者
人生之际 发表于 2013-8-3 12:17
老兄的KEY4居然接在BOOT1管脚上,还是悬浮的。真是奇葩了,这个脚在复位时是要被读入状态的,决定内核从哪 ...

你有看boot0引脚吗?boot0为0了,boot1就可以任意了。请你说话不要这么自以为是!!
RM0008 P41/681
BOOT1 BOOT0
x     0      Main Flash memory Main Flash memory is selected as boot space
0     1      System memory System memory is selected as boot space
1     1      Embedded SRAM Embedded SRAM is selected as boot space

使用特权

评论回复
20
zhxi|  楼主 | 2013-8-5 10:04 | 只看该作者
乌月明星稀 发表于 2013-8-4 22:42
在输入模式下,让ODR输出相应通道为1,则表示为配置为上拉输入模式!!!ODR并不是简单的用作输出模式下 ...

我在用户手册上没找到您说的这个功能,请问您是哪里看到的呢?RM0008 REV-5 104/681


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

146

帖子

1

粉丝