STM32学习笔记(六)SysTick

SysTick 是一个 24bit 的系统计时器,计数器从 LOAD寄存器 中读取数值(该数值最大为24bit),不断递减,递减为 0 时相应标志位置 1,产生一个中断请求;
该寄存器通常用来产生精确的 延时(Delay)函数;

SysTick寄存器

SysTick寄存器映射——STM32F10xxx Cortex-M3编程手册
  • 端口配置低寄存器 --- CTRL(Control and status register):使能SysTick和相应中断请求,并配置时钟来源;

    • 作用---使能计数器(counter):位0 置 1 时计数器使能,置 0 时计数器关闭;

    • 作用---使能中断请求:位1 置 1 时中断请求使能,置 0 时中断请求关闭(SysTick中断为中断向量表 系统中断第16项);


      SysTick中断
    • 作用---选择时钟源:位2 置 1 时选择 AHB 时钟作为源,置 0 时选择 AHB / 8 作为时钟源;(默认情况下AHBCLK = 72M)

    • 位16 为标志位 COUNTFLAG,为 1 时表明计数器的值为 0;

    • 复位值:0x0000 0000

  • 读取值寄存器 --- LOAD(reload value register):位23:0 储存计数器要读取的值;

    • 复位值:0x0000 0000
  • 当前值寄存器 --- VAL(current value register):位23:0 储存计数器当前的值;

    • 复位值:0x0000 0000
  • 校准值寄存器 --- CALIB(calibration value register):位23:0 储存计数器校准值和相应标志位的寄存器;

    • 复位值:0x0002328

常用SysTick固件库函数 (core_cm3.h)

SysTick配置函数 --- SysTick_Config

static __INLINE uint32_t SysTick_Config(uint32_t ticks);
  • 作用:使能 SysTick,使能中断请求并把该中断优先级设置为最低(0x1111),把时钟源设置为 AHBCLK,同时设置 reload = ticks;
  • 注意:SysTick中断优先级寄存器与外设中断优先级寄存器不同,但仍可按优先级规则判断优先级;
  • ticks:LOAD寄存器中的值,为reload值,必须是24位以内的树;
  • 返回值:0则表示配置成功,1则表示配置失败;
  • 示例:
SysTick_Config(72000);          //默认系统为72M
//一般可不需读取返回值,只要ticks值在24位以内即可配置成功

编写Delay函数

编写一个 毫秒(ms) 级Delay函数

计算

设 SysTick 时钟源的频率为 CLK (MHz),LOAD寄存器中存储的值为 reload;
可得计数器在 1毫秒(ms) 内震荡 CLK×1000 次(即递减 CLK×1000 次),我们要让计数器中的值在 1毫秒(ms) 从 reload 递减至 0,将 reload 的值设置为 CLK×1000 即可

若采用默认情况下 选取 AHBCLK = 72MHz,则将 LOAD 寄存器设置为 72000 即可。

程序思路

  • SysTick_Config函数 使能SysTick并配置 reload值;
  • 不断读取 COUNTFLAG 位直至其值为 1,确认计数器已经递减至 0;
  • 产生相应中断;

实现代码

void SysTick_Delay_ms(uint32_t tms)
{
    uint32_t i;
    SysTick_Config(72000);          //默认系统为72M
    
    for(i=0; i<tms; i++)
    {
      //等待标志位 COUNTFLAG 为 1
      while(!((SysTick->CTRL) & (1<<16)));
    }
    //使能中断请求
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容