之前一直在用SysTick的定时功能,有时为了一些功能想改变它的中断优先等级,可是找不到有什么函数可以改变。一位前辈在他的QQ群里,发过一篇F1的改变SysTick的中断的方法,看了之后也是一头雾水。这几天静下心来,仔细看各个手册关于SysTick的说明,今天测试了一下,终于可以解决了,再反过来想那位前辈的方法,才觉得是一样的。
在RM0360( STM32F030x4/6/8/C and STM32F070x6/B参考手册)里,有这样的说明
这里是说,SysTick的中断优先级是6,并且可以改变。通过追踪SysTick的设置函数 if (SysTick_Config(SystemCoreClock / 10000)) //10ms--------里面的SysTick_Config,我们找到在030标准库的里的core_cm0.h文件里有这样一段代码:
/* ################## SysTick function ################################## */
/** \ingroup CMSIS_Core_FunctionInterface
\defgroup CMSIS_Core_SysTickFunctions SysTick Functions
\brief Functions that configure the System.
@{
*/
#if (__Vendor_SysTickConfig == 0)
/** \brief System Tick Configuration
The function initializes the System Timer and its interrupt, and starts the System Tick Timer.
Counter is in free running mode to generate periodic interrupts.
\param [in] ticks Number of ticks between two interrupts.
\return 0 Function succeeded.
\return 1 Function failed.
\note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
must contain a vendor-specific implementation of this function.
*/
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = ticks - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
#endif
/*@} end of CMSIS_Core_SysTickFunctions */
***************************************************************************************
这里面关键是 NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */----------------这行代码
我们通过改变(1<<__NVIC_PRIO_BITS) - 1的值,就可以改变SysTick的中断优先级了。追踪__NVIC_PRIO_BITS,他的值是2,左移一位减1为6就是SysTick的中断优先级了。这也和参考手册的介绍一样。
我测试了一下,取值0~7都是准确可用的,可是超过7之后,就会有错误了。7的二进制为111,就是说最大3位,为什么呢?看030的中断优先级介绍可以达到15啊。目前还没有找到相关的说明。
至于关于SysTick基础上的一些延时函数,比较简单,这里就不介绍了。
希望这里简单的说明,能够帮助一些像我一样的菜鸟~~~~~~~· |