前语:
1.要想学习STM32中止,要先把握STM32对优先级的界说;
2.有51单片机开发经历会比较简单了解中止优先级;
3.本篇博文根据STM32F103ZET6芯片和3.5.0规范库编写;
4.本篇博文从寄存器下手,终究完成编程的过程;
一 根底知识
1. cortex-m3支撑256个中止,其间包含了16个内核中止,240个外部中止。(本博文只介绍60个外部可屏蔽中止)
2. STM32只要84个中止,包含16个内核中止和68个可屏蔽中止
3. stm32f103上只要60个可屏蔽中止,f107上才有68个中止
4.先占优先级也便是抢占优先级,概念等同于51单片机中的中止。假设有两中止先后触发,已经在履行的中止先占优先级假如没有后触发的中止 先占优先级更高,就会先处理先占优先级高的中止。也便是说又有较高的先占优先级的中止能够打断先占优先级较低的中止。这是完成中止嵌套的根底。
次占优先级,也便是呼应优先级,只在同一先占优先级的中止一起触发时起作用,先占优先级相同,则优先履行次占优先级较高的中止。次占优先级不会形成中止嵌套。 假如中止的两个优先级都共同,则优先履行坐落中止向量表中方位较高的中止。
NVIC是什么?
嵌套向量中止控制器;用于为中止分组,然后分配抢占优先级和呼应优先级;
分组的办法有两种:
(1)Cortex-m3内核供给了一种3位宽度的PRIGROUP数据区,用于指示一个8位数据序列中的小数点的方位,然后表明中止优先级的分组。见下表:
(2)而实际上STM32并没有用到这么多中止,所以在分组上只分了5个组,而且表明办法有所不同;见下表:
咱们在使用傍边只会用到STM32的分组(5组)办法,所以下面着重于5组分组办法;
二 中止向量表 (STM32F10x系列)
(图片来自STM32使用手册,只需看,不需要熟记,知道大约这么多中止就好)
三 装备中止相关寄存器
/*cortex-m3内核分组办法(8组)结构体表达办法:*/typedefstruct{__IOuint32_TISER[8];中止使能设置寄存器/*!《偏移量:0x000InterruptSetEnableRegister*/uint32_tRESERVED0[24];__IOuint32_TICER[8];中止铲除使能寄存器/*!《偏移量:0x080InterruptClearEnableRegister*/uint32_tRSERVED1[24];__IOuint32_TISPR[8];中止挂起设置寄存器/*!《偏移量:0x100InterruptSetPendingRegister*/uint32_tRESERVED2[24];__IOuint32_TICPR[8];中止铲除挂起寄存器/*!《偏移量:0x180InterruptClearPendingRegister*/uint32_tRESERVED3[24];__IOuint32_tIABR[8];中止激活状态位寄存器/*!《偏移量:0x200InterruptActivebitRegister*/uint32_tRESERVED4[56];__IOuint8_tIP[240];中止优先级寄存器/*!《偏移量:0x300InterruptPriorityRegister(8Bitwide)*/uint32_tRESERVED5[644];软件触发办法寄存器__Ouint32_tSTIR;/*!《偏移量:0xE00SoftwareTriggerInterruptRegister*/}NVIC_Type;12345678910111213141516171819
/*STM32分组(5组)办法结构体表达办法typedefstruct{vu32ISER[2];u32RESERVED0[30];vu32ICER[2];u32RSERVED1[30];vu32ISPR[2];u32RESERVED2[30];vu32ICPR[2];u32RESERVED3[30];vu32IABR[2];u32RESERVED4[62];vu32IPR[15];}NVIC_TypeDef;*/1234567891011121314151617
以上寄存器介绍:
对一些概念的解说:
1. 挂起:当置位中止挂起寄存器的时分,相应的中止将会被挂起,这是这个中止将不会当即履行,而是等候可履行的时分再履行;比方凹凸等级的中止一起发生,就先挂起低等级的中止,等高等级的中止履行结束,免除并履行初级中止;
2. 对中止优先级控制寄存器的解说
四 编程过程
(1)挑选优先级分组
/*
1. 此函数在库文件misc.h文件下;
2. 参数可参照下面图片:
3. 功用:挑选分组办法;
*/
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
栗子:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//抢占优先级可选0~3,呼应优先级可选0~3;
(2)挑选,装备,并使能中止
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //挑选EXTI2中止
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //呼应优先级为2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能EXTI2中止;
NVIC_Init(&NVIC_InitStructure); //初始化以上参数;
(3)写出相应中止函数
栗子:
void EXTI2_IRQHandler(void)
{
//逻辑代码;
EXTI_ClearITPendingBit(EXTI_Line2);
}