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);
}
上一篇: c#动态加载卸载DLL的方法