Cortex-M3 异常和中断---基于NXP LPC177x/8x(3)
- UID
- 1029342
- 性别
- 男
|
Cortex-M3 异常和中断---基于NXP LPC177x/8x(3)
1.3 更精确的优先级屏蔽 1: /** 2: * @brief Set the Base Priority value 3: * 4: * @param basePri BasePriority 5: * 6: * Set the base priority register 7: */ 8: static __INLINE void __set_BASEPRI(uint32_t basePri) 9: { 10: register uint32_t __regBasePri __ASM("basepri"); 11: __regBasePri = (basePri & 0xff); 12: }
比如想屏蔽优先级不高于0x60的中断,则使用代码:__set_BASEPRI(0x60);如果想取消中断屏蔽,则使用__set_BASEPRI(0)即可。
2.异常/中断和优先级 Cortex-M3的异常包括系统异常和外设中断,系统异常是Cortex-M3内核自带的一些异常,比如复位、总线Fault和SysTick等等(见表2-1),外设中断是指制造CPU的厂家加入的,比如串口、定时器中断等等(见表2-2)。
注:关于异常和中断,想要分个清清楚楚实在有点困难。异常和中断都可以“中断”正常执行的代码流,区别在于,异常是Cortex-M3内核产生的“中断”信号,而中断是Cortex-M3内核外部(片上外设或外部中断信号)产生的“中断”信号。希望你看懂了,有时候你心里明白,但要讲的清清楚楚着实难!
表2-1:系统异常
编号 | 类型 | 优先级 | 简介 | 0 | N/A | N/A | 无 | 1 | 复位 | -3(最高) | 复位 | 2 | NMI | -2 | 不可屏蔽中断(来自外部NMI输入脚) | 3 | 硬Fault | -1 | 只要FAULTMASK没有置位,硬Fault服务例程会被强制执行 | 4 | 存储器管理Fault | 可编程 | MPU访问违例以及访问非法位置均可引发。企图在“非执行区”取址也会引发此Fault。 | 5 | 总线Fault | 可编程 | 总线收到了错误响应,原因可以使预取流产或数据流产,企图访问协处理器也会引发此Fault | 6 | 用法Fault | 可编程 | 由于程序错误导致的异常。通常是使用了一条无效指令,或者是非法的状态转换,例如尝试切换到ARM状态 | 7~10 | 保留 | 保留 | 保留 | 11 | SVCall | 可编程 | 执行系统服务调用指令(SVC)引发的异常 | 12 | 调试监视器 | 可编程 | 调试器(断点、数据观察点,或者是外部调试请求) | 13 | 保留 | 保留 | 保留 | 14 | PendSV | 可编程 | 为系统设备而设的“可挂起请求” | 15 | SysTick | 可编程 | 系统节拍时钟定时器(SysTick) | 表2-2:外设中断
编号 | 类型 | 优先级 | 简介 | 16 | IRQ #0 | 可编程 | 外设中断#0 | 17 | IRQ #1 | 可编程 | 外设中断#1 | ... | ... | 可编程 | ... | 255 | IRQ #239 | 可编程 | 外设中断#239 | 注:表2-1和2-2中的“编号”有着特殊的意义,一是特殊功能寄存器IPSR中会记录当前正在服务的异常并给出了它的编号;二是优先级完全相同的多个异常同时挂起时,则先响应异常编号最小的那一个。
一个发生的异常如果不能被立即响应,就称它被“挂起”,值得一提的是,对于被挂起的中断/异常,中断/异常信号不必由其产生者保持,NVIC的挂起状态寄存器会来保持这个信号。所以哪怕后来挂起的中断源释放了中断请求信号,曾经的中断请求也不会丢失。
除了复位、NMI和硬Fault三个异常具有固定的优先级外,其它所有异常和中断的优先级都是可以编程的。这就涉及到优先级配置寄存器。Cortex-M3优先级配置寄存器共8位,所以可以有256级的可编程优先级。但是大多数Cortex-M3芯片都会精简设计。
LPC177x/8x使用了优先级配置寄存器的5位,所以有32级可编程优先级。复位后,对于所有优先级可编程的异常,其优先级都被初始化为0(最高优先级) |
|
|
|
|
|