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

前言

专栏内容 持续更新,目前正在进行优惠活动

目录

前言

一、原理分析

1. 中断

2. 中断图示

3. 其它概念

二、工程项目结构

  EXIT.c

  NVIC.c

三、源码下载


一、原理分析

1. 中断

类比:任务插队。

目的:提高系统实时性的一种手段。

原理:高优先级打断低优先级任务,低优先级任务被挂起。

2. 中断图示

3. 其它概念


二、工程项目结构

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

  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);                                            //设置生效
}

三、源码下载

4_外部中断实现按键采集.rar - 蓝奏云文件大小:2.2 M|https://taileliekaishi.lanzouu.com/iJYY7ffuvmd

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个写代码的修车工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值