当前位置:   article > 正文

【四】零基础上手HAL库之—GPIO按键_hal_gpio_togglepin

hal_gpio_togglepin

【四】零基础上手HAL库之—GPIO按键

3.1前言

我们在上一节已经知道了点灯操作,相当于是学会了GPIO输出的配置,接下来是GPIO输入完成按键扫描的操作。

前期准备

  • STM32各类型的板子(本人使用F103Rc和F407ZE)。
  • CubeMx软件,Keil_IDE。

按键开始

3.2 KEY按键

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

image-20210901133047326

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

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

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

幻灯片1

1、新建工程

image-20210831144827291

搜索或者筛选芯片后,点击Start Project成功创建一个项目。

幻灯片2

2、时钟配置

image-20210831145137213

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

幻灯片3

3、Debug配置为DAP

image-20210901134555619

幻灯片4

4、输入模式配置

image-20210901135013470

  • ① 选择如原理图所示的引脚,这里PC14/PC15为LED引脚,PC12/PC13为KEY引脚,分别设置为输出和输入模式
  • ② 选中GPIO模块,对引脚模式进行具体配置
  • ③ 设置PC12的具体模式,
    • GPIO mode:输入模式。
    • GPIO Pull:由原理图可知,当没有按键按下时为高电平,所以选择上拉模式。
    • User Label:用户标签,用于标识对应引脚的端口和Pin,方便调用API,这里按键为KEY1/KEY2,灯为LED1/LED2。

幻灯片5

5、时钟配置

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

image-20210901135110375

按下回车后如图:

image-20210901135127689

幻灯片6

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

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

image-20210901135251221

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

image-20210901135319234

幻灯片7

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);

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

下面是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 */
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

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

好啦,GPI按键输入就是这么简单就结束了,怎么样是不是感觉也很简单呀!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/305220
推荐阅读
相关标签
  

闽ICP备14008679号