中断
中断是中断,异常不一定是中断,中断包含在异常
优先级 具体看中断向量表
在startup_stm32fxxxx_md.s
(DCD:数据定义( Data Definition )伪指令一般用于为特定的数据分配存储单元)
中断函数在stm32f10x_it.c,可用startup_stm32fxxxx_md.s跳转过去
外部中断对应
NVIC 向量中断控制器
具体参考手册
Table 272. NVIC_IRQChannel 值
NVIC_IRQChannel 描述
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 中断
NVIC_Init()
根据 NVIC_InitStruct 中指定的参数初始化外设 NVIC 寄存器
NVIC_PriorityGroupConfig
设置优先级分组:先占优先级和从优先级
NVIC_PriorityGroup 描述
NVIC_PriorityGroup_0 先占优先级 0 位 从优先级 4 位
NVIC_PriorityGroup_1 先占优先级 1 位 从优先级 3 位
NVIC_PriorityGroup_2 先占优先级 2 位 从优先级 2 位
NVIC_PriorityGroup_3 先占优先级 3 位 从优先级 1 位
NVIC_PriorityGroup_4 先占优先级 4 位 从优先级 0 位
例:
/* Configure the Priority Grouping with 1 bit */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
例子:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitTypeDef NVIC_InitStruct1;
NVIC_InitStruct1.NVIC_IRQChannel = EXTI2_IRQn; //设置EXTI2中断
NVIC_InitStruct1.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
NVIC_InitStruct1.NVIC_IRQChannelSubPriority = 2; //响应优先级
NVIC_InitStruct1.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct1); //初始化
EXTI
EXTI_Init()
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
根据 EXTI_InitStruct 中指定的参数初始化外设 EXTI 寄存器
例子:
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line = EXTI_Line2; //设置外部中断线
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; //设置输入线路下降沿为中断请求
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
EXTI_GetITStatus()
检查指定的 EXTI 线路触发请求发生与否
返回值: EXTI_Line 的新状态(SET 或者 RESET)
EXTI_ClearITPendingBit() 清除 EXTI 线路挂起位
设置中断函数
void EXTI2_IRQHandler() {
if(EXTI_GetITStatus(EXTI_Line2) != RESET) { //判断 EXTI2 线路触发请求发生与否
GPIOF->ODR ^= GPIO_Pin_9 | GPIO_Pin_10;
EXTI_ClearITPendingBit(EXTI_Line2); //清除标志位
}
}
examp
void PE2_EXIT_ConfigurAction(void) {
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitTypeDef NVIC_InitStruct1;
NVIC_InitStruct1.NVIC_IRQChannel = EXTI2_IRQn; //设置EXTI2中断
NVIC_InitStruct1.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
NVIC_InitStruct1.NVIC_IRQChannelSubPriority = 2; //响应优先级
NVIC_InitStruct1.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct1); //初始化
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(GPIOE,&GPIO_InitStruct);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2); //设置外部中断线路
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line = EXTI_Line2;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
}