STM32入门2-外部中断(按键操作)

欢迎入群共同学习交流
时间记录:2023/12/2

一、基础知识介绍

  1. 外部中断:简单易懂的理解就是你在吃饭,这时候有人给你打电话(中断请求),然后你先去接起电话(中断响应),打完电话后接着回来吃饭(中断返回),当然中间还有一个多中断同时发生时根据中断优先级进行选择的步骤
  2. 配置步骤
    (1) 使能GPIO口时钟配置为输出模式
    (2) 使能AFIO时钟,绑定外部中断线
    stm32f10x_gpio.c文件中的void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);函数绑定外部中断线
    (3) 初始化外部中断EXTI
    stm32f10x_exti.c文件中的void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);函数,关于EXTI_InitStruct变量为外部中断结构体,可设置中断线(Line)、使能中断线(Cmd)、触发模式(Mode)、触发方式(Trigger)
    (4) 设置中断优先级组
    misc.c文件中的void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);函数进行设置
    (5) 初始化中断优先级NVIC
    misc.c文件中的void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);函数进行设置,关于NVIC_InitStruct结构体,可以设置中断请求信道(Channel)、使能中断请求(Cmd)、抢占式优先级(PreemptionPriority)、响应式优先级(SubPriority),中断请求线在stm32f10x.h中查找
    (6) 在stm32f10x_it.c文件中编写中断函数,或者将stm32f10x_it.h头文件包含,重写中断函数,中断函数的句柄在启动文件(.s)中查找
    (7) ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);函数获取中断线状态
    (8) void EXTI_ClearITPendingBit(uint32_t EXTI_Line);函数清除中断线中断标志

二、事例代码(GPIOA1为例)

1.头文件(.h)

#ifndef __KEY_H__
#define __KEY_H__
#include "stm32f10x.h"
#include "stm32f10x_it.h"

void vKeyInit(void);

#endif

2.源文件(.c)

#include "key.h"

void vKeyInit(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;  //上拉输入
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
    
    //2. 设置AFIO引脚的中断复用功能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能时钟
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);//绑定外部中断线
    
    //3. 设置外部中断EXTI
    EXTI_InitTypeDef EXTI_InitStruct;
    EXTI_InitStruct.EXTI_Line = EXTI_Line1;//中断口
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;//开启EXTI中断
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//设置为中断模式
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
    EXTI_Init(&EXTI_InitStruct);
    
    //4.配置分配中断优先级NVIC
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = EXTI1_IRQn;//中断请求线
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//允许中断
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级的优先级
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;//响应优先级的优先级
    NVIC_Init(&NVIC_InitStruct);
}

//设置中断函数
void EXTI1_IRQHandler(void)
{
    //获取中断线状态
    if(EXTI_GetITStatus(EXTI_Line1)==SET){
        //软件复位
        EXTI_ClearITPendingBit(EXTI_Line1);
    }
}

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32中,外部中断可以通过GPIOx_EXTIy_IRQn中断线路来实现。其中,x表示GPIO端口号,y表示引脚号。例如,PA0引脚的外部中断线路为GPIOA_EXTI0_IRQn。 以下是通过PA0引脚实现按键外部中断的步骤: 1. 配置GPIOA的PA0引脚为输入模式,并使能GPIOA时钟。 2. 配置PA0引脚为外部中断触发源,可以选择上升沿、下降沿、双边沿触发。 3. 使能PA0引脚的外部中断线路,并使能对应的中断向量。 4. 在中断处理函数中添加相应的处理代码。 下面是具体的代码实现: ```c #include "stm32f10x.h" void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { //处理按键中断事件 //...... EXTI_ClearITPendingBit(EXTI_Line0); } } int main(void) { //使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //配置PA0引脚为输入模式 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); //配置PA0引脚为外部中断触发源,下降沿触发 EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //使能PA0引脚的外部中断线路,并使能对应的中断向量 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); while(1) { //主循环代码 //...... } } ``` 在中断处理函数中,需要先判断是哪个外部中断触发了中断请求,然后执行相应的处理代码。最后,需要调用EXTI_ClearITPendingBit函数清除相应的中断标志位,以便下一次中断请求能够被正确地触发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值