首页 > 代码库 > STM32F104VG (一)中断与外部中断
STM32F104VG (一)中断与外部中断
一、基础知识
1.ARM的中断优先级分硬件优先级和软件优先级两种
当中软件优先级又由抢占优先级和响应优先级组成
2.中断的优先级採用编号小优先的原则。
3.普通情况:
1).假设设定了软件优先级。先看软件优先级:
具有高抢占式优先级的中断能够在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。或者说高抢占式优先级的中断能够嵌套低抢占式优先级的中断。
当两个中断源的抢占式优先级同样时,这两个中断将没有嵌套关系,当一个中断到来后,假设正在处理还有一个中断,这个后到来的中断就要等到前一个中断处理完之后才干被处理。假设这两个中断同一时候到达,则中断控制器依据他们的响应优先级高低来决定先处理哪一个。
2).后看硬件优先级
假设他们的抢占式优先级和响应优先级都相等,则依据他们在中断表中的排位顺序决定先处理哪一个。
软件优先级设置对复位、NMI、硬件故障无效,他们的优先级始终比外部中断高
5.软件优先级的分组
中断优先级分组就是把优先级寄存器切割。分开哪几位是响应优先级。哪几位是抢占优先级。至于如何设置分组:每个ARM的M4中断优先级设计为可编程的8位,详细到stm32f4就仅仅留给用户4位共16级的可编程优先级,当中低4位已被占用。
也就是说stm32f4的优先级分组情况採用
NVIC_PriorityGroup_x, x=0~4表示。相应例如以下表格:[10:8] | 切割点 | 抢占优先级位 | 响应优先级位 | 抢占优先级数 | 响应优先级数 |
0b011(组4) | xxxx | [7:4] | none | 16(0~15) | 1(0~0) |
0b100(组3) | xxx.y | [7:5] | [4] | 8 | 2 |
0b101(组2) | xx.yy | [7:6] | [5:4] | 4(0~3) | 4(0~3) |
0b110(组1) | x.yyy | [7] | [6:4] | 2 | 8 |
0b111(组0) | yyyy | none | [7:4] | 1 | 16 |
二、详细实例
1.分析:
1).开关没有按下去时候。GPIO为高电平。开关按下去时候为低电平。
2).相应GPIO为低电平时候将点亮二极管。
STM32F407VG将外部GPIO接到 16 个外部中断/事件线上。
依据上图可知:本文的GPIO连接到例如以下中断线
PE12-->EXIT12
PE13-->EXIT13
PE14-->EXIT14
PE15-->EXIT15
在中断向量表中能够查到 EXTI 线 [15:10] 公用40号中断EXTI15_10。优先级是47
2.程序编制
2.1中断初始化部分
1)配置中断线源在哪个port
EXTI_InitTypeDef EXTI_InitStructure;
/* 使能SYSCFG时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource12);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource13);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource14);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource15);
2)配置并初始化中断线
/* 配置 EXTI LineXXX */
EXTI_InitStructure.EXTI_Line = EXTI_Line12 | EXTI_Line13 | EXTI_Line14 | EXTI_Line15;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
3)配置并初始化
NVIC_InitTypeDef NVIC_InitStructure;
/* 设置NVIC优先级分组为Group2:4个抢占式优先级,4响应式优先级 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
/* 中断优先级配置 最低优先级 这里一定要分开的设置中断。不可以合并到一个里面设置 */
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
2.2中断处理函数部分
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line12) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line12); /* 清除中断标志位 */
//do something
}
if(EXTI_GetITStatus(EXTI_Line13) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line13); /* 清除中断标志位 */
//do something
}
if(EXTI_GetITStatus(EXTI_Line14) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line14); /* 清除中断标志位 */
//do something
}
if(EXTI_GetITStatus(EXTI_Line15) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line15); /* 清除中断标志位 */
//do something
}
}
{
if(EXTI_GetITStatus(EXTI_Line12) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line12); /* 清除中断标志位 */
//do something
}
if(EXTI_GetITStatus(EXTI_Line13) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line13); /* 清除中断标志位 */
//do something
}
if(EXTI_GetITStatus(EXTI_Line14) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line14); /* 清除中断标志位 */
//do something
}
if(EXTI_GetITStatus(EXTI_Line15) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line15); /* 清除中断标志位 */
//do something
}
}
STM32F104VG (一)中断与外部中断
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。