sysTick系统嘀嗒定时器并非STM32独有的,它是Cortex内核的部分,CM3为它专门开出一个异常类型,并且在中断向量表中占有一席之地(异常号15)。这样它可以很方便的移植到不同厂商出CM3内核的芯片上,尤其对于有实时操作系统的软件,它一般会作为整个系统的时基,所以这个对操作系统非常重要
1 systick属于内核异常中断应该用SHPR设置其优先级;外设中断属于ISR应该按NVIC_IPRx来设置优先级。
2STM32用4个位(共16级优先级)来管理所有的中断优先级(内核中断systick也用此安排),中断向量表中用inline的方式规定死了SYSTICK的优先级为最低:15。但可以通过NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - x); //默认X=1
3那么如何理解systick在采用比如优先级2组时(抢占2位共4级(0~3);子2位共4级(0~3))呢?答:15即抢占=3;子优先级=3;也就是说始终都是15看你分组怎么分,它总是排在最后。
总结:这也就说明了在移植UCOS时如何看待外设中断与软件定时器及任务的优先级的问题:如果不修改默认systick的硬件优先级,则优先级顺序为:外设中断、软件定时器(各软件定时器暂时没有分优先级按照FIFO顺序)、任务级优先级。特殊说明:
1 如果外设中断的优先级也分成了15(无论你怎么分组:GROUP2(3:3)/GROUP3(7:1))则此时SYSTICK优先级高于同优先级的外设(毕竟内核异常优先级高于外设中断)
2如果想要精确定时也可使用以下函数将systick整成最高优先级)NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 15);
参考http://www.51hei.com/stm32/3561.html
参考2http://my.oschina.net/oceanstack/blog/371413