【百问网】物联网学习笔记4
百问网资料下载中心 — 百问网资料下载中心 3.0 文档http://download.100ask.net/
【STM32】HAL库 STM32CubeMX教程三----外部中断(HAL库GPIO讲解)_Z小旋的博客-CSDN博客_stm32hal库外部中断前言上一节我们讲解了STM32CubeMX的基本使用和工程的配置,那么这一节我们正式来学习CubeMX配置STM32的各个外设功能了今天我们会详细的带你学习STM32CubeMX配置外部中断,并且讲解HAL库的GPIO的各种函数,带你学习不一样的STM32如果还没有配置过工程,请参看上一篇博客《STM32CubeMX教程二--基本使用(新建工程点亮LED灯)》那么话不多说,我们开...https://blog.csdn.net/as480133937/article/details/98983268中断流程如下图
1.抢占优先级高的中断可以中断抢占优先级低的中断
2.两个中断的抢占优先级相同,后来中断要等前面的中断处理完
GPIO引脚较多,所以共享中断线。
如果PA0作为了中断源,那么PB0-PG0都不能作为中断源。
中断事件是一种可以导致中断发生的事件,中断则是因为中断事件的发生而导致的后续行为过程。
实现按键开关LED。程序基于HAL库,结构如下
在原理图中按键引脚PA0,设置初始化PA0 GPIO
// 文件名称:driver_key.c
#include
#include "driver_key.h"
#include "driver_led.h"
void KeyInit(void)
{
// 定义GPIO的结构体变量
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能按键的GPIO对应的时钟
KEY_GPIO_CLK_EN();
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // 设置为下降沿触发外部中断
GPIO_InitStruct.Pull = GPIO_PULLUP; // 默认上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 引脚反转速度设置为快
// 初始化按键引脚配置
GPIO_InitStruct.Pin = KEY_GPIO_PIN; // 选择按键的引脚
HAL_GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}
中断函数:
/* 说明:如下的外部中断函数均可放在stm32f1xx_it.c中,
* 如果放在其中需要注意包含本文件的.h头文件,此处将中断函数放在本文件只是为了方便理清逻辑
* 函数名:void EXTI0_IRQHandler(void)
* 函数作用:外部中断0的中断处理函数
*/
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(KEY_GPIO_PIN);
// 这个函数处理EXTI中断请求。@param GPIO_Pin:指定连接EXTI线的引脚@retval 无
// 会调用HAL_GPIO_EXTI_Callback 回调函数处理
}
/*
* 函数名:void HAL_GPIO_EXTI_Callback(void)
* 函数作用:外部中断处理函数的回调函数,用以处理不同引脚触发的中断服务最终函数
*/
static volatile bool key_flag = false; // 定义一个全局静态标志,用以判断按键按下的次数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
switch(GPIO_Pin) // 判断是哪个按键
{
case KEY_GPIO_PIN: // 如果是用户按键
{
key_flag = !key_flag; // 按下一次标志翻转一次
BLED(key_flag?OFF:ON); // 根据标志控制蓝灯的亮灭
break;
}
default:break;
}
}
HAL_GPIO_EXTI_IRQHandler 清除中断标志位,之后进入中断回调函数中。
在HAL库中,中断运行结束后不会立刻退出,而是会先进入相对应的中断回调函数,处理该函数中的代码之后,才会退出中断,所以在HAL库中我们一般将中断需要处理代码放在中断回调函数中。
在文件driver_led.h有宏定义
在main函数中调用初始化按键