STM32单片机外部中断实现按键控制

源码下载链接:https://taileliekaishi.lanzous.com/iJYY7ffuvmd

中断(任务插队):
目的:提高系统实时性的一种手段
原理:高优先级打断低优先级任务,低优先级任务被
挂起

中断图示:

工程项目结构

其中画红色方框部分为重要函数实现功能

EXIT.c

#include "EXTI/EXTI.h"


u8 keyvalue = 0; //键值
/**
 * 功能:初始化外部中断0/1
 * 参数:None
 * 返回值:None
 */
void initEXTI_0_1(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;                        //定义外部中断初始化结构体

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);        //开启外设复用时钟

		// 将外部中断线和对应的IO口进行绑定
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3); //使用PA0作为EXTI0信号输入源
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;                  //设置外部中断线0
	// 这种模式:当中断发生的时候跳转到外部中断服务函数
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;         //外部中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;     //下降沿触发中断
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;                   //使能外部中断屏蔽寄存器
    EXTI_Init(&EXTI_InitStructure);                             //设置生效

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1); //使用PA1作为EXTI1信号输入源
    EXTI_InitStructure.EXTI_Line = EXTI_Line1;                  //设置外部中断线1
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;         //外部中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;     //下降沿触发中断
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;                   //使能外部中断屏蔽寄存器
    EXTI_Init(&EXTI_InitStructure);                             //设置生效
}

/**
 * 功能:外部中断0中断服务函数
 * 参数:None
 * 返回值:None
 */
void EXTI0_IRQHandler(void)
{
	// 外部中断线为1则表明产生了外部中断
    EXTI_GetFlagStatus(EXTI_Line0);    //获取外部中断挂起位
    keyvalue = getKeyValue(KEY_PRESS); //获取键值
	// 如果第一次进入中断服务函数没有清除中断标志位的话则会永远执行中断服务函数
    EXTI_ClearFlag(EXTI_Line0);        //清除外部中断挂起位
    
}

/**
 * 功能:外部中断1中断服务函数
 * 参数:None
 * 返回值:None
 */
void EXTI1_IRQHandler(void)
{
    EXTI_GetFlagStatus(EXTI_Line1);    //获取外部中断挂起位
    keyvalue = getKeyValue(KEY_PRESS); //获取键值
    EXTI_ClearFlag(EXTI_Line1);        //清除外部中断挂起位
}

NVIC.c

#include "NVIC/NVIC.h"

/**
 * 功能:初始化NVIC,初始化内容包括:分配优先级分组号,分配对应中断优先级
 * 参数:NVIC_PriorityGroup : 设置优先级分组号
 *      参数值:NVIC_PriorityGroup_x
 * 返回值:None
 */
void initNVIC(u32 NVIC_PriorityGroup)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup); //中断分组
		
	//使能之后才能实现当中断发生的时候才能跳转到中断服务函数
    setNVIC(EXTI0_IRQn,1,1,ENABLE); //配置外部中断0优先级
    setNVIC(EXTI1_IRQn,1,2,ENABLE); //配置外部中断1优先级
}


/**
 * 功能:设置对应外设中断
 * 参数:InterruptNum: 对应中断的中断编号
 *       PreemptionPriority:指定抢占优先级
 *       SubPriority:指定子优先级
 *       NVIC_Sta:使能或者失能中断
 * 返回值:None
 */  
void setNVIC(u8 InterruptNum, u8 PreemptionPriority, u8 SubPriority, FunctionalState NVIC_Sta)
{
    NVIC_InitTypeDef NVIC_InitStructure;                                       //定义NVIC初始化结构体

    NVIC_InitStructure.NVIC_IRQChannel = InterruptNum;                         //指定配置的中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriority; //设置抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = SubPriority;               //设置子优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = NVIC_Sta;                          //使/失能中断
    NVIC_Init(&NVIC_InitStructure);                                            //设置生效
} 

本文地址:https://blog.csdn.net/weixin_39903708/article/details/107891877

(0)
上一篇 2022年3月23日
下一篇 2022年3月23日

相关推荐