中断
大概了解就行
中断是微控制器一个常见的特性 产生中断之后 CPU 就会中断当前的事情去处理中断事件。
内核提供了嵌套的向量控制器。
去看相关的资料
去启动文件 staup_stm32f10x.hd.s 看
有 0-15个异常清单 (内部的) -3 -2 -1 看起来就是最高级的 因为都是固定的
数字越低 优先级越高
16-255 :外部中断清单
外部中断的相关结构体参数
中断属于内核的东西就去相关h文件看 他的结构体定义
虽说有这么多 但是我们就不可能用的完
IP[0]- IP[239] 的每个数组 就对应了一个中断
我们再来看中断表的一个东西
WEAK 有何用处呢 @重定向
WEAK:启动文件定义了的 只不过 里面的内容是没有的 如果重定向 就不会调用里面的函数
比如 printf
优先级 分组
访问地址
base 就是基地址
优先级分组
为了使抢占变得根据稳定,CM3把优先级 分成了高低两段
HSB是左边的 LSB是右边的 左边是父优先级 右边是子优先级
[7:1] 意思是 1到7都是 父优先级(左边)
[0:0] 意思是 0 是子优先级(右边)
下面的也是如此思路
优先级的设置寄存器 AIRCR
0X0C是偏移量 基地址是 0XE00EE000 偏移+基地址= AIRCR 地址
0XE000E000+0X0C
优先级用法
四位的情况
我们不能直接拿到 1111 这串数字就直接算了 必须要位移 四位
因为 1111 开始就是 00001111 所以要位移四位 1111<<4
结合结构体和优先级分组表来看
一共有5组就对应了 优先级分组的3-7
1 因为用四位来表示优先级
怎么对应呢
1
#define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
4 bits for subpriority */
0bit :没有一位是父优先级 4bit:全部都是子优先级
1 对应的优先级组是
后面的依次减少就 可以得到答案了
中断优先级设定
简单说是
0-4 的优先级 不归FreeRTOS管理 5-15 才是FreeRTOS的管理范围
相关的 宏定义
数字越小 优先级越大 0-4 不归FreeRTOS管理
所以 5 是FreeRTOS最大的优先级 15最小
中断屏蔽器
简单介绍
用于中断屏蔽的特殊寄存器
PRIMASK, FAULTMASK 和 BASEPRI这三个寄存器,可以参考上面链接,大致了解这三个中断屏蔽寄存器。
BASEPRI寄存器可以只屏蔽低于某一阈值的优先级中断,FreeRTOS的开关中断就是通过BASEPRI这个寄存器实现。
想屏蔽某一阈值之下的优先级,直接将优先级写进寄存器即可,写入0就停止屏蔽中断