关于c:四零基础上手HAL库之GPIO按键

51次阅读

共计 2981 个字符,预计需要花费 8 分钟才能阅读完成。

【四】零根底上手 HAL 库之—GPIO 按键

3.1 前言

咱们在上一节曾经晓得了点灯操作,相当于是学会了 GPIO 输入的配置,接下来是 GPIO 输出实现按键扫描的操作。

后期筹备

  • STM32 各类型的板子(自己应用 F103Rc 和 F407ZE)。
  • CubeMx 软件,Keil\_IDE。

3.2 KEY 按键

同样的咱们先来看看按键模块的原理图局部:

当按键没有按下时,按键局部相当于断路,PC13 的电压相当于电容两端电压为 3.3V。

当按键按下时,按键局部相当于短路(即一根导线),PC13 的电压和 GND 地相连为 0V。

所以按键从未按下到按下相当于是一个高电平到低电平的跳变,简称为降落沿。

1、新建工程

搜寻或者筛选芯片后,点击 Start Project 胜利创立一个我的项目。

2、时钟配置

点击 RCC 进入时钟配置,配置高速时钟为内部晶振,软件主动配置了两个晶振的引脚如图 PD0 和 PD1

3、Debug 配置为 DAP

4、输出模式配置

  • ① 抉择如原理图所示的引脚,这里 PC14/PC15 为 LED 引脚,PC12/PC13 为 KEY 引脚,别离设置为输入和输出模式
  • ② 选中 GPIO 模块,对引脚模式进行具体配置
  • ③ 设置 PC12 的具体模式,

    • GPIO mode:输出模式。
    • GPIO Pull:由原理图可知,当没有按键按下时为高电平,所以抉择上拉模式。
    • User Label:用户标签,用于标识对应引脚的端口和 Pin,不便调用 API,这里按键为 KEY1/KEY2, 灯为 LED1/LED2。

5、时钟配置

这里咱们还是一样配置为最高的时钟频率 72M, 在对应的框中输出 72,按下回车即可见到如下两图的变动。按下回车前如图:

按下回车后如图:

6、项目管理配置以及代码生成配置

同样的咱们填写好工程名 KEY,抉择好文件门路,以及所用的 IDE 以及版本号即可

代码生成抉择好这两个后点击右上角按钮,产生代码:

7、业务逻辑代码

7.1 API

咱们再来看看 GPIO 模块对应的 API 函数:

/* 初始化和删除初始化函数,HAL_GPIO_Init:cubemx 生成代码后主动调用初始化函数
    HAL_GPIO_DeInit:解除初始化,不想应用时能够被动应用 */
void  HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
void  HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);

/* 操作 GPIO 的函数,包含读取,写入,翻转,加锁,中断服务函数以及回调函数
    HAL_GPIO_ReadPin:读取引脚电平    返回值为(GPIO_PIN_RESET/GPIO_PIN_SET)HAL_GPIO_WritePin:写入引脚电平 
    HAL_GPIO_TogglePin:翻转引脚电平
    HAL_GPIO_LockPin:所以引脚以后电平,将无奈扭转
    HAL_GPIO_EXTI_IRQHandler:引脚的中断服务函数
    HAL_GPIO_EXTI_Callback:引脚的中断回调函数 */
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
main() 函数

咱们能够在 main.h 中看到之前定义的用户标签,如下:

/* Private defines -----------------------------------------------------------*/
#define KEY2_Pin GPIO_PIN_13
#define KEY2_GPIO_Port GPIOC
#define LED1_Pin GPIO_PIN_14
#define LED1_GPIO_Port GPIOC
#define LED2_Pin GPIO_PIN_15
#define LED2_GPIO_Port GPIOC
#define KEY1_Pin GPIO_PIN_12
#define KEY1_GPIO_Port GPIOC

上面是 mian() 函数:

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      // 有按键 1 按下
      if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_RESET)
      {
          /* 软件消抖 */
          HAL_Delay(20);
          /* 翻转 LED1 */
          HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
          /* 期待按键 1 松开 */
          while(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) != GPIO_PIN_SET);    
      }
      
      // 有按键 2 按下
      if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET)
      {
          /* 软件消抖 */
          HAL_Delay(20);
          /* 翻转 LED2 */
          HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
          /* 期待按键 2 松开 */
          while(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) != GPIO_PIN_SET);    
      }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

下载代码到板子中,咱们按下不同的按键不同的LED对应的进行电平的翻转操作。

好啦,GPI 按键输出就是这么简略就完结了,怎么样是不是感觉也很简略呀!

正文完
 0