【STM32F103实验(五)】外部中断

本文详细介绍了STM32F103的外部中断特性,包括19个中断线的配置和GPIO与中断线的映射关系。实验要求通过外部中断控制LED1的状态翻转,具体实现步骤包括IO口初始化、中断线映射、中断配置和中断服务函数编写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、STM32外部中断介绍

STM32的每一个IO口都可以作为外部中断的中断输入口。STM32F103的中断控制器支持19个外部中断/事情请求。每个中断都设有状态位,每个中断/事件都有独立的触发和屏蔽设置。

STM32F103的19个外部中断为:

线0~15对应外部IO口的输入中断
线16连接到PVD输出
线17连接到RTC闹钟事件
线18连接到USB唤醒事件

其中,STM32供IO口使用的中断线只有16个。STM32如何把16个中断线和IO口一一对应起来呢?STM32是这样设计的,GPIO的管脚GPIOx.0~GPIOx.15(x = A,B,C,D,E,F,G)分别对应中断线0~15,如此一来,每个中断线对应了最多7个IO口。举个例子说明,GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0对应中断线0。每个中断线上每次只能连接在1个IO口上,这样就需要通过配置来决定对应中断线配置到哪个GPIO上了。如下是GPIO和中断线的映射关系图:

二、实验要求

按下按键KEY1,采用外部中断方式控制LED1状态的翻转。

三、程序

1. IO口外部中断初始化步骤

(1)初始化IO口为输入;

(2)开启AFIO时钟;

(3)设置IO口与中断线的映射关系;

(4)初始化线上中断,设置触发条件等;

(5)配置中断分组(NVIC),并使能中断;

(6)编写中断服务函数。

void exit_init(void)
{
    EXTI_InitTypeDef EXTI_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;
    
    key_init(); //按键初始化
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //复用AFIO时钟使能
    
    /****************GPIOE.3与中断线3进行映射***************/
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);  //KEY1-PE3,设置PE3和中断线3的映射
    
    /*********************初始化中断线上中断**********************/
    EXTI_InitStruct.EXTI_Line = EXTI_Line3; //中断线3
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;    //下降沿触发
    EXTI_Init(&EXTI_InitStruct);
    
    /*********************配置中断分组***********************/
    NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn;   //使能按键KEY1外部中断通道3
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;  //抢占优先级2
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2; //子优先级2
    NVIC_Init(&NVIC_InitStruct);
    
}

void EXTI3_IRQHandler(void) //外部中断3服务函数
{
    delay_ms(10);   //消抖
    if(KEY1 == 0)
    {
        LED1 = !LED1;
    }
    EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE3上的中断标志位
}
2. 主函数
int main(void)
{
    exit_init();
    LED_init();
    delay_init();
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2
    while(1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

单片机学习之路

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

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

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

打赏作者

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

抵扣说明:

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

余额充值