STM32 103RC systick系统定时器

  • SysTick寄存器——系统定时器有四个寄存器:
    CTRL SysTick 控制及状态寄存器
    LOAD SysTick 重装载数值寄存器
    VAL SysTick 当前数值寄存器
    CALIB SysTick 校准数值寄存器

  • SysTick控制及状态寄存器
    STM32 103RC systick系统定时器_第1张图片

  • SysTick定时器实验
    实现1s计时,使led一秒亮一秒灭。

  • 编程要点
    1、设置重装载寄存器的值
    2、清除当前数值寄存器的值
    3、配置控制与状态寄存器

用固件库编程的时候只需要调用库函数 SysTick_Config()即可,形参 ticks 用来设
置重装载寄存器的值,最大不能超过重装载寄存器的值 2
24,当重装载寄存器的值递减到 0的时候产生中断,然后重装载寄存器的值又重新装载往下递减计数,以此循环往复。紧随其后设置好中断优先级,最后配置系统定时器的时钟等于 AHBCLK=72M,使能定时器和定时器中断,这样系统定时器就配置好了,一个库函数搞定。
SysTick_Config()库函数主要配置了 SysTick 中的三个寄存器:LOAD、VAL 和 CTRL。

库函数SysTick_Config()源码

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
 //最大值,2^24                                                              
  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计数器值
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk   | 
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */

// 设置系统定时器的时钟源为 AHBCLK=72M
// 使能系统定时器中断
 // 使能定时器
  return (0);                                                  /* Function successful */
}

代码实现:

void delay_ms(uint32_t ms)
{
	uint32_t i;
	SysTick_Config(72000); //设置系统定时器的时钟源为 AHBCLK=72M,72000/72000000=1ms
	for(i=0;iCTRL)&(1<<16)));
	}
	SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk;
}

你可能感兴趣的:(STM32 103RC systick系统定时器)