外部中断配置步骤
要使用外部中断我们就需要先配置它,通常都需经过这几步:
(EXTI相关库函数在stm32f10x_exti.c和stm32f10x_exti.h文件中)
(1)使能IO口时钟,配置IO口模式为输入
(2)开启 AFIO 时钟,设置 IO 口与中断线的映射关系
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); void
GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
(3)配置中断分组(NVIC),使能中断
(4)初始化EXTI,选择触发方式
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
typedef struct {
uint32_t EXTI_Line; //中断/事件线
EXTIMode_TypeDef EXTI_Mode; //EXTI模式
EXTITrigger_TypeDef EXTI_Trigger;//EXTI触发方式
FunctionalState EXTI_LineCmd; //中断线使能或失能
}EXTI_InitTypeDef;
(5)编写EXTI中断服务函数(可以在启动文件里查询)
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler
4.编写外部中断控制程序
要实现外部中断方式控制LED,程序框架如下:
(1)初始化对应端口的EXTI
(2)编写EXTI中断函数
(3)编写主函数
exti.c
#include "exti.h"
#include "led.h"
#include "SysTick.h"
#include "key.h"
/*******************************************************************************
* 函数名 : My_EXTI_Init
* 函数功能 : 外部中断初始化¯
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void My_EXTI_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启外部中断对应的时钟
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);//选择GPIO管脚用作外部中断线路
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3);//选择GPIO管脚用作外部中断线路
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);//选择GPIO管脚用作外部中断线路
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//选择GPIO管脚用作外部中断线路
//EXTI0 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0配置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//EXTI2 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//EXTI2配置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//EXTI3 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//EXTI2配置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =1; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//EXTI4 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//EXTI2配置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
EXTI_InitStructure.EXTI_Line=EXTI_Line0;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line=EXTI_Line2|EXTI_Line3|EXTI_Line4;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
/*******************************************************************************
* 函数名 : EXTI0_IRQHandler
* 函数功能 : 外部中断0函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0)==1)
{
delay_ms(10);
if(K_UP==1)
{
led2=0;
}
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
/*******************************************************************************
* 函数名 : EXTI3_IRQHandler
* 函数功能 : 外部中断3函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3)==1)
{
delay_ms(10);
if(K_DOWN==0)
{
led2=1;
}
}
EXTI_ClearITPendingBit(EXTI_Line3);
}
/*******************************************************************************
* 函数名 : EXTI2_IRQHandler
* 函数功能 : 外部中断2函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2)==1)
{
delay_ms(10);
if(K_LEFT==0)
{
led3=1;
}
}
EXTI_ClearITPendingBit(EXTI_Line2);
}
/*******************************************************************************
* 函数名 : EXTI4_IRQHandler
* 函数功能 : 外部中断4函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void EXTI4_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line4)==1)
{
delay_ms(10);
if(K_RIGHT==0)
{
led3=0;
}
}
EXTI_ClearITPendingBit(EXTI_Line4);
}
上一篇:共用中断和共用中断函数的判断
下一篇:STM32—— DMA介绍
推荐阅读最新更新时间:2024-11-12 21:31
设计资源 培训 开发板 精华推荐
- Blip:带有传感器和调试器的 Nordic nRF52840 开发板(原理图、PCB、源码等)
- LTC2945HUD 在 -48V 系统中进行电源监控的典型应用,该系统使用外部线性稳压器为光耦合器和 SCL/SDA 电阻上拉供电
- AKD4381,用于 AK4381 24 位、192kHz D/A 转换器的评估板,适用于 DVD 应用
- 2021电赛F题国一作品
- 具有最大功率点跟踪功能的 LTC4162EUFD-FAD 太阳能供电 3 节 3.2A 充电器的典型应用
- 具有可编程控制功能的 LTC3623IUDD LED 驱动器的典型应用电路
- 基于英集芯IP6862 的一芯多充无线充方案
- 【物联网】鸿蒙WIFI开关+772984A
- SY89840U,用于 GB 以太网交换机的时钟缓冲器的评估板
- ADM00509,用于 MCP39F501 功率监视器的 PICtail 评估板
- 有奖活动|NI 助您设计更靠谱的数据采集系统
- 有奖直播:MPS新一代微功率隔离电源模块MIE系列产品介绍
- 报名赢【挂灯、浴巾】等好礼|TI MSPM0家用电器和电机控制应用详解
- 艾睿电子线上研讨会:英特尔FPGA深度学习加速技术 7月30日上午10:00-11:30 期待您的莅临!
- 了解 MPS 隔离解决方案,答题赢【华为蓝牙无线耳机、小米氮化镓充电器】!
- 趣味电子技术史话第二讲:开关电源的早期历史
- EEworld&TI 喊你来玩BLE+ZigBee+6lowpan!
- 成都站报名 | Keysight 高速互联技术研讨会
- 2020-2021年安森美和安富利物联网创新设计大赛
- 【已结束】 Qorvo、村田、NI直播【UWB最新技术、方案、市场、应用解析】(13:30开始入场)