共计 2414 个字符,预计需要花费 7 分钟才能阅读完成。
【五】零根底上手 HAL 库之—按键内部中断
5.1 前言
咱们曾经大抵的理解了 Cubemx 软件中 GPIO 的基本操作了,接下来咱们开始进入内部中断的操作,这是一个触目惊心的时刻,为什么呢?在应用 Hal 库的同时你会感觉到其劣势性,开发效率大大提高带来的快感。
后期筹备
- STM32 各类型的板子(自己应用 F103Rc 和 F407ZE)。
- CubeMx 软件,Keil\_IDE。
5.2 Key 按键中断
同样的咱们先来看看按键模块的原理图局部:
当按键没有按下时,按键局部相当于断路,PC13 的电压相当于电容两端电压为 3.3V。
当按键按下时,按键局部相当于短路(即一根导线),PC13 的电压和 GND 地相连为 0V。
所以按键从未按下到按下相当于是一个高电平到低电平的跳变,简称为降落沿。所以说咱们在按键中断时抉择的模式就是降落沿触发。
1、新建工程
搜寻或者筛选芯片后,点击 Start Project 胜利创立一个我的项目。
2、时钟配置
点击 RCC 进入时钟配置,配置高速时钟为内部晶振,软件主动配置了两个晶振的引脚如图 PD0 和 PD1
3、Debug 配置为 DAP
4、GPIO 配置为中断
- ① 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。
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);
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);
}
}
咱们来看看回调函数是怎么工作的:
①:产生中断进入函数 void HAL\_GPIO\_EXTI\_IRQHandler(uint16\_t GPIO\_Pin);
②:获取产生中断的引脚
③:革除对应引脚的标记位
④:进入回调函数对此行为进行解决,产生相应的动作
⑤:回到函数 void HAL\_GPIO\_EXTI\_IRQHandler(uint16\_t GPIO\_Pin);直至跳出函数。
所以说回调函数相当于用户层的利用函数,也就是只须要在回调函数写入相应引脚产生中断而要做出的反馈即可,不须要像规范库那样手动的革除标记位。
所以 16 个内部中断只须要调用一个函数进行 if 判断即可,真正的模块化编程!!!!
来看看内部中断还能做什么
比方能够用来:超声波测距,编码器测速,按键中断等等,但凡要测上降落沿的利用均可应用。
最初就是下载代码的兴奋时刻了:
下载代码到板子中,咱们按下不同的按键不同的LED对应的进行电平的翻转操作。
好啦,内部中断就是这么简略就完结了,怎么样是不是感觉也很简略呀!