ZTE PA0问题?

发布: 2009-12-31 22:11 | 作者: win2000_li | 来源: StmFans思蜕盟 OPELC 自由电子联盟

其他按键都可以正常。

只有PA0不正常。

请指点.

在把PA0作按键输入。

结果IO口一直为高,不管怎么按按键。

void GpioInit(void)
{
        /* Configure all unused GPIO port pins in Analog Input mode (floating input
         trigger OFF), this will reduce the power consumption and increase the device
         immunity against EMI/EMC */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE);

        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_Init(GPIOC, &GPIO_InitStructure);
        GPIO_Init(GPIOD, &GPIO_InitStructure);
        GPIO_Init(GPIOE, &GPIO_InitStructure);
        GPIO_Init(GPIOF, &GPIO_InitStructure);
        GPIO_Init(GPIOG, &GPIO_InitStructure);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, DISABLE);   

        
        // Enable GPIO_LED clock
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);

        // Output LD1 LD2 LD3 LD4
        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIO_LED, &GPIO_InitStructure);

        // KEY Input
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(WakeUpKey, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(User1Key, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(TamperKey, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(User2Key, &GPIO_InitStructure);        
}

void ScanKeyIn(void)
{
        if (FALSE == GPIO_ReadInputDataBit(WakeUpKey, GPIO_Pin_0))
        {
                LED0 = TRUE;
        }
        else
        {
                LED0 = FALSE;
        }

        if (FALSE == GPIO_ReadInputDataBit(User1Key, GPIO_Pin_8))
        {
                LED1 = TRUE;
        }
        else
        {
                LED1 = FALSE;
        }

        if (FALSE == GPIO_ReadInputDataBit(TamperKey, GPIO_Pin_13))
        {
                LED2 = TRUE;
        }
        else
        {
                LED2 = FALSE;
        }

        if (FALSE == GPIO_ReadInputDataBit(User2Key, GPIO_Pin_3))
        {
                LED3 = TRUE;
        }
        else
        {
                LED3 = FALSE;
        }
}
win2000_li (2009-12-31 22:57:11)
这几个IO都有上拉电阻!!!
binglin (2009-12-31 23:22:56)
"WakeUpKey"你的定义是什么?
win2000_li (2010-1-01 12:19:24)
是的,WakeUpKey是我定义的,是WakeUpKey - GPIOA!!!
binglin (2010-1-02 12:38:33)
"在把PA0作按键输入。

结果IO口一直为高,不管怎么按按键。"

你是指PA0一真为高还是指输出驱动该LED的口一直为高?
win2000_li (2010-1-03 13:23:18)
是PA0一直为高

虽然加了上拉电阻,但是在按键按下时,应(PA0)被拉低啊。
binglin (2010-1-03 15:52:00)
检查PCB板、按钮电路或按钮本身有没有问题。