关于#STM32#的问题,如何解决?

用STM32F103C8T6写一个SysTick定时125us中断,理论上72M配置成SysTick_Config(9000)就可以了,但是我的好像只有8M,配置SysTick_Config(9000)是定时1125us中断,只有配置成SysTick_Config(1000)才是125us,这是什么问题呢?

这是因为STM32F103C8T6的时钟频率只有8MHz,而SysTick_Config(9000)配置的时钟频率是72MHz,所以实际上定时的时间只有8/72=125us,所以需要将SysTick_Config(9000)改为SysTick_Config(1000)才能实现125us的定时中断。

  • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:STM32F103的Systick无法进入SysTick_Handler中断的问题解决
  • 除此之外, 这篇博客: 【STM32F103笔记】6、Systick——做个精确的延时中的 初始化SysTick——SysTick_Config库函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 同样,官方库中提供了用于SysTick配置初始化的函数:

    /**
     * @brief  Initialize and start the SysTick counter and its interrupt.
     *
     * @param   ticks   number of ticks between two interrupts
     * @return  1 = failed, 0 = successful
     *
     * Initialise the system tick timer and its interrupt and start the
     * system tick timer / counter in free running mode to generate 
     * periodical interrupts.
     */
    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 */
    }
    
    #endif
    
    • SysTick_Config函数用于配置SysTick进行固定的计数,并在每次计数完成后触发中断
    • 函数参数ticks就是计数值,将写入SysTick的LOAD寄存器;
    • 首先判断ticks的值是否超过LOAD寄存器的限制,然后将值写入LOAD寄存器;
    • 配置SysTick的中断优先级;
    • 将VAL寄存器(当前计数值寄存器)清0;
    • 然后设置CTRL寄存器:
      • 时钟源配置为AHB不分频,即72MHz;
      • 允许触发中断;
      • 使能SysTick。
    • 若设置成功函数将返回0。