历史上的今天
今天是:2025年01月15日(星期三)
2019年01月15日 | STM32F0xx_EXTI中断配置详细过程-按键检测
2019-01-15 来源:eefocus
1、概述
EXIT外部中断在使用到按键或者开关控制等应用中比较常见,低功耗中断唤醒也是很常见的一种。因此,EXIT在实际项目开发中也是比较常见的一种。EXTI(External interrupt/event controller) —外部中断/事件控制器, 管理了控制器的 20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。 EXTI 可以实现对每个中断/事件线进行单独置可以单独配置为中断或者事件,以及触发事件的属性。
EXTI功能框图:
2、准备工作
本次采用按键作为触发源的方式来使得控制器产生中断,并在中断服务函数中执行相应的命令。按键按下->LED状态做出相应的改变,并尝试用不同优先级的中断来让LED灯做出相应的改变。
硬件设计:
轻触按键在按下时会使得引脚接通,通过电路设计可以使得按下时产生电平变化。
3、代码描述
3.1 初始化用来中断的GPIO
3.2 初始化EXTI
3.3 配置NVIC
3.4编写中断服务函数
按键和EXTI宏定义:

嵌套向量中断控制器NVIC配置:
/**************************************************/
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/*配置中断源:KEY2*/
NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1; //指定IRQ通道的优先级在NVIC_IRQChannel中,这个参数可以设定为0到3之间
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/*配置中断源:KEY1*/
NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0; //指定IRQ通道的优先级在NVIC_IRQChannel中,这个参数可以设定为0到3之间
NVIC_Init(&NVIC_InitStructure);
}
这个优先级参数可以自行设定(参数设定为0到3之间,0的优先级最高)
EXTI中断配置:
/*中断EXTI_PA0配置初始化*/
void EXTI_PA0_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
//时钟使能
RCC_AHBPeriphClockCmd(KEY1_INT_GPIO_CLK,ENABLE);
RCC_APB2PeriphClockCmd(KEY1_INT_EXTI_CLK,ENABLE);
NVIC_Configuration();
//外部按键GPIO初始化,PA0
GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(KEY1_INT_GPIO_PORT,&GPIO_InitStructure);
//将EXTI0指向PA0
SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,EXTI_PinSource0);
//EXTI0中断线配置
EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//下降沿中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void EXTI_PA2_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
//时钟使能
RCC_AHBPeriphClockCmd(KEY2_INT_GPIO_CLK,ENABLE);
RCC_APB2PeriphClockCmd(KEY2_INT_EXTI_CLK,ENABLE);
NVIC_Configuration();
//外部按键GPIO初始化,PA2
GPIO_InitStructure.GPIO_Pin = KEY2_INT_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(KEY2_INT_GPIO_PORT,&GPIO_InitStructure);
//将EXTI2指向PA2
SYSCFG_EXTILineConfig(KEY2_INT_EXTI_PORTSOURCE,EXTI_PinSource2);
//EXTI2中断线配置
EXTI_InitStructure.EXTI_Line = KEY2_INT_EXTI_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//下降沿中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
EXTI中断服务函数:
//KEY1_IRQHandler()中断服务函数
void KEY1_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0)!=RESET) //确保中断是否产生
{
//中断处理
LED_ON();
delay_ms(500);
LED_OFF();
delay_ms(500);
LED_ON();
delay_ms(500);
LED_OFF();
delay_ms(500);
LED_ON();
delay_ms(500);
LED_OFF();
delay_ms(500);
LED_ON();
delay_ms(500);
}
EXTI_ClearFlag(EXTI_Line0); //清除中断标志位
}
//KEY2_IRQHandler()中断服务函数
void KEY2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2)!=RESET) //确保中断是否产生
{
//中断处理
LED_OFF();//LED熄灭
delay_ms(1000);
}
EXTI_ClearFlag(EXTI_Line2); //清除中断标志位
}
当中断发生时,相应的中断服务函数就会被执行,我们可以在中断函数中实现一些控制。
一般为确保中断确实发生,我们会在中断服务函数中调用中断标志位状态读取函数读取外设中断标志位并判断标志位状态。
主函数:
#include "ALL_Includes.h" //包含所有的头文件
int main(void)
{
//初始化函数
LED_Init();
Delay_Init(48);
LED_ON();
delay_ms(5000);
EXTI_PA0_Config(); //初始化中断
EXTI_PA2_Config();
while(1)
{
//等待
}
}
总结:
stm32f030的中断配置与stm32f103的中断配置是有些许的不同,但是大致还是差不多的。
下一篇:stm32之中断系统
史海拾趣
|
作者:崔晓楠 日期:2006-11-1 来自 今日电子 美国华盛顿州立大学物理系研究人员近日设计出一种新型分子,其对光的传播的控制能力比现有的最好材料提高了近20倍,一旦成功用于超快光电开关,将能大大提高互联网与光通信的速度。 研究 ...… 查看全部问答> |
|
用串行总线(USB)原理及接口设计 摘要:以USB1.1为基础讨论了USB的基本原理、工作流程、通信协议和相应的关键技术,并介绍了一种USB接口的10M以太网卡的设计方案。已经发布的USB2.0支持480Mbps的高速数据传输,这将使P ...… 查看全部问答> |
|
思路: 1. 通过上位机软件编辑处理效果数据,并存入SD卡中; 2. 通过SSP0读取SD卡中的数据信息到RAM中; 3. 更加效果数据的结构,进行数据转换,转换成LED灯具可以设别的灰度数据; 4. 通过SSP1发送灰度数据到LE ...… 查看全部问答> |
|
问题是这样,我用videnc_copy修改,加入我的放大算法代码,在process里面要用到width height pitch等值, 要传参数,我把这些变量放到process里面声明称局部变量并赋初值,程序就跑的很快(20ms),但是我把这几个变量 复制到process的外面(全局 ...… 查看全部问答> |
|
探讨一下关于symbian智能手机操作系统的技术问题 各位从事symbian 智能手机研发或者从事相关电信领域工作的同弟姐妹们,我从事这方面的工作有相当长 的时间,对这个行业,包括有些技术领域有些困惑,想结识一些有同样背景的朋友们,做一下各方 ...… 查看全部问答> |
|
大家做的产品,无论是量产的还是正在开发中的,都打上了CE5的补丁了吗?这些补丁全部打上之后对系统的性能会有改善或者倒退的影响吗? 我现在正在做的产品没有打任何补丁,但是总感觉电源管理有些问题,有时候睡眠唤醒收不到PBT_TRANSITION以及PBT ...… 查看全部问答> |
|
通过TSP利用3700系列系统开关/万用表和2600系列SourceMeter® 在2005年,随着2600系列第一款一体化源表的引进,吉时利推出了安装有板上测试脚本处理器(Test Script Processors,TSP™)的测试测量仪器。TSP执行基于文本的程序,非常类似于SCPI,具有增强的测试序列/流程控制、决策判断以及利用用户自定义 ...… 查看全部问答> |
|
一、环境说明:HALCoGen :版本03.05.02CCS :版本Code Composer Studio Version:5.4.0.00091硬件 :TMS570LS031USB 二、工作目录: CCS工作 ...… 查看全部问答> |
|
1. 设计要求单臂式雨刮器,步进电机驱动,摆角+70o, 周期范围为0.5S~20S。需根据雨量传感器数据调整摆动周期。需要使用显示器显示当前雨刮器的摆动周期。雨刮器说明:为防损坏雨刮,雨刮器每步摆动角必需小于1o ,请根据这个需要选择步距角合适的步 ...… 查看全部问答> |





