0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CKS32F4xx系列MCU SysTick定时器的原理及使用方法

中科芯MCU 来源:中科芯MCU 2023-12-18 09:21 次阅读

本课将为大家讲解CKS32F4xx系列产品的SysTick定时器原理及使用方法。SysTick定时器也叫SysTick滴答定时器,属于Cortex-M4内核外设。SysTick定时器可以用于查询延时、中断延时以及测量函数运行时间;在实时操作系统RTOS中作为滴答定时器,用于上下文切换。采用Cortex-M内核的微处理都有SysTick定时器,方便不同处理器之间的软件移植。SysTick定时器时钟源可直接选取系统时钟,还可以通过系统时钟8分频后取得。

SysTick定时器内部是一个递减的计时器,当减到0时,将从LOAD寄存器中自动重装定时器初始值,重新向下递减计数,如此循环往复。如果开启SysTick中断,当计数器减到0时,SysTick可以生产异常,异常编号为15。

SysTick定时器寄存器

SysTick定时器内部是一个24位向下递减的计时器,包含4个寄存器,如图。

34167e5a-9bf6-11ee-8b88-92fbcf53809c.png

图1SysTick定时器框图

1)STK_CTRL寄存器

STK_CTRL是SysTick定时器的控制及状态寄存器,相应功能如下:

3429746a-9bf6-11ee-8b88-92fbcf53809c.jpg

2)STK_LOAD寄存器

STK_LOAD寄存器是SysTick定时器的重装载数值寄存器,相应功能如下:

3438bc86-9bf6-11ee-8b88-92fbcf53809c.jpg

3)STK_VAL寄存器

STK_VAL寄存器是SysTick定时器的当前数值寄存器,相应功能如下:

3441d30c-9bf6-11ee-8b88-92fbcf53809c.jpg

4)STK_CALIB寄存器

STK_CALIB寄存器是SysTick定时器的校准数值定时器,用于利用片上硬件为软件提供校准信息,但使用情况较少。在CMSIS Core中,不需要使用SysTick校准寄存器,因为CMSIS Core提供了一个名为“SystemCoreClock”的软件变量。此变量在系统初始化函数“SystemInit()”中设置,每次更改系统时钟配置时也会更新。这种方法比使用SysTick CalibrationRegister的硬件方法灵活。校准寄存器描述如下表:

3458cca6-9bf6-11ee-8b88-92fbcf53809c.jpg

查询延时使用步骤

1)配置SysTick定时器时钟源

2)加载延时计数值 3)清零计数器,启动定时器开始递减计数 4)等待计数结束 5)清零计数,关闭定时器,延时结束 相关函数如下:

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
  if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
  {
    SysTick->CTRL |= SysTick_CLKSource_HCLK;
  }
  else
  {
    SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
  }
}
void TickDelayInit(u8 SYSCLK)
{
//选择时钟源为AHB/8
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us=SYSCLK>>3;
fac_ms=((u32)SYSCLK*1000)>>3;
}
void TickDelayUs(u16 nus)
{
uint32_t temp;
SysTick->LOAD=nus*fac_us-1;
SysTick->VAL=0x00;
SysTick->CTRL=0x01;
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL=0x00;        
SysTick->VAL =0X00;       
}
void TickDelayMs(u16 nms)
{        
u32 temp;    
SysTick->LOAD=nms*fac_ms -1;
SysTick->VAL =0x00;
SysTick->CTRL=0x01 ;
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL=0x00;
SysTick->VAL =0X00;  
}

中断方式延时使用步骤

1)配置SysTick定时器时钟源

2)调用系统函数SysTick_Config(),开启中断,配置中断间隔

3)延时函数赋值延时变量,并等待延时变量递减到0,达到精确延时效果

4)中断函数中延时变量递减到0 相关函数如下:

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
   if ((ticks - 1) > 0xFFFFFF)//24位寄存器,大于该值返回错误
   {
      return (1);  
   }
  SysTick->LOAD  = (uint32_t)(ticks - 1);//计数到0,ticks值应减1   
  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1);
  SysTick->VAL   = 0UL;    
  SysTick->CTRL  = (1<<2) |(1<<1) | 1;//配置时钟源,使能定时器,开启中断
  return (0UL);  
}
void TickInterruptDelay(__IO u32 nTime)
{
  TimingDelay = nTime;
  while(TimingDelay != 0);
}
void TickInterruptHandleTimingDelay_Decrement(void)
{
  if (TimingDelay != 0)
   {
     TimingDelay--;
   }
}

测量短时函数的执行时间

SysTick计时器可用于计时测量。例如,可以使用以下代码测量短函数的持续时间:

SysTick->CTRL = 0; // 禁用 SysTick

SysTick->LOAD = 0xFFFFFFFF; // 设置重装寄存器到最大值

SysTick->VAL = 0; // 清零VAL

SysTick->CTRL = 0x5; // 使能SysTick, 使用处理器时钟

while(SysTick->VAL != 0); // 等待重装完毕

start_time = SysTick->VAL; // 较大的起始点

TestDelayFunc(); // 待测函数执行时间

stop_time = SysTick->VAL; // 获取执行结束时间

cycle_count = start_time e stop_time;//计算函数执行时间

由于SysTick是一个递减计数器,因此start_time的值大于stop_time。如果待测函数执行时间较长,这种情况必须启用SysTick异常,并使用SysTick处理程序来计算SysTick计数器下溢的次数。

总结及注意事项

SysTick定时器是微处理器系统内部定时器,提供精确的时间延时和计时功能。采用中断方式延时,需要考虑SysTick中断优先级较低,容易被打断影响延时;在嵌入式系统中,系统将使用SysTick计时器,应用程序中则不可在使用SysTick;在系统在线调试停止时,SysTick计时器将停止计时。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16019

    浏览量

    343649
  • 寄存器
    +关注

    关注

    30

    文章

    5032

    浏览量

    117741
  • 操作系统
    +关注

    关注

    37

    文章

    6288

    浏览量

    121886
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112041
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    12950

原文标题:MCU微课堂|CKS32F4xx系列SysTick定时器

文章出处:【微信号:中科芯MCU,微信公众号:中科芯MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MCU微课堂|CKS32F4xx系列产品时钟配置

    作为MCU运行的基础,时钟是单片机各个模块工作时序的最小时间单位,推动单片机的各指令执行,是MCU选型的一个重要指标。CKS32F4xx系列产品具有众多的外设,但并非所有的外设均需要系
    发表于 12-12 10:17 568次阅读

    CKS32F4xx系列产品的定时器使用-基本特征和定时操作

    这一课我们将介绍CKS32F4XX系列产品的定时器使用,CKS32F4XX定时器功能十分强大,包含2个高级控制
    的头像 发表于 05-19 09:18 546次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>产品的<b class='flag-5'>定时器</b>使用-基本特征和<b class='flag-5'>定时</b>操作

    CKS32F4xx系列产品Timer的基本使用方法-定时器脉冲计数

    上一章我们介绍了CKS32F4的通用定时器定时操作的使用方法,这一章我们将向大家介绍通用定时器作为定时器
    的头像 发表于 06-05 09:39 535次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>产品Timer的基本<b class='flag-5'>使用方法</b>-<b class='flag-5'>定时器</b>脉冲计数

    CKS32F4xx系列RNG功能设置

      MCU 微课堂 CKS32F4xx 系 列RNG功能 随机数发生器简介     CKS32F4xx系列自带了硬件随机数发生器(RNG),RNG处理器是一个以连续模拟噪声为基础的随机
    的头像 发表于 09-08 10:01 341次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>RNG功能设置

    CKS32F4xx系列DAC功能

    CKS32F4xx系列DAC功能
    的头像 发表于 11-06 16:56 601次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>DAC功能

    CKS32F4xx系列ADC多通道DMA电压采集

    CKS32F4xx系列ADC多通道DMA电压采集
    的头像 发表于 11-06 16:53 411次阅读

    CKS32F4xx系列ADC单通道电压采集

    CKS32F4xx系列ADC单通道电压采集
    的头像 发表于 11-06 16:54 562次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>ADC单通道电压采集

    CKS32F4xx系列低功耗模式STANDBY模式

    CKS32F4xx系列低功耗模式STANDBY模式
    的头像 发表于 11-06 16:57 243次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>低功耗模式STANDBY模式

    CKS32F4xx系列低功耗模式SLEEP模式

    CKS32F4xx系列低功耗模式SLEEP模式
    的头像 发表于 11-06 16:59 439次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>低功耗模式SLEEP模式

    CKS32F4xx系列低功耗模式STOP模式

    CKS32F4xx系列低功耗模式STOP模式
    的头像 发表于 11-06 17:08 362次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>低功耗模式STOP模式

    CKS32F4xx系列产品Timer的基本使用方法-定时器脉冲计数

    CKS32F4xx系列产品Timer的基本使用方法-定时器脉冲计数
    的头像 发表于 11-09 17:38 548次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>产品Timer的基本<b class='flag-5'>使用方法</b>-<b class='flag-5'>定时器</b>脉冲计数

    CKS32F4xx系列产品Timer的基本使用方法-比较输出

    CKS32F4xx系列产品Timer的基本使用方法-比较输出
    的头像 发表于 11-09 17:39 431次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>产品Timer的基本<b class='flag-5'>使用方法</b>-比较输出

    CKS32F4xx系列产品Timer的基本使用方法-定时操作

    CKS32F4xx系列产品Timer的基本使用方法-定时操作
    的头像 发表于 11-09 17:41 317次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>产品Timer的基本<b class='flag-5'>使用方法</b>-<b class='flag-5'>定时</b>操作

    MCU微课堂 | CKS32F4xx系列产品SPI通信

    MCU微课堂 | CKS32F4xx系列产品SPI通信
    的头像 发表于 10-24 17:12 422次阅读
    <b class='flag-5'>MCU</b>微课堂 | <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>产品SPI通信

    MCU微课堂 | CKS32F4xx系列产品GPIO口配置

    MCU微课堂 | CKS32F4xx系列产品GPIO口配置
    的头像 发表于 10-24 15:14 482次阅读
    <b class='flag-5'>MCU</b>微课堂 | <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>产品GPIO口配置