零基础上手HAL库之—按键外部中断

Posted PlayCodes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了零基础上手HAL库之—按键外部中断相关的知识,希望对你有一定的参考价值。

【五】零基础上手HAL库之—按键外部中断

\'【五】零基础上手HAL库之—按键外部中断_HAL库\'

5.1 前言

我们已经大致的了解了Cubemx软件中GPIO的基本操作了,接下来我们开始进入外部中断的操作,这是一个惊心动魄的时刻,为什么呢?在使用Hal库的同时你会感觉到其优势性,开发效率大大提高带来的快感。

前期准备

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

5.2 Key按键中断

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

\'【五】零基础上手HAL库之—按键外部中断_STM32_02\'

\'【五】零基础上手HAL库之—按键外部中断_C_03\'

1、新建工程

\'【五】零基础上手HAL库之—按键外部中断_C_04\'

\'【五】零基础上手HAL库之—按键外部中断_C_05\'

2、时钟配置

\'【五】零基础上手HAL库之—按键外部中断_HAL库_06\'

\'【五】零基础上手HAL库之—按键外部中断_C_07\'

3、Debug配置为DAP

\'【五】零基础上手HAL库之—按键外部中断_C_08\'

\'【五】零基础上手HAL库之—按键外部中断_HAL库_09\'

4、GPIO配置为中断

\'【五】零基础上手HAL库之—按键外部中断_C_10\'

  • ① GPIO模块配置模块
  • ② 各引脚配置: PC12/PC13(外部中断模式中断线12和13),共用一个中断向量。PC14/PC15输出模式为LED的两个引脚
  • ③ 引脚功能具体配置:
    • GPIO mode :上升沿/下降沿/上下降沿 中断和事件模式。
    • GPIO Pull-up/Pull-down:因为我的板子硬件上有上拉电阻即平常电平为高电平,所以配置为弱上拉形式。
    • User Lable:这里没有使用到用户标签为了方便在图中右半部分看到引脚所配置的功能。
  • ④ 输出模式配置:PC14/PC15配置为输出模式,控制LED灯亮灭。
  • ⑤ 外部中断线13:PC13为下降沿触发的外部中断模式,KEY1。
  • ⑥ 外部中断线12:PC12为下降沿触发的外部中断模式,KEY2。

\'【五】零基础上手HAL库之—按键外部中断_C_11\'

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

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

\'【五】零基础上手HAL库之—按键外部中断_STM32_12\'

按下回车后如图:

\'【五】零基础上手HAL库之—按键外部中断_C_13\'

\'【五】零基础上手HAL库之—按键外部中断_HAL库_14\'

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

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

\'【五】零基础上手HAL库之—按键外部中断_C_15\'

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

\'【五】零基础上手HAL库之—按键外部中断_C_16\'

\'【五】零基础上手HAL库之—按键外部中断_HAL库_17\'

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);
7.2 编写回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_12)
	{
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_14);
	}
	
	if(GPIO_Pin == GPIO_PIN_13)
	{
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_15);
	}
}

最后就是下载代码的兴奋时刻了:

\'【五】零基础上手HAL库之—按键外部中断_STM32_18\'

以上是关于零基础上手HAL库之—按键外部中断的主要内容,如果未能解决你的问题,请参考以下文章

零基础上手HAL库之—环境搭建

零基础上手HAL库之—GPIO点灯

零基础上手HAL库之—熟悉Cubemx软件的框架

STM32 HAL库学习系列第9篇---NVIC按键外部中断函数

STM32的按键方法

如何实现F411RE使用HAL库实现IO中断