上一次我们完成了流水和LED闪烁的STM32HAL库的仿真,这次我们来进行按键控制,也就是GPIO的输入。首先我们复制流水灯的工程因为需要用到LED。然后我们来看一下GPIO的输入模式
1. 模拟输入
-
模式标识:
GPIO_Mode_AIN
-
内部结构: 芯片内部与GPIO相关的所有数字电路(施密特触发器)都被断开。引脚直接连接到模拟外设上,例如ADC(模数转换器)或比较器。
-
特点:
-
不进行数字信号的检测与整形。
-
功耗低,因为避免了数字电路开关产生的功耗。
-
-
典型应用场景:
-
ADC采集: 读取模拟传感器的电压值(如电位器、光敏电阻分压)。
-
模拟比较器: 作为比较器的输入。
-
2. 浮空输入
-
模式标识:
GPIO_Mode_IN_FLOATING
-
内部结构: 施密特触发器打开,引脚处于高阻态。内部既不上拉到VDD,也不下拉到GND。
-
特点:
-
当引脚外部没有任何驱动时,其电平是不确定的(悬空),极易受到外部电磁干扰。
-
完全由外部电路决定其电平状态。
-
-
典型应用场景:
-
通信总线: 用于开漏(Open-Drain)模式的通信线路,如I2C的SDA和SCL线。这些线路上通常有外部上拉电阻。
-
连接有明确输出驱动的电路: 例如连接另一个MCU的推挽输出引脚,或者一个数字传感器芯片的输出脚。
-
3. 上拉输入
-
模式标识:
GPIO_Mode_IPU
-
内部结构: 在芯片内部通过一个电阻(约30-50KΩ)连接到VDD(3.3V)。
-
特点:
-
当外部没有信号驱动时,引脚会被拉至高电平(3.3V)。
-
当外部主动驱动为低电平时,外部驱动需要“战胜”内部上拉电阻,将电平拉低。
-
-
典型应用场景:
-
按键/开关检测: 按键一端接GPIO,另一端接地(GND)。当按键未按下时,引脚因上拉而为高电平;按下时,引脚被拉到地,变为低电平。
-
用于默认需要高电平有效的输入信号。
-
4. 下拉输入
-
模式标识:
GPIO_Mode_IPD
-
内部结构: 在芯片内部通过一个电阻(约30-50KΩ)连接到GND(0V)。
-
特点:
-
当外部没有信号驱动时,引脚会被拉至低电平(0V)。
-
当外部主动驱动为高电平时,外部驱动需要“战胜”内部下拉电阻,将电平拉高。
-
-
典型应用场景:
-
按键/开关检测: 按键一端接GPIO,另一端接VCC(3.3V)。当按键未按下时,引脚因下拉而为低电平;按下时,引脚被拉到VCC,变为高电平。
-
用于默认需要低电平有效的输入信号。
-
这里我们需要用到的就是下拉输入,因为我们的STM32单片机是若上拉,强下拉也就是低电平驱动强,所以我们把他设置为上拉模式。
然后我们打开复制好的原理图。去除多余的灯
然后选中BUTTON放置按键。
再点击RES,放置电阻。
找到CAP放置电容。
再点击终端模式
放置一个电源
和一个接地,我们就可以进行电路配置了。
然后拿出来一个网络标签,放在PB0口,命名为PB0。
我们把按键电路,按照这个样子搭建。
再拿出来一个网络标签,放在这个位置。我们按键电路就搭建好了。
然后我们框选,进行我们的一个块复制,再拿出一套按键的电路。
端口就改为PB1
当然我们给PB1上一个网络标签。
然后我们将复制过来的文件打开。
找到我们的按键控制也就是PB0和PB1
更改为GPIO_input,就是GPIO输入模式。PB1也是同样的道理因为按键控制是将低电平送入单片机,所以是输入模式。
然后我们来到GPIO的设置。
第一行是:将PA1默认设置为高电平,因为我们是低电平控制也就是低电平点亮,高电平熄灭。
第二行是:设置GPIO的输出模式,我们选择为推挽输出。
第三行是:设置上拉,下拉电阻,我们选择不需要。
第四行是:GPIO输出的速度,我们暂时不涉及,选哪个都行。
然后我们将PA2也进行这样子的设置。
我们打开PB0这个引脚
第一行是:GPIO输入的意思
第二行是:设置上下拉电阻,pull-up是上拉电阻,pull-down是下拉电阻,我们选择上拉,让内部不输入时候为高电平。
第三行是:设置标签,看个人喜好,我就喜欢用官方默认的。
然后生成文件。
我们选择打开。
找到USER--main.c开始完成我们的程序编写。
我们需要用到GPIO读取的函数
点击下方的function
找到GPIO.c就可以看到按键读取函数
点进去我们看到,他第一个变量是GPIO端口,第二个变量是GPIO端口号,很清晰我们就可以明白。先选择端口,再到具体引脚。
首先我们判断PB0这个端口是否为低电平,因为为低电平就是我们按下了。
然后我们进行给PA1低电平
此时看到按下去之后我们的灯就点亮了。
先复制一个初始值用来记录按键拿下几次。
按下依次这个值+1.但是会一直+
我们进行这样子i需改就可以了。