STM32的嵌套中断系统NVIC详细整理Word下载.docx
- 文档编号:21726878
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:18
- 大小:1.42MB
STM32的嵌套中断系统NVIC详细整理Word下载.docx
《STM32的嵌套中断系统NVIC详细整理Word下载.docx》由会员分享,可在线阅读,更多相关《STM32的嵌套中断系统NVIC详细整理Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
最高3位用于指定抢占式优先级,最低5位用于指定响应优先级
最高4位用于指定抢占式优先级,最低4位用于指定响应优先级
最高5位用于指定抢占式优先级,最低3位用于指定响应优先级
最高6位用于指定抢占式优先级,最低2位用于指定响应优先级
最高7位用于指定抢占式优先级,最低1位用于指定响应优先级
这就是优先级分组的概念。
6.stm32中对中断优先级的定义
Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
第0组:
所有4位用于指定响应优先级
第1组:
最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:
最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:
最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:
所有4位用于指定抢占式优先级
AIRC(ApplicationInterruptandResetRegister)寄存器中有用于指定优先级的4bits。
这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下:
/*PreemptionPriorityGroup*/
#defineNVIC_PriorityGroup_0
((u32)0x700)/*0bitsforpre-emptionpriority
4bitsforsubpriority*/
#defineNVIC_PriorityGroup_1
((u32)0x600)/*1bitsforpre-emptionpriority
3bitsforsubpriority*/
#defineNVIC_PriorityGroup_2
((u32)0x500)/*2bitsforpre-emptionpriority
2bitsforsubpriority*/
#defineNVIC_PriorityGroup_3
((u32)0x400)/*3bitsforpre-emptionpriority
1bitsforsubpriority*/
#defineNVIC_PriorityGroup_4
((u32)0x300)/*4bitsforpre-emptionpriority
0bitsforsubpriority*/
可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:
NVIC_PriorityGroup_0=>
选择第0组
NVIC_PriorityGroup_1=>
选择第1组
NVIC_PriorityGroup_2=>
选择第2组
NVIC_PriorityGroup_3=>
选择第3组
NVIC_PriorityGroup_4=>
选择第4组
接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:
//选择使用优先级分组第1组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//定义NVIC的结构体变量
NVIC_InitTypeDef NVIC_InitStructure;
//使能EXTI0中断
NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
//指定抢占式优先级别1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
//指定响应优先级别0
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&
NVIC_InitStructure);
//使能EXTI9_5中断
NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
//指定抢占式优先级别0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
//指定响应优先级别1
-------------------------------------------------------------------------------
要注意的几点是:
1.如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;
2.抢占式优先级别相同的中断源之间没有嵌套关系;
3.如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。
2、开关总中断
在STM32/Cortex-M3中是通过改变CPU的当前优先级来允许或禁止中断。
PRIMASK位:
只允许NMI和hardfault异常,其他中断/异常都被屏蔽(当前CPU优先级=0)。
FAULTMASK位:
只允许NMI,其他所有中断/异常都被屏蔽(当前CPU优先级=-1)。
在STM32固件库中(stm32f10x_nvic.c和stm32f10x_nvic.h)定义了四个函数操作PRIMASK位和FAULTMASK位,改变CPU的当前优先级,从而达到控制所有中断的目的。
下面两个函数等效于关闭总中断:
voidNVIC_SETPRIMASK(void);
voidNVIC_SETFAULTMASK(void);
下面两个函数等效于开放总中断:
voidNVIC_RESETPRIMASK(void);
voidNVIC_RESETFAULTMASK(void);
上面两组函数要成对使用,但不能交叉使用。
例如:
第一种方法:
NVIC_SETPRIMASK();
//关闭总中断,只允许NMI和hardfault异常
NVIC_RESETPRIMASK();
//开放总中断
第二种方法:
NVIC_SETFAULTMASK();
//关闭总中断,只允许NMI
NVIC_RESETFAULTMASK();
常常使用:
NVIC_SETPRIMASK();
//DisableInterrupts
NVIC_RESETPRIMASK();
//EnableInterrupts
可以用:
#defineCLI() __set_PRIMASK
(1) //关闭总中断
#defineSEI() __set_PRIMASK(0) //打开总中断
来实现开关总中断的功能。
二、寄存器介绍:
1、在core_cm3.h中定义了:
typedefstruct
{
__IOuint32_tISER[8];
/*Offset:
0x000(R/W)InterruptSetEnableRegister*/
//SETENA:
中断0-239的使能寄存器;
地址为:
0xE000-E100——0xE000-E11C;
复位值:
0
uint32_tRESERVED0[24];
//未定义的寄存器
__IOuint32_tICER[8];
0x080(R/W)InterruptClearEnableRegister*/
//CLRENA:
中断0-239的除能寄存器;
0xE000-E180——0xE000-E19C;
uint32_tRSERVED1[24];
//未定义的寄存器
__IOuint32_tISPR[8];
/*Offset:
0x100(R/W)InterruptSetPendingRegister*/
//SETPEND:
中断0-239的悬起寄存器;
0xE000-E200——0xE000-E21C;
uint32_tRESERVED2[24];
__IOuint32_tICPR[8];
0x180(R/W)InterruptClearPendingRegister*/
//CLRPEND:
中断0-239的解悬寄存器;
0xE000-E280——0xE000-E29C;
uint32_tRESERVED3[24];
__IOuint32_tIABR[8];
0x200(R/W)InterruptActivebitRegister*/
//ACTIVE:
中断0-239的活动状态寄存器;
0xE000-E300—0xE000-E31C复位值:
uint32_tRESERVED4[56];
__IOuint8_tIP[240];
/*Offset:
0x300(R/W)InterruptPriorityRegister(8Bitwide)*/
//中断优先级寄存器阵列(8位):
中断0-239的中断优先级;
//地址为:
0xE000-E400——0xE000-E4EF;
uint32_tRESERVED5[644];
__IOuint32_tSTIR;
/*Offset:
0xE00(R/W)SoftwareTriggerInterruptRegister*/
//STIR:
软件触发中断寄存器(如写入8则触发中断8的中断);
0xE000-EF00;
-
}NVIC_Type;
#defineSCS_BASE(0xE000E000)/*SystemControlSpaceBaseAddress*/
#defineNVIC_BASE(SCS_BASE+0x0100)/*NVICBaseAddress*/
#defineNVIC((NVIC_Type*)NVIC_BASE)/*NVICconfigurationstruct*/
__Iuint32_tCPUID;
0x000(R/)CPUIDBaseRegister*/
//CPUID:
--;
0xE000-ED00;
0x410fc230
__IOuint32_tICSR;
/*Offset:
0x004(R/W)InterruptControlandStateRegister*/
//ICSR:
中断控制及状态寄存器;
0xE000-ED04;
__IOuint32_tVTOR;
0x008(R/W)VectorTableOffsetRegister*/
//VTOR:
向量表偏移寄存器;
0xE000-ED08;
-
__IOuint32_tAIRCR;
0x00C(R/W)ApplicationInterruptandResetControlRegister*/
__IOuint32_tSCR;
0x010(R/W)SystemControlRegister*/
__IOuint32_tCCR;
0x014(R/W)ConfigurationControlRegister*/
__IOuint8_tSHP[12];
0x018(R/W)SystemHandlersPriorityRegisters(4-7,8-11,12-15)*/
__IOuint32_tSHCSR;
0x024(R/W)SystemHandlerControlandStateRegister*/
__IOuint32_tCFSR;
0x028(R/W)ConfigurableFaultStatusRegister*/
__IOuint32_tHFSR;
0x02C(R/W)HardFaultStatusRegister*/
__IOuint32_tDFSR;
0x030(R/W)DebugFaultStatusRegister*/
__IOuint32_tMMFAR;
0x034(R/W)MemManageFaultAddressRegister*/
__IOuint32_tBFAR;
0x038(R/W)BusFaultAddressRegister*/
__IOuint32_tAFSR;
0x03C(R/W)AuxiliaryFaultStatusRegister*/
__Iuint32_tPFR[2];
0x040(R/)ProcessorFeatureRegister*/
__Iuint32_tDFR;
0x048(R/)DebugFeatureRegister*/
__Iuint32_tADR;
0x04C(R/)AuxiliaryFeatureRegister*/
__Iuint32_tMMFR[4];
0x050(R/)MemoryModelFeatureRegister*/
__Iuint32_tISAR[5];
0x060(R/)InstructionSetAttributesRegister*/
uint32_tRESERVED0[5];
__IOuint32_tCPACR;
0x088(R/W)CoprocessorAccessControlRegister*/
}SCB_Type;
#defineSCS_BASE(0xE000E000)/*SystemControlSpaceBaseAddress*/
#defineSCB_BASE(SCS_BASE+0x0D00)/*SystemControlBlockBaseAddress*/
#defineSCB((SCB_Type*)SCB_BASE)/*SCBconfigurationstruct*/
三、初始化设置
STM32中的NVIC设置的流程如下:
选择NVIC的中断分组:
//选择中断分组1
注意:
优先级分组只能设置一次。
定义NVIC的结构体变量:
选择要进行NVIC设置的模块:
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
//选择串口1中断
进行抢占式中断优先级的设置:
//抢占式中断优先级设置为0
进行响应式中断优先级的设置:
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
//响应式中断优先级设置为3
使能中断:
//使能中断
根据上述设置进行初始化:
注:
NVIC_InitTypeDef的定义在misc.h中;
NVIC的相关函数在misc.c中。
NVIC_IRQChannel的取值列表:
typedefenumIRQn
/******
Cortex-M3ProcessorExceptionsNumbers***************************************************/
NonMaskableInt_IRQn
=-14,
/*!
<
2NonMaskableInterrupt
*/
MemoryManagement_IRQn
=-12,
4Cortex-M3MemoryManagementInterrupt
BusFault_IRQn
=-11,
5Cortex-M3BusFaultInterrupt
UsageFault_IRQn
=-10,
6Cortex-M3UsageFaultInterrupt
SVCall_IRQn
=-5,
11Cortex-M3SVCallInterrupt
DebugMonitor_IRQn
=-4,
12Cortex-M3DebugMonitorInterrupt
PendSV_IRQn
=-2,
14Cortex-M3PendSVInterrupt
SysTick_IRQn
=-1,
15Cortex-M3SystemTickInterrupt
STM32specificInterruptNumbers*********************************************************/
WWDG_IRQn
=0,
WindowWatchDogInterrupt
PVD_IRQn
=1,
PVDthroughEXTILinedetectionInterrupt
TAMPER_IRQn
=2,
TamperInterrupt
RTC_IRQn
=3,
RTCglobalInterrupt
FLASH_IRQn
=4,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32 嵌套 中断 系统 NVIC 详细 整理