Air001外部中断/事件控制器功能

Air001外部中断/事件控制器


  • ✨对于外部中断,一般单片机基本标配的硬件功能,使用方法也没有什么特别的地方,对于事件控制器,用于停机模式下唤醒单片机功能,但是使用起来很简单,只需配置其引脚模式即可。
  • 🔖目前只看到该芯片的数据手册,没有看到参考手册,也没法具体了解其机制原理。
  • 🔰Stop mode(停机模式):该模式下 SRAM 和寄存器的内容保持,HSI 和 HSE 关闭,VDD 域下大部分模块的时钟都被停掉。GPIO,COMP output,LPTIM 可以唤醒 stop 模式。
    注: 在进入停机式时,IWDG和对应的时钟不会被停止。

📓外部中断/事件控制器(EXTI)数据手册描述语:

外部中断/事件控制器包含19个边沿检测器,用于产生中断/事件请求。每个中断线都可以独立地配置它的触发事件(上升沿或下降沿或双边沿),并能够单独地被屏蔽;有一个挂起寄存器维持所有中断请求的状态。18个通用I/O口连接到16个外部中断线。

👉🏻外部中断注意事项

  • ⚡在外部中断触发后,需要在中断函数中,再次使能对应引脚的外部中断,否则无法响应第二次中断。这和STM32有所差异。

🌻配置外部中断

/**
  * @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_2;//中断引脚
  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/1MvqgXsYmG-VvXKeRCy-Agg 
提取码:6fnm
  • 🌿停机模式事件例程
链接:https://pan.baidu.com/s/1AiuNOeNkxFgz2MiskKNTsw 
提取码:lclm
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值