打印
[STM32F0]

关于STM32F0的 SysTick 的中断优先级的一些探讨

[复制链接]
3210|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xnmc|  楼主 | 2015-11-20 21:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
     之前一直在用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基础上的一些延时函数,比较简单,这里就不介绍了。


希望这里简单的说明,能够帮助一些像我一样的菜鸟~~~~~~~·
沙发
zchong| | 2015-11-20 22:38 | 只看该作者
F0不是很清楚,cortex-m3内核的st32芯片,中断优先级有个优先级分组,分为抢占优先级和子优先级,总共用4bit表示,几位表示抢占优先级几位表示子优先级是可以设置的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

150

帖子

0

粉丝