一个关于stm32的systick配置出错的小问题

中文网络上的《STM32 固件库使用手册》都是较旧版本的,关于systick的配置有好几条函数。而开发板的固件库当然是比使用手册要新的。

现在的systick配置就两条函数:

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)

然而,可能是由于我买的原子哥的开发板固件库有些bug的缘故,两条函数的使用顺序要注意:

SysTick_Config(reload);//在前

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//在后

我们看这两个函数的实现就知道为什么了:

#define SysTick_CTRL_CLKSOURCE_Msk         (1ul << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */

#define SysTick_CTRL_TICKINT_Msk           (1ul << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */

#define SysTick_CTRL_ENABLE_Msk            (1ul << SysTick_CTRL_ENABLE_Pos)               /*!< SysTick CTRL: ENABLE Mask */
static

 __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */

  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  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 */
}


/***********************************************/


#define SysTick_CLKSource_HCLK_Div8    ((uint32_t)0xFFFFFFFB)
#define SysTick_CLKSource_HCLK         ((uint32_t)0x00000004)

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
  /* Check the parameters */
  assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
  if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
  {
    SysTick->CTRL |= SysTick_CLKSource_HCLK;
  }
  else
  {
    SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
  }
}

我们可以看出,设置systick是否8分频,就是设置SysTick->CTRL的第3位(由低到高0123)。而调用SysTick_Config()函数就会很抱歉地把SysTick->CTRL,重置了。

由于以上涉及的都是关于寄存器的某些位的操作,所以我大胆推测,SysTick_Config()函数里的

  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk   | 
                   SysTick_CTRL_ENABLE_Msk; 

原本是打算写成

  SysTick->CTRL | = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk   | 
                   SysTick_CTRL_ENABLE_Msk; 

你可能感兴趣的:(一个关于stm32的systick配置出错的小问题)