STM32CubeMX输入配置---按键

时间:2022-11-23 17:03:39

STM32CubeMX输入配置---按键

  本示例主要讲解IO口输入模式的应用,以按键驱动为例来学校输入模式配置方法。本次实验所用开发板有3个按键,其中一个为复位按键,另外两个则可用户自行驱动。我们采用板载的2个按键来实现对LED灯开关控制。

1.硬件接口

  SW2为复位按键,已直接接到芯片复位引脚上,SW3接在PB0上、SW4接在PB1上。按键按下均为低电平。

STM32CubeMX输入配置---按键

2.软件设计

2.1 GPIO引脚模式简介

在STM32单片机中,每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL, GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。
     根据数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。

─ 输入浮空
      ─ 输入上拉
      ─ 输入下拉
      ─ 模拟输入
      ─ 开漏输出
      ─ 推挽式输出
      ─ 推挽式复用功能
      ─ 开漏复用功能

  • 输入浮空/上拉/下拉配置如下图

STM32CubeMX输入配置---按键

当I/O端口配置为输入时:

● 输出缓冲器被禁止
● 施密特触发输入被激活
● 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接
● 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
● 对输入数据寄存器的读访问可得到I/O状态

输出配置如下图

STM32CubeMX输入配置---按键

当I/O端口被配置为输出时

● 输出缓冲器被激活
        ─ 开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1 ’将端口置于高阻状态(PMOS从不被激活)。
       ─ 推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1 ’将激活P-MOS。
● 施密特触发输入被激活
● 弱上拉和下拉电阻被禁止
● 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
● 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态
● 在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。

     当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。
     输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。
    所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。

复用功能配置

当I/O端口被配置为复用功能时:
    ● 在开漏或推挽式配置中,输出缓冲器被打开
    ● 内置外设的信号驱动输出缓冲器(复用功能输出)
    ● 施密特触发输入被激活
    ● 弱上拉和下拉电阻被禁止
    ● 在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器
    ● 开漏模式时,读输入数据寄存器时可得到I/O口状态
    ● 在推挽模式时,读输出数据寄存器时可得到最后一次写的值

I/O端口位的复用功能配置如下:

STM32CubeMX输入配置---按键


2.2 按键引脚配置

     打开STM32CubmMX代码生成软件,将PB0、PB1配置为输入模式。

     在选定为输入模式后,STM32输入模式分为两种:浮空输入、上拉/下拉输入。

     浮空输入:配置为浮空输入模式,初始化成功后引脚电平状态处于中间态,既不为高也不为低。

    上拉/下拉输入:配置为浮空输入模式,初始化成功后引脚电平状态可以选择是高电平或者低电平。

STM32CubeMX输入配置---按键

  因为按键按下为低电平,因此要想检测到按键状态变化,初始化时就得设置为与按下相反的电平,所用我们这里选择带上拉的输入模式(选择浮空输入也可,一般建议使用上拉输入模式)。

2.3生成配置代码

  1.使用STM32Cubemx生成代码时,所有的GPIO初始化均会放gpio.c中。

void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
/*Configure GPIO pins : PBPin PBPin */
GPIO_InitStruct.Pin = KEY1_Pin|KEY2_Pin;//按键引脚
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;//输入模式
GPIO_InitStruct.Pull = GPIO_PULLUP;//上拉
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);//按键初始化
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = BEEP_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(BEEP_GPIO_Port, &GPIO_InitStruct);
}

    2.在当前工程的Core目录下新建SYSTEM文件夹保存用户自定义驱动文件。

STM32CubeMX输入配置---按键

   3.创建一个key.c和key.h文件,在SYSTEM目录中创建一个KEY文件夹保存该文件。

STM32CubeMX输入配置---按键

    4.添加头文件路径,编写key.h文件。

STM32CubeMX输入配置---按键

STM32CubeMX输入配置---按键

5.编写key.c文件,编写按键检测函数。

u8 KEY_GetVal(void)
{
u8 static stat=0;
if((!KEY1 || !KEY2) && !stat)
{
stat=1;
HAL_Delay(30);
if(!KEY1)return 1;
else if(!KEY2)return 2;
else return 0;
}
else
{
if(KEY1 && KEY2)stat=0;
}
return 0;
}

6.main函数实现按键控制LED开关。

int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
int key;
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while(1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
key=KEY_GetVal();
if(key)
{
HAL_GPIO_TogglePin(BEEP_GPIO_Port,BEEP_Pin);//蜂鸣器电平信号翻转
}
}
/* USER CODE END 3 */
}