【STM32】按键中断从理论到程序实例

【百问网】物联网学习笔记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中断流程如下图

【STM32】按键中断从理论到程序实例_第1张图片

NVIC嵌套向量中断控制器

【STM32】按键中断从理论到程序实例_第2张图片

1.抢占优先级高的中断可以中断抢占优先级低的中断

2.两个中断的抢占优先级相同,后来中断要等前面的中断处理完

【STM32】按键中断从理论到程序实例_第3张图片

GPIO引脚较多,所以共享中断线。

如果PA0作为了中断源,那么PB0-PG0都不能作为中断源。

中断事件是一种可以导致中断发生的事件,中断则是因为中断事件的发生而导致的后续行为过程。

按键中断程序

 实现按键开关LED。程序基于HAL库,结构如下

【STM32】按键中断从理论到程序实例_第4张图片

【STM32】按键中断从理论到程序实例_第5张图片

在原理图中按键引脚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有宏定义

【STM32】按键中断从理论到程序实例_第6张图片

 在main函数中调用初始化按键

【STM32】按键中断从理论到程序实例_第7张图片

你可能感兴趣的:(stm32,单片机,嵌入式硬件)