Air001外部中断/事件控制器
- ✨对于外部中断,一般单片机基本标配的硬件功能,使用方法也没有什么特别的地方,对于事件控制器,用于停机模式下唤醒单片机功能,但是使用起来很简单,只需配置其引脚模式即可。
- 🔖目前只看到该芯片的数据手册,没有看到参考手册,也没法具体了解其机制原理。
- 🔰Stop mode(停机模式):该模式下 SRAM 和寄存器的内容保持,HSI 和 HSE 关闭,VDD 域下大部分模块的时钟都被停掉。GPIO,COMP output,LPTIM 可以唤醒 stop 模式。
注: 在进入停机式时,IWDG和对应的时钟不会被停止。
📓外部中断/事件控制器(EXTI)数据手册描述语:
外部中断/事件控制器包含19个边沿检测器,用于产生中断/事件请求。每个中断线都可以独立地配置它的触发事件(上升沿或下降沿或双边沿),并能够单独地被屏蔽;有一个挂起寄存器维持所有中断请求的状态。18个通用I/O口连接到16个外部中断线。
🌻配置外部中断
/**
* @brief 配置EXTI
* @param 无
* @retval 无
*/
static void APP_ConfigureExti(void)
{
/* 配置引脚 */
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE(); /* 使能GPIOA时钟 */
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; /* GPIO模式为下降沿中断 */
GPIO_InitStruct.Pull = GPIO_PULLUP; /* 上拉 */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; /* 速度为高速 */
GPIO_InitStruct.Pin = GPIO_PIN_3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* 使能EXTI中断 */
HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);
/* 配置中断优先级 */
HAL_NVIC_SetPriority(EXTI2_3_IRQn, 0, 0);
}
/*EXTI中断函数*/
void EXTI2_3_IRQHandler(void)
{
/* LED翻转 */
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
// printf("EXTI2_3_IRQHandler \n");
}
🌼引脚事件配置
- 🌿只需将引脚模式配置为对应的事件触发模式即可,没有中断服务函数
/**
* @brief 配置事件引脚引脚
* @param 无
* @retval 无
*/
static void APP_ConfigureEXTI(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE(); /* 使能GPIOA时钟 */
GPIO_InitStruct.Mode = GPIO_MODE_EVT_FALLING; /* GPIO模式为下降沿中断 */
GPIO_InitStruct.Pull = GPIO_PULLUP; /* 上拉 */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; /* 速度为高速 */
GPIO_InitStruct.Pin = GPIO_PIN_6;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
- 📑停机模式下,事件唤醒main代码
#include "main.h"
#include "usart.h"
#include "gpio.h"
#include "Button.h"
/* Private define ------------------------------------------------------------*/
//EXTI_HandleTypeDef exti_handle;
/* Private variables ---------------------------------------------------------*/
/* Private user code ---------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
static void APP_ConfigureEXTI(void);
/**
* @brief 应用程序入口函数.
* @retval int
*/
int main(void)
{
/* 复位所有外设,初始化flash接口和systick */
HAL_Init();
/* 初始化LED */
MX_GPIO_Init();
/* 初始化按键BUTTON :PF4 -->Boot0按键*/
BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO);
/* 配置外部中断 */
APP_ConfigureEXTI();
/* 暂停systick */
HAL_SuspendTick();
/* 点亮小灯 */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
/* 等待用户按键按下,主机程序开始运行 */
while(BSP_PB_GetState(BUTTON_KEY) == 0)
{
}
/* 关闭小灯 */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
/* 进入STOP模式 */
HAL_PWR_EnterSTOPMode(1, PWR_SLEEPENTRY_WFE);
/* 恢复systick */
HAL_ResumeTick();
while(1)
{
/* LED翻转 */
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
HAL_Delay(500);
}
}
/**
* @brief 配置事件引脚引脚
* @param 无
* @retval 无
*/
static void APP_ConfigureEXTI(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE(); /* 使能GPIOA时钟 */
GPIO_InitStruct.Mode = GPIO_MODE_EVT_FALLING; /* GPIO模式为下降沿中断 */
GPIO_InitStruct.Pull = GPIO_PULLUP; /* 上拉 */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; /* 速度为高速 */
GPIO_InitStruct.Pin = GPIO_PIN_6;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
📚Air001外部中断和停机模式事件唤醒个人测试例程
- 🌿从SDK例程资源移植出来的,工程无需配置可独立编译。如不需要生成BIN文件可以取消勾选。
- 🌿外部中断例程
链接:https://pan.baidu.com/s/17beYWaPTUdVLXrZ77LYMbQ
提取码:vhn5
- 🌿停机模式事件例程
链接:https://pan.baidu.com/s/1AiuNOeNkxFgz2MiskKNTsw
提取码:lclm