高级会员

- 积分
- 970
- 金钱
- 970
- 注册时间
- 2016-11-24
- 在线时间
- 156 小时
|
有时候想用SysTick的中断来做一些事情,但又不知道怎么去设置它的优先级,目前了解了一下,SysTick优先级的设置和其他优先级的设置方式是不一样的。默认情况下,SysTick的优先级是很低的,在systick的固件库初始化函数:SysTick_Config(uint32_t ticks) 中,调用了NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); ,这里面把 systick的 优先级配置为 :1<<4-1 = 15,这里面的4是因为STM32 使用4个位来配置中断优先级。我们看外设配置的中断优先级时的优先级分组,如果分组为 2,那抢占优先级和子优先级各有2个位表示优先级,抢占的取值范围为0~3,子优先级的取值范围为:0~3。那这时systick的优先级15,只需要把15转换成二进制:1111,这四位同样受优先级分组的控制,即前两位表示抢占优先级,那就是3,后两位表示子优先级,也是3。在分组2里面都是最低的。如果你的外设也配置成组2,主和子优先级配置的不是3,那就肯定比systick的优先级高。一般我们用原子哥的程序中,一开始是先做中断的优先级分组,然后对时钟初始化,就是delay_init(),那我们对SysTick的优先级设置也在里面,只需要SysTick->LOAD=reload;NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);即可,至于要设置SysTick的优先级大小,就把-1改成-x,然后算出大小就可以了。
|
|