【五】零根底上手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对应的进行电平的翻转操作。
好啦,内部中断就是这么简略就完结了,怎么样是不是感觉也很简略呀!
发表回复