STM32有关GPIO引脚的一些问题

原创 2018年04月16日 20:46:23

/*
名称: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引脚啊,关于这点,我也还没弄清楚。

相关引脚图如下:
表头

PB2
*/

PB3、PB4

相关的代码如下:
//按键输入端口配置
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);

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/plm199513100/article/details/79966250

驱动器是否准备好,如软盘,光驱还有弹开,关闭CDROM的小例子

判断驱动器是否准备好,如软盘,光驱的函数  function IsDiskReady(Drive: char): boolean;  var    d1, d2, d3, d4: longword; ...
  • laza
  • laza
  • 2001-01-07 16:31:00
  • 803

STM32:GPIO基础与对应管脚操作库函数

USE_STDPERIPH_DRIVER, STM32F10X_HD STM32固件库Libraries\CMSIS\Core\CM3\startup\arm中启动文件的文件名英文缩写意义:...
  • sinat_36184075
  • sinat_36184075
  • 2017-04-17 21:18:21
  • 2022

关于stm32中的GPIO引脚初始化的程序讲解及相关知识拓展介绍

以下是我要讲解的GPIO初始化程序段,对时钟进行使能,对引脚进行模式配置,速度设定,尽量讲解小白学习过程中不解的每一个方面。 代码讲解时我是根据一个程序边讲边跳入它的声明或是定义中讲解的。...
  • huzhoudaxia
  • huzhoudaxia
  • 2017-07-10 00:03:22
  • 3962

STM32的GPIO的复用功能和重映射功能

1、复用功能:内置外设是与I/O口共用引出管脚(不同的功能对应同一管脚) STM32 所有内置外设的外部引脚都是与标准GPIO引脚复用的,如果有多个复用功能模块对应同一个引脚,只能使能其中之一,...
  • h_kingone
  • h_kingone
  • 2016-11-14 17:17:24
  • 5388

STM32之GPIO结构

1、STM32的GPIO结构图 GPIO共有8中设置模式:输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽式输出、推挽式复用功能,开漏复用功能,共4种输入,2种输入,2种复用功能。 2、...
  • YangPan2007
  • YangPan2007
  • 2016-09-07 17:06:17
  • 1240

STM32 GPIO管脚工作模式和输出速度总结笔记

GPIO 输出速度I/O口输出模式下有三种输出速度可选(2MHz,10MHz,50MHz),这个速度是指I/O口驱动电路的响应速度;I/O管脚内部有多个响应不同的驱动电路,用户可以根据自己的需要选择合...
  • wuyuzun
  • wuyuzun
  • 2017-05-09 10:41:19
  • 1931

STM32 GPIO管脚模式的设置及使用方法

一、 在STM32中选用IO模式        1、浮空输入GPIO_IN_FLOATING ——浮空输入,可以做KEY识别,RX1        2、带上拉输入GPIO_IPU——IO内部上拉电...
  • sdkdlwk
  • sdkdlwk
  • 2017-03-23 09:20:35
  • 2972

转载:stm32的引脚有两种用途

stm32的引脚有两种用途:GPIO(general purpose io)和AFIO(alternate function io) 对于一些引脚(视芯片而定),这两种用途都没有,如在64脚产品中,...
  • yqb346091909
  • yqb346091909
  • 2014-07-03 17:02:21
  • 2070

STM32F10x GPIO引脚说明

此篇文章重点讨论STM32的GPIO的配置种类以及上拉输入、下拉输入、浮空输入、模拟输入的区别 经过学习STM32发现,GPIO有8种工作方式 输入模式:输入浮空、输入上拉、输入下拉、模拟输入 输出模...
  • zhitianya
  • zhitianya
  • 2016-03-02 12:07:13
  • 1730

把OSC_IN/OSC_OUT引脚作为GPIO端口PD0/PD1

外部振荡器引脚OSC_IN/OSC_OUT可以用做GPIO的PD0/PD1,通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现。这个重映射只适用于36、 48和64脚的封装(100脚和...
  • u013162035
  • u013162035
  • 2017-12-21 22:24:17
  • 266
收藏助手
不良信息举报
您举报文章:STM32有关GPIO引脚的一些问题
举报原因:
原因补充:

(最多只允许输入30个字)