STM32F103 中断

中断

        CPU 执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),来处理该事件,该事件处理完成后又返回被中断的程序继续执行。

STM32支持84个中断(16个内部,68个外部);16级可编程的中断优先级设置。

抢占优先级:高抢占式优先级的中断事件会打断当前的主程序/中断程序的运行。中断嵌套。

响应优先级:在抢占式优先级相同的情况下,高响应优先级的中断优先被响应。不能嵌套,只能等待低响应优先级中断执行完成才能得到响应。

规则:先抢占优先级,后响应优先级;抢占式优先级决定是否会有中断嵌套。

内部中断表

外部中断表



7个外部中断
EXTI0
EXTI1
EXTI2
EXTI3
EXTI4
EXTI9_5

EXTI15_10



函数
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)

功能: 根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
参数: EXTI_InitStruct:指向结构EXTI_InitTypeDef的指针,包含了外设EXTI的配置信息

EXTI_InitTypeDef定义于文件“stm32f10x_exti.h”: 
typedef struct { 
u32 EXTI_Line; 
EXTIMode_TypeDef EXTI_Mode; 
EXTIrigger_TypeDef EXTI_Trigger; 
FunctionalState EXTI_LineCmd;
} EXTI_InitTypeDef;

EXTI_Line 选择了待使能或者失能的外部线路
EXTI_Line0 外部中断线0 
EXTI_Line1 外部中断线1 
EXTI_Line2 外部中断线2 
EXTI_Line3 外部中断线3 
EXTI_Line4 外部中断线4 
EXTI_Line5 外部中断线5 
EXTI_Line6 外部中断线6 
EXTI_Line7 外部中断线7 
EXTI_Line8 外部中断线8 
EXTI_Line9 外部中断线9 
EXTI_Line10 外部中断线10 
EXTI_Line11 外部中断线11 
EXTI_Line12 外部中断线12 
EXTI_Line13 外部中断线13 
EXTI_Line14 外部中断线14 
EXTI_Line15 外部中断线15 
EXTI_Line16 外部中断线16 
EXTI_Line17 外部中断线17 
EXTI_Line18 外部中断线18

EXTI_Mode 设置了被使能线路的模式
EXTI_Mode_Event 设置EXTI线路为事件请求
EXTI_Mode_Interrupt 设置EXTI线路为中断请求

EXTI_Trigger 设置了被使能线路的触发边沿
EXTI_Trigger_Falling 设置输入线路下降沿为中断请求 
EXTI_Trigger_Rising 设置输入线路上升沿为中断请求 
EXTI_Trigger_Rising_Falling 设置输入线路上升沿和下降沿为中断请求

EXTI_LineCmd 用来定义选中线路的新状态

它可以被设为ENABLE或者DISABLE。

void EXTI_ClearITPendingBit(u32 EXTI_Line)
功能: 清除EXTI线路挂起位

参数: EXTI_Line:待清除EXTI线路的挂起位

void GPIO_EXTILineConfig(u8 GPIO_PortSource, u8 GPIO_PinSource)
功能: 选择GPIO管脚用作外部中断线路
参数: GPIO_PortSource: 选择用作外部中断线源的GPIO端口, GPIO_PortSource查阅更多该参数允许取值范围

GPIO_PinSource:待设置的外部中断线路, 参数可以取GPIO_PinSourcex(x可以是0-15)

GPIO_PortSource
GPIO_PortSourceGPIOA  选择GPIOA
GPIO_PortSourceGPIOB  选择GPIOB
GPIO_PortSourceGPIOC  选择GPIOC
GPIO_PortSourceGPIOD  选择GPIOD

GPIO_PortSourceGPIOE  选择GPIOE

配置优先级
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)

功能: 根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
参数: NVIC_InitStruct:指向结构NVIC_InitTypeDef的指针,包含了外设GPIO的配置信息

NVIC_InitTypeDef定义于文件“stm32f10x_nvic.h”:
typedef struct
{
u8 NVIC_IRQChannel;
u8 NVIC_IRQChannelPreemptionPriority;
u8 NVIC_IRQChannelSubPriority;
FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;

NVIC_IRQChannel 以使能或者失能指定的IRQ通道
WWDG_IRQChannel 窗口看门狗中断
PVD_IRQChannel PVD通过EXTI探测中断
TAMPER_IRQChannel 篡改中断
RTC_IRQChannel RTC全局中断
FlashItf_IRQChannel FLASH全局中断
RCC_IRQChannel RCC全局中断
EXTI0_IRQChannel 外部中断线0中断
EXTI1_IRQChannel 外部中断线1中断
EXTI2_IRQChannel 外部中断线2中断
EXTI3_IRQChannel 外部中断线3中断
EXTI4_IRQChannel 外部中断线4中断
DMAChannel1_IRQChannel DMA通道1中断
DMAChannel2_IRQChannel DMA通道2中断
DMAChannel3_IRQChannel DMA通道3中断
DMAChannel4_IRQChannel DMA通道4中断
DMAChannel5_IRQChannel DMA通道5中断
DMAChannel6_IRQChannel DMA通道6中断
DMAChannel7_IRQChannel DMA通道7中断
ADC_IRQChannel ADC全局中断
USB_HP_CANTX_IRQChannel USB高优先级或者CAN发送中断
USB_LP_CAN_RX0_IRQChannel USB低优先级或者CAN接收0中断
CAN_RX1_IRQChannel CAN接收1中断
CAN_SCE_IRQChannel CAN SCE中断
EXTI9_5_IRQChannel 外部中断线9-5中断
TIM1_BRK_IRQChannel TIM1暂停中断
TIM1_UP_IRQChannel TIM1刷新中断
TIM1_TRG_COM_IRQChannel TIM1触发和通讯中断
TIM1_CC_IRQChannel TIM1捕获比较中断
TIM2_IRQChannel TIM2全局中断
TIM3_IRQChannel TIM3全局中断
TIM4_IRQChannel TIM4全局中断
I2C1_EV_IRQChannel I2C1事件中断
I2C1_ER_IRQChannel I2C1错误中断
I2C2_EV_IRQChannel I2C2事件中断
I2C2_ER_IRQChannel I2C2错误中断
SPI1_IRQChannel SPI1全局中断
SPI2_IRQChannel SPI2全局中断
USART1_IRQChannel USART1全局中断
USART2_IRQChannel USART2全局中断
USART3_IRQChannel USART3全局中断
EXTI15_10_IRQChannel 外部中断线15-10中断
RTCAlarm_IRQChannel RTC闹钟通过EXTI线中断
USBWakeUp_IRQChannel USB通过EXTI线从悬挂唤醒中断

NVIC_IRQChannelPreemptionPriority 设置了成员NVIC_IRQChannel中的先占优先级
NVIC_IRQChannelSubPriority 设置了成员NVIC_IRQChannel中的从优先级


1. 选中NVIC_PriorityGroup_0,则参数NVIC_IRQChannelPreemptionPriority对中断通道的设置不产生影响。

2. 选中NVIC_PriorityGroup_4,则参数NVIC_IRQChannelSubPriority对中断通道的设置不产生影响。

NVIC_IRQChannelCmd   指定了在成员NVIC_IRQChannel中定义的IRQ通道被使能还是失能

 这个参数取值为ENABLE或者DISABLE。

ITStatus EXTI_GetITStatus(u32 EXTI_Line)
功能: 检查指定的EXTI线路触发请求发生与否
参数: EXTI_Line:待检查EXTI线路的挂起位

返回值: EXTI_Line的新状态(SET或者RESET)

void EXTI_ClearITPendingBit(u32 EXTI_Line)
功能: 清除EXTI线路挂起位
参数: EXTI_Line:待清除EXTI线路的挂起位

例程

/* 配置中断 */
void EXTI_Configuration(void)
{
	EXTI_InitTypeDef EXTI_InitStructure; 
	
	// 清除EXTI线路挂起位
	EXTI_ClearITPendingBit(EXTI_Line5);
	// 选择GPIO管脚用作外部中断线路
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5);
	
	EXTI_InitStructure.EXTI_Line = EXTI_Line5; 
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; 
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	
	// 初始化外设EXTI寄存器
	EXTI_Init(&EXTI_InitStructure);
}

/* 配置中断优先级 */
void NVIC_Configuration(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;	//设置通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//设置抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;	//响应优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值