您的位置 首页 传感器

STM32F104VG (一)中止与外部中止

一、基础知识1.ARM的中断优先级分硬件优先级和软件优先级两种其中软件优先级又由抢占优先级和响应优先级组成2.中断的优先级采用编号小优…

一、基础知识

1.ARM的中止优先级分硬件优先级和软件优先级两种

其间软件优先级又由抢占优先级和呼应优先级组成

2.中止的优先级选用编号小优先的准则。

3.一般状况:

1).假如设定了软件优先级,先看软件优先级:

具有高抢占式优先级的中止能够在具有低抢占式优先级的中止处理进程中被呼应,即中止嵌套,或者说高抢占式优先级的中止能够嵌套低抢占式优先级的中止。

当两个中止源的抢占式优先级相一起,这两个中止将没有嵌套联系,当一个中止到来后,假如正在处理另一个中止,这个后到来的中止就要比及前一个中止处理完之后才干被处理。假如这两个中止一起抵达,则中止控制器依据他们的呼应优先级凹凸来决议先处理哪一个。

2).后看硬件优先级

假如他们的抢占式优先级和呼应优先级都持平,则依据他们在中止表中的排位次序决议先处理哪一个。

4. 特殊状况

软件优先级设置对复位、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为低电平时分将点亮二极管。
PE12–>EXIT12
PE13–>EXIT13
PE14–>EXIT14
PE15–>EXIT15
在中止向量表中能够查到EXTIRCC_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(&NV%&&&&&%_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
}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/265529.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部