内核支撑256个中止,其间包含了16个内核中止和240个外部中止,并且具有256级的可编程中止设置。但STM32并没有运用CM3内核的悉数东西,而是只用了它的一部分。STM32有76个中止,包含16个内核中止和60个可屏蔽中止,具有16级可编程的中止优先级。
NVIC
NVICNestedVectoredInterruptController嵌套向量中止操控。在STM32的规范外设库和MDK界说的中止相关的变量和结构体类型,大多都是以NVIC最初的,例如NVIC_InitTypeDef。
NVIC_Type
NVIC存放器结构体。在MDK380a中,这个结构体是界说在stm32f10x_map.h中,详细的界说如下
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;
ISERInterruptSet-EnableRegister中止使能存放器组,两个字,共63位,用了60位,一个位对应一个中止,写1中止有用,写0无意义。
ICERInterruptClear-EnableRegister中止除能存放器组,也是两个字,和上面的使能存放器组功用刚好相反,写1中止失效,写0无意义。
ISPRInterruptSet-PendingRegister中止挂起操控存放器组。用了60个位,对应60个中止。写1有用,能够将正在运转的中止挂起,然后履行同等级或许更高等级的中止。写0无意义。
ICPRInterruptClear-PendingRegister中止解挂存放器组。和上面的挂起存放组功用刚好相反。写1有用,写0无意义。
IABRInterruptActiveBitRegister中止激活标志位存放器组。这是一个只读存放器,经过读这个存放器,能够知道那个中止正在被履行,对应的位会被置1。中止履行完后对应位清零。
IPRInterruptPriorityRegister中止优先级存放器15个字,共60个字节,每个字节对应一个中止,每个字节只用到了高四位,剩余四位保存。这有用4位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要依据SCB->AIRCR中中止分组的设置来决议。
SCB->AIRCR
STM32的中止分组:STM32将中止分为5个组,组0~4。该分组的设置是由SCB->AIRCR存放器的bit10~8来界说的。详细的分配联系如下表所示:组 |
AIRCR[10:8] |
bit[7:4]分配情况 |
分配成果 |
0 |
111 |
0:4 |
0位抢占优先级,4位呼应优先级 |
1 |
110 |
1:3 |
1位抢占优先级,3位呼应优先级 |
2 |
101 |
2:2 |
2位抢占优先级,2位呼应优先级 |
3 |
100 |
3:1 |
3位抢占优先级,1位呼应优先级 |
4 |
011 |
4:0 |
4位抢占优先级,0位呼应优先级 |
经过这个表,咱们就能够清楚的看到组0~4对应的装备联系,例如组设置为3,那么此刻一切的60个中止,每个中止的中止优先存放器的高四位中的最高3位是抢占优先级,低1位是呼应优先级。每个中止,你能够设置抢占优先级为0~7,呼应优先级为1或0。抢占优先级的等级高于呼应优先级。而数值越小所代表的优先级就越高。
这儿需求留意2点:
1,假如两个中止的抢占优先级和呼应优先级都是相同的话,则看哪个中止先发生就先履行。
2,高优先级的抢占优先级是能够打断正在进行的低抢占优先级中止的。而抢占优先级相同的中止,高优先级的呼应优先级不能够打断低呼应优先级的中止。
而在老版别的STM32规范外设库中也是有这样一个stm32f10x_map.h文件的。界说和上面的差不多,不同当地或许便是长度不同。
我现在手里拿的是最新的STM32规范外设库(3.5版),里边现已没有了stm32f10x_map.h这个文件了,要知道stm32f10x_map.h这个文件中界说了一切外设存放器的结构和内存映射,像各个存放器的结构体,基址,地址等等。
在新版的STM32的规范外设库中,将这些文件分隔界说了,去掉了stm32f10x_map.h这个头文件后,新加入了stm32f10x.h和core_cm3.h两个头文件。
在core_cm3.h中,界说了:
1.NVIC_Type,
2.SCB_Type,
3.ITM_Type,
4.InterruptType_Type,
5.MPU_Type,
6.CoreDebug_Type。
在stm32f10x.h,界说了
7.ADC_TypeDef,
8.BKP_TypeDef,
9.CAN_TxMailBox_TypeDef,
10.CAN_FIFOMailBox_TypeDef,
11.CAN_FilterRegister_TypeDef,
12.CAN_TypeDef,
13.CEC_TypeDef,
14.CRC_TypeDef,
15.DAC_TypeDef,
16.DBGMCU_TypeDef,
17.DMA_Channel_TypeDef,
18.DMA_TypeDef,
19.ETH_TypeDef,
20.EXTI_TypeDef,
21.FLASH_TypeDef,
22.OB_TypeDef,
23.FSMC_Bank1_TypeDef,
24.FSMC_Bank1E_TypeDef,
25.FSMC_Bank2_TypeDef,
26.FSMC_Bank3_TypeDef,
27.FSMC_Bank4_TypeDef,
28.GPIO_TypeDef,
29.AFIO_TypeDef,
30.I2C_TypeDef,
31.IWDG_TypeDef,
32.PWR_TypeDef,
33.RCC_TypeDef,
34.RTC_TypeDef,
35.SDIO_TypeDef,
36.SPI_TypeDef,
37.TIM_TypeDef,
38.USART_TypeDef,
39.WWDG_TypeDef
而在stm32f10x_map.h中界说了34个类型,和stm32f10x.h根本类似。
EXTI_TypeDef
外部中止的设置,还需求装备相关存放器才能够。下面就介绍外部中止的装备和运用。
STM32的EXTI操控器支撑19个外部中止/事情恳求。每个中止设有状况位,每个中止/事情都有独立的触发和屏蔽设置。STM32的19个外部中止为:
线0~15:对应外部IO口的输入中止。
线16:连接到PVD输出。
线17:连接到RTC闹钟事情。
线18:连接到USB唤醒事情。
关于外部中止EXTI操控MDK界说了如下结构体:
typedefstruct
{
vu32IMR;
vu32EMR;
vu32RTSR;
vu32FTSR;
vu32SWIER;
vu32PR;
}EXTI_TypeDef;
在新的规范外设库中,这个结构体的界说坐落10x.h中。
IMR:中止屏蔽存放器。这是一个32存放器。可是只要前19位有用。当位x设置为1时,则敞开这个线上的中止,不然封闭该线上的中止。
EMR:事情屏蔽存放器,同IMR,仅仅该存放器是针对事情的屏蔽和敞开。
RTSR:上升沿触发挑选存放器。该存放器同IMR,也是一个32为的存放器,只要前19位有用。位x对应线x上的上升沿触发,假如设置为1,则是答应上升沿触发中止/事情。不然,不答应。
FTSR:下降沿触发挑选存放器。同PTSR,不过这个存放器是设置下降沿的。下降沿和上升沿能够被一起设置,这样就变成了恣意电平触发了。
SWIER:软件中止事情存放器。经过向该存放器的位x写入1,在未设置IMR和EMR的时分,将设置PR中相应位挂起。假如设置了IMR和EMR时将发生一次中止。被设置的SWIER位,将会在PR中的对应位铲除后铲除。
PR:挂起存放器。当外部中止线上发生了挑选的边缘事情,该存放器的对应位会被置为1。0,表明对应线上没有发生触发恳求。经过向该存放器的对应位写入1能够铲除该位。在中止服务函数里边常常会要向该存放器的对应位写1来铲除中止恳求。
IO复用里的外部中止装备存放器EXTICR
EXTICR在AFIO的结构体中界说,如下:
typedefstruct
{
vu32EVCR;
vu32MAPR;
vu32EXTICR[4];
}AFIO_TypeDef;
在新的规范外设库中,这个结构体的界说坐落10x.h中。
这个结构体存在的原因是STM32的每个IO都能够装备成中止输进口。可是线0~15:对应外部IO口的输入中止。只要16个。资源就缺乏了。为了确认是那一组IO的哪个口装备成中止,用到了EXTICR[4]。这虽然是一个32位的数组,可是只用到了16位,四位分红1组,这样就有了16组,从低到高,对应16个IO口,每组的四位数从0-6组成7种状况,对应A—G。
例如,我要设置PA3口为外部中止输入,EXTICR就要这样设置:首要PA3对应的是EXTICR[0],它管口0-3,口3对应的是EXTICR[0]的15-12位;要设置成PA,对应的便是xxxxxxxx(高16保存)00xxxxxx(xx表明4bit).
详细过程是:
1.中止分组,确认体系要运用什么样的中止体系,为后边的整个设置定下基调。落实到存放器就设置SCB-AIRCR.
2.设置中止优先级。分完组定下基调便是该设置优先级了。落实到存放器等级便是设置vu32IPR[15]这个数组了。上面提到了,8bit表明一个中止设置,可是只用到了4个bit,并且从低到高是对应中止的从低到高。此刻你要敞开的中止Channel也根本就确认了。设置完结后就确认这个中止的抢占优先级和呼应优先级。
3.敞开对应的中止。落实到存放器便是ISER[2]。60bit从低到高顺次排开。至此,嵌套向量中止操控根本设置完结。可是中止仍是不能用。由于还没有设置外部中止。
4.设置外部中止。STM32支撑19个外部中止。外部中止占有整个中止体系的低19个位。落实到存放器便是设置EXTI_TypeDef结构体中的IMR(担任敞开事情中止),EMR(担任屏蔽时刻中止)RTSR和FTSR(担任中止方法)。这样设置完后外部中止仍是不能用。由于还没有映射到详细IO口。
5.映射到详细IO口。STM32的规划是每一个IO口都能够充任中止引脚,这一点和51内核的单片机有很大的差异。16个外部中止对应每个端口的16个IO,可是端口或许是A-G,怎么确认映射到哪个IO就成了问题。CM3的解决方法是AFIO_TypeDef结构体中的EXTICR[4]数组来确认。详细思路便是用这个数组4个元素的低16位,每四位对应一个IO,从低到高一一对应,四位一起变换出7种状况对应端口的A-G。这样IO就确认下来了。
更为谨慎过程是设置完结最终敞开中止。剩余的作业便是编写中止服务函数了。
设置完这四个结构体,外部中止就能够用了。