STM32 HAL库教程之6:GPIO输入模式与按键电平读取

 目录

第一部分、GPIO 输入模式 要点

第二部分、CubeMX 配置        

第三部分、代码编写

第四部分、编译+烧录代码


本篇目标:

        通过 按键,点亮\关闭 LED灯,学会:

        ①、通过CubeMX,配置引脚的输入模式 
        ②、调用函数,读取引脚电平状态
        ③、了解上、下拉电阻钳位的作用
 

        不聊底层理论,5分钟干完!      

     


友情约定:本系列的前五篇,为了方便新手玩家熟悉CubeMX、Keil的使用,会详细地截图每一步CubeMX、Keil的操作,并做上标记。之后的篇章,仅截图主要步骤页面。希望新手玩家熟记本篇的基本操作。


第一部分、GPIO 输入模式 要点

          

重要概念:电平

        上篇,我们通过点亮LED灯,控制引脚输出高、低电平。 

        但是,还没有解释:电平。 

        常规通信的电信号有:电压(大小)、电压差(差分)、电平(高低)、电流(大小)等。  

        这里迅速地了解一下 电平 的概念。

        电平:逻辑电平,它的标准、分类,非常啰嗦,如有兴趣可读此文: 常见的逻辑电平

        下面整理几条STM32的电平要点,以供速食:

        ①:电平 = 逻辑电平 = TTL; (这里特指TTL,其它的不陈述,用啥再说啥)。

        ②:两种状态:高电平、低电平。

        ③:高电平 = 置1 = 3.3V;  (输入时高于2.0V、输出时高于2.4V,就判断为高电平) ;

        ④:低电平 = 置0 = 0V; (输入时低于1.2V、输出时低于0.8V,就判断为低电平);

        要注意一下,与STM32通信的一些设备,如RS485, 它的输出电平有可能是5V。

        STM32F4系列的引脚,绝大部分都是5V电平包容的,但是F1系列,引脚并不都是5V包容。一定要注意通信双方的电平差别、冲突、保护,别炸了芯片。

        

输入模式

        输入的电压信号,大抵有两类:

        电平输入:给引脚一个电压信号,信号经内部施密特触发器后,变成电平结果(0V、3.3V);

        模拟输入:给引脚一个电压信号,经ADC,将模拟信号(0~3.3V), 变成数字结果(0~4095);

        常用的F1、F4系列对于引脚输入模式的划分,有所区别。

        F1系列,输入模式包括:电平输入(浮空、上下拉)、模拟输入,即没有模拟模式。

        F4系列,输入模式仅指电平输入(浮空、上下拉);它有独立的模拟模式,用于ADC和DAC。

        约定:下面所述输入模式,特指:电平输入

        引脚在输入模式时,I/O端口位内部结构、走向,如下图:

        上图解读,只有一个重点:外部电压信号,经施密特触发器后,变成了高、低电平。

        看不懂也没毛关系,绝大部分的新手也是看不懂!路过就好,有一定积累后再回头看。

输入模式下的3种内部上下拉状态

        当把引脚配置为输入模式后,我们可以通过配置,把引脚配置为三种电平钳位状态:        

        ① 浮空输入:内部上、下拉电阻,都没打开,引脚电平悬空,电平状态由外部决定;

        ② 上拉输入:打开内部上拉电阻,引脚外部悬空时,引脚是高电平状态。

        ③ 下拉输入:打开内部下拉电阻,引脚外部悬空时,引脚是低电平状态。

        三者的差别,在于上、下拉电阻是否打开。

上下拉、浮空,  有啥意义?

        很多新手不明白上、下拉电阻的作用(下面简称:上、下拉)。

        上、下拉,是为了在闲时把电路钳定在一个固定的电平。

        芯片引脚内部的上、下拉,是一个很弱的上下拉,电阻值比较大,阻值大约50K。当外部有电平变化时,引脚电平会跟随变动。

        举一个例子,深化一下上、下拉的作用。

        下图,是一个按键的原理图:

        我们看第一个按键的电路,它的信号接入引脚:PA0。

        按图,设计预期是:  按键未按下–PA0保持低电平0V,  按键按下后–PA0是高电平3.3V。

        我们来一个疑问:

        当,按键未按下,而且在没有内外上、下拉的情况下(浮空),PA0的电平是0V还是3.3V?

        绝大部分的新手玩家会认为是:0V。错!

        答案是:不确定。有可能是0V, 也有可能是3.3V,而且可能是不断地随机变化。 

        我们需要切记一点:引脚在输入模式时,浮空状态下(引脚悬空),电平不确定。

        这种不确定的状态,按键就达不到设计预期效果了。             

        如何修改电路?

        方法1:在PA0端,增加外部电路,给它一个10K的下拉电阻,闲时钳位在0V;

        方法2:GPIO内部上、下拉,置低电平,闲时钳位在低电平0V。这种方法最简单。

        现在,我们大概明白芯片内部上下拉的作用和意义了。     

输入模式  常常应用于:

  • 按键
  • 触发信号
  • 输入模式 注意坑区:

  • 电平的电压<=3.3V;  在5V容忍的引脚上,可以<=5V。
  • 读取到的,是电平,而不是电压。

  • 第二部分、CubeMX 配置

            引脚配置输入模式,可以用编写代码的方式进行配置,也可以通过CubeMX配置。

            建议新手使用CubeMX进行配置、初始化。这样更简单、直观,也减少代码出错。

            注意:CubeMX只能按我们配置,生成初始化代码,按键的逻辑代码还是要手写的。

            

    步骤 1、打开原理图,记录LED所用引脚。

            打开板子的原理图,找到 按键 部分:

            通过上图,我们可以得知:

            按键1,使用PA0,  闲时应该置低电平钳位(下拉),按下时为高电平;

            按键2,使用PA1,  闲时应该置高电平钳位(上拉),按下时为低电平;

            按键3,使用PA4,  闲时应该置高电平钳位(上拉),按下时为低电平;

    步骤2、打开 CubeMX 工程       

            ①  如果还没有新建工程,参考:STM32CubeMX 新建工程;

            ②  如果已有CubeMX生成的工程,双击*.ioc 文件打开CubeMX,对现有工程进行配置;

            ③  我们可以复制之前篇章的”延时函数 流水灯"的工程文件夹,修改文件夹名称,在其原有基础上进行操作。注意,只能修改文件夹名称(可以有中文),但不能修改工程名称,否则生成时出错!!

    步骤3、配置引脚

            ①  在搜索输入框(下图标记1),输入 PA0 (删除前后空格),将闪烁提示引脚位置 (标记2);   

                  技巧1:也可以搜索SPI、I2C等功能,相应功能引脚就会闪烁。

                  技巧2:芯片图形,可以通过鼠标拖动位置、滚轮放大缩小。

                  技巧3:引脚颜色,黄色 – 不可配置、绿色 – 已配置、灰色 – 闲置状态。

            

            ④  点击芯片中PA0引脚,将弹出功能选择框(下图标记1);

            ⑤  选择:GPIO_Input,即输出模式。选择后,会增加PA0至列表(标记2);

            ⑥  点击列表中的PA0,将展开更详细的配置(标记3)。

            ⑦   引脚详细参数解释(上图标记3)

                   按原理图,我们给PA0, 设置下拉(闲时低电平),还给它取了一个别名(非必须) 

            ⑧ 按上述方法,可能给其它按键进行配置,如:

                KEY_2:PA1、输入模式、上拉(闲高按低),注意区分,PA0是下拉(闲低按高)

                KEY_3:PA4、输入模式、上拉(闲高按低)   

            配置完成后,目前引脚使用如下:

    步骤四、生成代码

            点击“GENERATE CODE",  开始生成代码。

            其它的配置,如晶振、时钟树等,因为是复制了工程文件夹,所以延用着原来的配置。

            技巧提示:CubeMX在新建工程时,即第一次生成,不支技中文路径、名称。第一次生成后,可以对工程文件夹重命名中文名称、复制到新路径,不影响后续生成。这样的操作方便复制移植。但是,不能修改项目名称,否则生成失败。

    ​        

            稍等数秒,进度条跑完后,会弹出询问对话框,点击关闭。

            至此,CubeMX对引脚配置工作,已完成!


    第三部分、代码编写

    步骤一、打开Keil工程

            这里分两种情况:

            情况1:进行CubeMX配置前,如果已打开此Keil工程,切回Keil,会自动弹出对话框:

            “提示:工程文件被修改了,是否加载更新后的文件?”   

            这里,我们点击“是”, Keil就会自动把文件更新好,无需重新打开工程加载新的文件。

            这自动检测的功能,方便得很!相当的赞!

            情况2:在进行CubeMX配置前,没有打开Keil工程,就需要自行打开工程。

                         打开工程目录。

    ​                    在文件夹MDK-ARM里,有一个绿色图标文件,即为Keil工程入口文件。

    步骤二、查看CubeMX生成的代码        

            CubeMX配置时,我们把PA0、PA1、PA4引脚配置为输入模式,并设置了电平。

            其生成的代码,在gpio.c文件中,如下图:

            CubeMX已经按我们的配置,生成了初始化代码(60~69行);  

    ​        

    步骤三、在main.c文件中编写自己的控制代码

            CubeMX生成的,是初始化代码,而功能性的逻辑、控制代码,是需要我们自己手写的。

            在Keil左侧文件管理器中,双击Core > main.c,即可在编辑区打开main.c文件 。

            main.c, 向下滚动至大约85行,找到while函数部分 。         

            我们在while尾部,添加按键的代码,包括电平状态读取、动作控制。   

            再次提醒:CubeMX生成的工程,用户代码,必须:写在配对的BEGINEND注释行之间。

            否则,下次使用CubeMX重新生成时,配对注释行外的用户代码会被干掉。切记!

            添加代码,如下:

    函数解释:       

            HAL_GPIO_ReadPin(引脚端口,引脚编号);  // 读取引脚电平状态

            参数:

            引脚端口:参数范围 GPIOA ~ GPIOH

            引脚编号:参数范围 GPIO_PIN_0 ~ GPIO_PIN_15 ;  注意:英文字母要大写

            返回值:

            当引脚电平为低(0V), 返回:0,即枚举值的:GPIO_PIN_RESET

            当引脚电平为高(3.3V), 返回:1,即枚举值的:GPIO_PIN_SET


    第四部分、编译+烧录代码

    步骤一、编译代码

            点击工具栏 "Bulid" 按钮,对工程进行编译。

            编译过程,底部信息栏输出编译过程相关信息。

            编译完成后,会报告汇总有多少个错误、警告。

            当出现:0 errors字样,即为编译通过,无语法等错误。Warning警告的数量不影响。

            技巧1:当有错误时,向上滚动信息栏,找到第一个error描述行,双击可跳转到需要修改处。

            注意1:每次编译,会自动删除旧axf文件,必须 0 errors,才能生成新的axf烧录文件。

    步骤二、烧录代码

            当上一步编译、修改至 0 Error后,单击菜单栏中的 “Load” 按钮,开始烧录代码。

            注意1:如果工程还没进行过仿真器的参数设置,需要设置一次仿真器参数。

            参考文章:【STM32 + HAL库】之 4 — 设置仿真器CMSIS-DAP参数、烧录代码_cubemx可以烧录程序吗-CSDN博客

    ​       

            当烧录完成后,信息栏输出如下提示:

        


            至此,我们的按键状态读取,已完成。

            复习一下重点:

            ①、CubeMX配置 输入模式;

            ②、通过函数 HAL_GPIO_ReadPin( )  读取引脚电平状态;

            ③、上、下拉作用;

            如有某些不详尽、错误的地方,欢迎留言指正,按需更新细节。

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 HAL库教程之6:GPIO输入模式与按键电平读取

    发表评论