目录
中断是微控制器一个很常见的特性,中断由硬件产生,当中断产生之后CPU就会中断当前的流程而去处理中断服务,Cortex-M 内核的MCU提供了一个用于中断管理的嵌套向量中断控制器NVIC。
Cotex-M3和M4的NVIC最多支持240个IRQ(中断请求),1个不可屏蔽中断(NM)),1个Systick(滴答定时器)定时器中断和多个系统异常。
与中断相关的寄存器都在NVIC和SCB中。

__Vectors向量中断表



WEAK函数就是已经定义了的,我过我们重写,他就不会调用这里面的函数了,就会调用我们自己写的函数(32里的printf重定向说到)
NVIC的地址就是0xE000E000加上偏移地址0x0100,

这些寄存器都是跟中断相关
- 在 CM3 中,优先级对于异常来说很关键的,它会影响一个异常是否能被响应,以及何
- 时可以响应。优先级的数值越小,则优先级越高。CM3 支持中断嵌套,使得高优先级异常
- 会抢占(preempt)低优先级异常。有 3 个系统异常:复位,NMI 以及硬 fault,它们有固定的
- 优先级,并且它们的优先级号是负数,从而高于所有其它异常。所有其它异常的优先级则都
- 是可编程的(但不能编程为负数)。
- 原则上,CM3 支持 3 个固定的高优先级和多达 256 级的可编程优先级,并且支持 128
- 级抢占
优先级寄存器是由 __IO uint8_t IP[240]; 决定的,最多有240个外部中断
正常我们用4位用来表达优先级4567,它这里举例用3个

- 为了使抢占机能变得更加可控,CM3还把256级优先级按位分
- 成高低两段,分别是抢占优先级和亚优先级,MSB所在的位段(左边
- 的)对应抢占优先级,而LSB所在的位段(右边的)对应亚优先级。
- 分组位置 表达抢占优先级的位段表达亚优先级的位段
优先级分组通过寄存器AIRCR设置(地址为OXEOOOEDOC)
7:1意思是说第7位到第1位都表示抢占优先级,第0位表示亚优先级,下面以此类推,所以我们最多用128来表示抢占优先级

如果我们要使用4位的话,低四位不用,我们要左移4位才是我们最终的优先级

对应上表76543,这5中情况
寄存器AIRCR地址就是这么来的


优先级分组实际上是调用 SCB->AIRCR 控制优先级分组,通过寄存器来进行设定
- 对于外设中断优先级的设置可以通过奇存器:
- OXE000 E400 ~ OXEOOOE4EF
- 系统异常中断通过寄存器
- OXE000 ED18 ~ OXE000ED23
- 中断屏蔽寄存器有3个:
- 1.PRIMASK
- 2.PAULTMASK
- 3.BASEPRI
- 用于中断屏蔽的特殊寄存器
- PRIMASK, FAULTMASK 和 BASEPRI这三个寄存器,可以参考上面链接,大致了解这三个中断屏蔽寄存器。
- BASEPRI寄存器可以只屏蔽低于某一阈值的优先级中断,FreeRTOS的开关中断就是通过BASEPRI这个寄存器实现。
- 想屏蔽某一阈值之下的优先级,直接将优先级写进寄存器即可,写入0就停止屏蔽中断
freeRTOS使用第三个
关闭中断和开启中断,

关闭
用的出最高优先级去关闭
使能中断,vPortSetBASEPRI( 0 )有一个形参0,把0传进去,把0写进basepri里

这两个寄存器不是freertos用


我们用四位配置中断优先级,所以中断优先级配置都要8 - configPRIO_BITS左移四位
在FreeRTOS 中 0-4 的优先级 不受它的管理 5-15 才是它的管理范围

configLIBRARY_LOWEST_INTERRUPT_PRIORITY
此宏是用来设置最低优先级,前面说了,STM32优先级使用了4位,而且STM32配置的使用组4,也就是4位都是抢占优先级。因此优先级数就是16个,最低优先级那就是15。所以此宏就是15
configLIBRARY_MAX_sYSCALL_INTERRUPT_PRIORITY
此宏用来设置FreeRTOS系统可管理的最大优先级,讲解BASEPRI寄存器说的那个阈值优先级,这个大家可以自由设置,这里我设置为了5。也就是高于5的优先级(优先级数小于5)不归FrecRTOS管理!

在mian函数的开始和结束是有临界段的,临界段里面其实就是调用了中断屏蔽的语句,临界段打开,临界段关闭,main函数里面的程序才能运行
