您的位置 首页 产品

STM32外部中止操作

内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用CM3内核的全部东西,而是…

内核支撑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就确认下来了。

更为谨慎过程是设置完结最终敞开中止。剩余的作业便是编写中止服务函数了。

设置完这四个结构体,外部中止就能够用了。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部