STM32单片机开发板实验01:独立按键实验

实验目标

通过开发板上的个独立按键控制 LED 开关。

按键介绍

按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时, 开关断开。我开发板上使用的按键及内部简易图如下图所示:
按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态,如 果按键按下,初始导通状态变为断开,初始断开状态变为导通。
通常的按键所用开关为机械弹性开关,当机械触点断开 、闭合时,电压信号 如下图所示:
由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动。抖动时间的长短由按键的机械特性决定的,一般为 5ms 到 10ms。按键稳定闭合时间的长短则由操作人员的按键动作决定的,一般为零点几秒至数秒。按键抖动会引起按键被误读多次。为了确保 CPU 对按键的一次闭合仅作一次处理,必须进行消抖。
按键消抖有两种方式,一种是硬件消抖,另一种是软件消抖。为了使电路更加简单,通常采用软件消抖。我们开发板也是采用软件消抖,一般来说一个简单的按键消抖就是先读取按键的状态,如果得到按键按下之后,延时 10ms,再次读取按键的状态,如果按键还是按下状态,那么说明按键已经按下。

硬件设计

开发板上有 4 个独立按键,其硬件电路如下图所示:
按键 K1-K4 连接在芯片的 PA15-PA12 引脚上。K1-K4按键另一端是全部接在 GND上。

软件编程

创建项目

打开 STM32CubeIDE,点击File -> New -> STM32 Project。在弹出的New STM32 Project窗口中,选择对应的 STM32 微控制器型号STM32F103C8T6。
输入项目名称:“PZSTM32F103C8T6Test01”
确认芯片型号为“STM32F103C8Tx”。Firmware Package Name and Version‌选项用于选择与工程关联的嵌入式软件包版本。
项目创建完成后,在STM32CubeIDE左侧的“Project Explorer”窗口会列出项目目录。

配置项目

打开PZSTM32F103C8T6Test01.ioc文件。
一、配置GPIO端口
配置GPIO端口时,需要参照开发板的电路接线图进行配置。主要是查阅开发板上的LED组接入的GPIO口。如普中STM32F103系列开发板LED组接入的是GPIOA端口,见下图:
从开发板电路接线图可以看出,单片机GPIOA的PA0~PA7,分别接入LED1~LED8。我们配置PA1和PA2端口为推挽输出模式。
开发板上四个独立按键连接在芯片的 PA15-PA12 引脚上,因为按键一端是接 GND 的,当按下后管脚即为低电平,所以需要将按键管脚配置为上拉输入模式 GPIO_Mode_IPU。本实验我们使用K4独立按键,因此仅配置PA12引脚即可。
PA12设置为上拉输入模式。

生成代码

图形化配置完成,保存配置文件PZSTM32F103C8T6Test01.ioc,STM32CubeIDE会自动创建基础程序代码,基础代码目录结构如下图所示:

代码编写

(1)硬件接口定义和状态枚举声明
#define KEY_PIN  GPIO_PIN_12
#define KEY_PORT GPIOA
#define LED_PIN  GPIO_PIN_1
#define LED_PORT GPIOA


// 按键状态枚举
typedef enum {
  KEY_RELEASED = 0,
  KEY_PRESSED
} Key_Status;

 

(2)检测按键
Key_Status Read_Key() {
  if (HAL_GPIO_ReadPin(KEY_PORT, KEY_PIN) == GPIO_PIN_RESET) { // 检测低电平
    HAL_Delay(10); // 消抖延时
    if (HAL_GPIO_ReadPin(KEY_PORT, KEY_PIN) == GPIO_PIN_RESET) {
      return KEY_PRESSED;
    }
  }
  return KEY_RELEASED;
}
首次调用HAL_GPIO_ReadPin()读取PA12引脚电平,若检测到低电平(GPIO_PIN_RESET),进入消抖流程,延时10ms后再次检测,确认是否仍为低电平,两次检测均通过则返回KEY_PRESSED,否则返回KEY_RELEASED。
(3)main函数
int main(void)
{


  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  while (1)
  {
  if (Read_Key() == KEY_PRESSED) {
  HAL_GPIO_TogglePin(LED_PORT, LED_PIN);
  }
  }
}
函数首先初始化HAL库底层驱动、配置系统时钟(通常由CubeMX生成)、初始化GPIO外设(通常由CubeMX生成)。
在主循环中,通过Read_Key()函数检测PA12按键状态,当检测到有效按键(KEY_PRESSED)时,使用HAL_GPIO_TogglePin()翻转LED状态(PA1引脚)。

编译和运行

配置输出HEX文件
STM32CubeIDE窗口,选择菜单栏Project -> Properties,弹出项目属性对话框。
项目属性对话框左侧列表项,选择C/C++Build->Settings。在项目属性对话框右侧Tool Settings选项卡内,选择“MCU/MPU Post build outputs”列表项,在其右侧的检查项中选中“Convert to Intel Hex fiile”。

构建工程

STM32CubeIDE窗口,选择菜单栏Project -> Build All,STM32CubeIDE会在Console窗口输出构建信息,若构建过程出现问题,根据错误信息进行修改。

下载程序到板卡

购买的开发板配套资料一般都提供了烧录程序,如普中开发板的烧录程序在在配套资料的开发工具/程序烧入目录内,可以看到里面有两个烧写软件:一个是“STC-ISP 下载”软件;另一个是普中公司研发的自动下载软件。STC-ISP 下载软件需要冷启动,即先点击下载然后开启单片机电源,普中公司研发的自动下载软件,只需一键即可下载,操作非常简单。