×
单片机 > 单片机程序设计 > 详情

STM32有关GPIO引脚的一些问题

发布时间:2020-05-30 发布时间:
|

/* 
名称:STM32有关GPIO引脚的一些问题 
说明:今天在编写一个键盘扫描程序的时候,出现了一些问题。 
有的引脚能读出电平状态、有点引脚确一直读不出状态。改了一下午,查了好久,终于有点眉目了。现简述如下: 
我在用引脚的时候,使用的是PB0、PB1、PB2、PB3、PB4…,将其引脚配置的方式是上拉输入。PB2、PB3、PB4一直有问题。PB0、PB1是可以读出状态的(但是只能单独使用)。

对于PB2来说,其不仅是PB2,它也是BOOT1引脚。当系统复位之后,开始的几个系统时钟使用的是BOOT1,用来判断系统从何处读取置零。之后,PB2就可以作为普通的IO引脚使用了。由于开发板设置的是从内部FLASH启动,BOOT1一直是置零的。然后,系统启动之后,也没拔短接冒(作用是BOOT1置零),所以PB2一直是低电平。可能这就是PB2引脚不能使用的原因了。 
但是这样还有点不理解,就是PB2既然一直处于低电平,那在我的程序就相当于一直处于按键状态了,但是为什么没出现按下按键该有的反应呢?这点我还没搞清楚,以后有机会再慢慢理解吧。

关于PB3、PB4来说,其复位之后的功能并不是普通的IO引脚,而是用于调试使用的引脚。如果想要其当做普通的IO引脚必须进行重映射。当然,有一个不知道是不是巧合的现象是,单独使用PB4引脚时,也是可以读出电平状态的,也就是说运行的结果是符合预期的。但是,PB4并没有作为普通的IO引脚啊,关于这点,我也还没弄清楚。

相关引脚图如下: 

 
*/


//按键输入端口配置

void GPIO_KEY_Config()

{

    GPIO_InitTypeDef GPIO_InitStructure;


    RCC_APB2PeriphClockCmd(KEY_GPIO_CLK,ENABLE);


    GPIO_InitStructure.GPIO_Pin = KEY_GPIO_PIN;


    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;      //配置成上拉输入


    GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStructure);


}




//键盘扫描

int8_t KeyScan()

{

    int8_t i = 0;

    uint16_t test_pin = 0x0010;

    for(;i<4;++i)

    {

        if(GPIO_ReadInputDataBit(KEY_GPIO_PORT,test_pin) == KEY_ON ) 

        {

            delay_ms(10);


            if(GPIO_ReadInputDataBit(KEY_GPIO_PORT,test_pin) == KEY_ON)

            {

                while(GPIO_ReadInputDataBit(KEY_GPIO_PORT,test_pin) == KEY_ON)

                ;


                return i+1 ;

            }


        }


        test_pin = test_pin<<1;


    }


        return -1;


}



头文件:



#define KEY_GPIO_PORT   GPIOB

#define KEY_GPIO_PIN        GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7


#define KEY_GPIO_CLK    RCC_APB2Periph_GPIOB


#define KEY_ON 0

#define KEY_OFF 1



//按键输入端口配置

void GPIO_KEY_Config(void);


//键盘扫描

int8_t KeyScan(void);




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会