用的是3.0 的库 Systick中断优先级控制 的函数是 static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) { if(IRQn < 0) { SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority IP[(uint32_t)(IRQn)] = ((priority SHP 这个设置的是系统中断的中断优先级 ;NVIC->IP这个设置的是外设就是普通的中断的中断优先级 如果这两个都设置的话 那个的优先级别高一点啊? |
RE:STM32的Systick中断优先级控制
IRQ决定先进哪个中断。但是这个2个是同时需要处理的。
RE:STM32的Systick中断优先级控制
RE:STM32的Systick中断优先级控制
RE:STM32的Systick中断优先级控制
就是把NMI 与HARDfault 设置为最高优先级 ,这样为什么就能把别的中断都屏蔽了呢? 优先高的运行完了 低优先级的中断不是还会响应的吗?
RE:STM32的Systick中断优先级控制
RE:STM32的Systick中断优先级控制
回复:STM32的Systick中断优先级控制
你回答错了
2、以systick为例,在systick的固件库初始化函数:SysTick_Config(uint32_t ticks) 中,调用了NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); ,这里面把 systick的 优先级配置为 :1<<4-1 = 15,这里面的4是因为STM32 使用4个位来配置中断优先级。
3、那么问题来了,这里systick的中断优先级配置成15,应该是最低的,那跟外设来比,那是systick的优先级比外设是高还是低? 这个得看 外设 配置 中断优先级时的优先级分组。
4、如果分组为 2,那抢占优先级和子优先级各有2个位表示优先级,抢占的取值范围为0~3,子优先级的取值范围为:0~3。那这时systick的优先级15,该怎么对比,只需要把15转换成二进制:1111,这四位同样受优先级分组的控制,即前两位表示抢占优先级,那就是3,后两位表示子优先级,也是3。在分组2里面都是最低的。如果你的外设也配置成组2,主和子优先级配置的不是3,那就肯定比systick的优先级高。
5、内核的优先级并非一定比外设的优先级高,只要你的优先级可以配置。
这个是当你软件优先级配置成一样的情况下,楼主的问题是内核的优先级跟外设的优先级谁高。
1、只要内核的优先级可以配置,那么内核的优先级就不是一定比外设的高,而是要先比较软件优先级,如果软件优先级一样,那么就比较他们的硬件的中断编号,编号就是在中断向量表中的位置,越小,优先级越高。
2、以systick为例,在systick的固件库初始化函数:SysTick_Config(uint32_t ticks) 中,调用了NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); ,这里面把 systick的 优先级配置为 :1<<4-1 = 15,这里面的4是因为STM32 使用4个位来配置中断优先级。
3、那么问题来了,这里systick的中断优先级配置成15,应该是最低的,那跟外设来比,那是systick的优先级比外设是高还是低? 这个得看 外设 配置 中断优先级时的优先级分组。
4、如果分组为 2,那抢占优先级和子优先级各有2个位表示优先级,抢占的取值范围为0~3,子优先级的取值范围为:0~3。那这时systick的优先级15,该怎么对比,只需要把15转换成二进制:1111,这四位同样受优先级分组的控制,即前两位表示抢占优先级,那就是3,后两位表示子优先级,也是3。在分组2里面都是最低的。如果你的外设也配置成组2,主和子优先级配置的不是3,那就肯定比systick的优先级高。
5、内核的优先级并非一定比外设的优先级高,只要你的优先级可以配置。