目录
第一部分、GPIO 输入模式 要点
第二部分、CubeMX 配置
第三部分、代码编写
第四部分、编译+烧录代码
本篇目标:
通过 按键,点亮\关闭 LED灯,学会:
①、通过CubeMX,配置引脚的输入模式
②、调用函数,读取引脚电平状态
③、了解上、下拉电阻钳位的作用
不聊底层理论,5分钟干完!
友情约定:本系列的前五篇,为了方便新手玩家熟悉CubeMX、Keil的使用,会详细地截图每一步CubeMX、Keil的操作,并做上标记。之后的篇章,仅截图主要步骤页面。希望新手玩家熟记本篇的基本操作。
重要概念:电平
上篇,我们通过点亮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。这种方法最简单。
现在,我们大概明白芯片内部上下拉的作用和意义了。
输入模式 常常应用于:
输入模式 注意坑区:
引脚配置输入模式,可以用编写代码的方式进行配置,也可以通过CubeMX配置。
建议新手使用CubeMX进行配置、初始化。这样更简单、直观,也减少代码出错。
注意:CubeMX只能按我们配置,生成初始化代码,按键的逻辑代码还是要手写的。
步骤 1、打开原理图,记录LED所用引脚。
打开板子的原理图,找到 按键 部分:
通过上图,我们可以得知:
按键1,使用PA0, 闲时应该置低电平钳位(下拉),按下时为高电平;
按键2,使用PA1, 闲时应该置高电平钳位(上拉),按下时为低电平;
按键3,使用PA4, 闲时应该置高电平钳位(上拉),按下时为低电平;
步骤2、打开 CubeMX 工程
① 如果还没有新建工程,参考:STM32CubeMX 新建工程;
② 如果已有CubeMX生成的工程,双击*.ioc 文件打开CubeMX,对现有工程进行配置;
③ 我们可以复制之前篇章的”延时函数 流水灯"的工程文件夹,修改文件夹名称,在其原有基础上进行操作。注意,只能修改文件夹名称(可以有中文),但不能修改工程名称,否则生成时出错!!
① 在搜索输入框(下图标记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工程,就需要自行打开工程。
打开工程目录。
步骤二、查看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生成的工程,用户代码,必须:写在配对的BEGIN与END注释行之间。
否则,下次使用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( ) 读取引脚电平状态;
③、上、下拉作用;
如有某些不详尽、错误的地方,欢迎留言指正,按需更新细节。