历史上的今天
今天是:2025年07月10日(星期四)
2018年07月10日 | STM32F0xx_EXTI中断配置详细过程
2018-07-10 来源:eechina
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的中断配置是有些许的不同,但是大致还是差不多的。
史海拾趣
|
converted tri node “端口名”that feeds logic to a wire removing OPNDRN node “端口名” that feeds logic 请问意思是说把三态门和OD门 remove掉了吗?出现这个warning的原因是什么呀? 我的代码剪切下来如下: inout dq; reg oe; assig ...… 查看全部问答> |
|
请教一下高手,我现在用Microchip的30F系列的单片机6011A与触摸屏进行485串口通讯,现在的情况是:液晶模块可以显示汉字等,但是不能实现翻屏。也就是单片机可以发送给液晶,但是液晶触摸屏反馈来的信息单片机没有回应,没有接收。用串口调试助手, ...… 查看全部问答> |
|
在WinCE当中定义了很多函数,它们具有一些特定的功能。但是在各个厂商的BSP当中也有定义很多同名的函数,提供了针对该平台的一些特定功能。那么WinCE到底靠什么来确定该调用那个函数了。比喻说在在在InterruptInitialize()调用OEMInterruptEnable ...… 查看全部问答> |
|
typedef struct { uchar src_mac_id :8; uchar dest_mac_id :8; uchar ack   ...… 查看全部问答> |
|
最近刚开始学习arm-linux,手头有个2410的开发板,看了些东西了,但是有个问题纠结着,不要笑话哈~初学者~:::::::::::::::::::::::::::::::::::::::::::::::::linux操作系统和自己编写的程序(点 ...… 查看全部问答> |
|
【跟TI学电源】系列-----TI模拟应用期刊2012年前三期 TI每季度的模拟应用期刊---2012 [ 本帖最后由 qwqwqw2088 于 2012-11-15 23:04 编辑 ]… 查看全部问答> |
|
CircuitCo免费赠送Educational BoosterPack 依旧是launchpad的扩展板,资源比较丰富 ompatibilityMSP430 LaunchPadPower3.3V via expansion headerDisplay type2x16 character LCDDisplay interfaceSerialIndicatorsTri-color (RGB) LED and white LEDSensor typeAccelerometerSensor inpu ...… 查看全部问答> |
|
学习MSP430G2553遇到的定时器和串行I2C的问题求助 最近在学MSP430G2553这个单片机,一切觉得都还不错,但就是有两个问题不大理解 1:定时器那不会(不是看门狗定时器),就特别简单的定时程序要怎么写呢?还有那个PMW波又是什么意思? 2:串行通信的I2C软件程序要怎么编写,里面有发送/接收字节 ...… 查看全部问答> |




