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

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

3天内不再提示

一文详解STM32的嘀嗒时钟(SysTick)

CHANBAEK 来源:南山府嵌入式 作者:南山府嵌入式 2023-01-19 18:11 次阅读

简要说明

1概述

嘀嗒时钟(SysTick)是一个简单的系统时钟节拍计数器,它属于Cortex-M4内核嵌套向量中断控制器(NVIC)里的一个功能单元。他是一个24位的倒计时定时器(在NVIC中),当systick计数值到0的时候,SysTick重装载寄存器就会自动重新装载初值。只要SysTick控制和状态寄存器(CTRL)中的使能位没有ENABLE清除掉,那么就会永远的执行下去。

SysTick定时器被捆绑在NVIC中,可产生SysTick异常(异常号:15),属于Cortex-M4内核里的一个功能单元。

SysTick常作为系统节拍定时器用于操作系统(如mCOS-Ⅱ、FreeRTOS等)的系统节拍定时,从而推动任务和时间的管理。

SysTick的最大使命,就是作为系统的时基定期地产生异常请求。

在不采用操作系统的情况下,完全可以作为通用定时器、计数器使用的。

下图是SysTick控制控制和状态寄存器描述,(地址:0xe000e010)

SysTick 控制及状态寄存器:

截图20230109091048.png

SysTick 寄存器:

截图20230109091048.png

SysTick 重装载数值寄存器:地址 0XE000E014

截图20230109091048.png

特别注意:计数最大值是)0XFFFFFF,在设置重装在值得时候不能大于这个。

SYSTick当前数值寄存器(VAL),地址:0XE000E018

截图20230109091048.png

毕业寄语:

毕业,是一首离别的歌,更是青年成长的里程碑。四年的时光一千多日夜就这样瞬息即过,但它却是你们的瑰丽人生中最浓丽的一抹色彩!如一条条的小溪汇成了一条多彩的河流。你们成了校园里最靓丽的一道风景。

SYSTick校准数值寄存器(VAL),地址:0XE000E018

截图20230109091048.png

配置SysTick作为时钟基准,主要通过对SysTick控制与状态寄存器、SysTick重装载数值寄存器和SysTick当前数值寄存器三个寄存器进行初始化。需要配置的内容如下:

① SysTick时钟源选择。

② 异常请求设置。

③ SysTick时钟使能。

④ 初始化SysTick重装数值。

⑤ 清零SysTick当前数值寄存器。

库函数

SysTick的库函数

1、SysTick寄存器结构体类型

/** \\brief Structure type to access the System Timer (SysTick).

*/

typedef struct
{
  __IO uint32_t CTRL;                    /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */
  __IO uint32_t LOAD;                    /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register       */
  __IO uint32_t VAL;                     /*!< Offset: 0x008 (R/W)  SysTick Current Value Register      */
  __I  uint32_t CALIB;                   /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */
} SysTick_Type;

2、SysTick时钟源初始化函数

/**

  • @brief Configures the SysTick clock source.
  • @param SysTick_CLKSource: specifies the SysTick clock source.
  • This parameter can be one of the following values:
  • @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source.
    
  • @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source.
    
  • @retval None

*/

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_CLKSourceConfig函数被定义在misc.c文件中,配置的是SysTick控制与状态寄存器中的位2。

设置为0:选择使用HCLK/8作为时钟源。

设置为1:选择使用HCLK作为时钟源。

在实际使用的过程中参数宏在misc.h文件里面。

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

3、SysTick配置函数

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




  SysTick->LOAD  = ticks - 1;                                  /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
  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 */
}

SysTick_Config函数被定义在core_cm3.h文件中,它的功能是初始化并开启SysTick计数器及其中断,输入参数ticks是两次中断间的ticks数值。通过次函数可以初始化系统嘀嗒定时器及其中断并开启系统嘀嗒定时器在自由运行模式下以产生周期中断。

SysTick异常服务函数

void SysTick_Handler(void)

SysTick_Handler的服务函数已在启动文件中定义过,并定义了[WEAK]属性,函数内执行的是空循环。

这就要求用户在使用SysTick异常服务时,需要在启动文件之外的其他文件重新定义服务程序,并且其函数名要和启动文件中的函数名保持一致,只有这样才能在编译阶段,将重定义的服务程序函数入口地址替换到SysTick在异常/中断向量表的位置。

应用小栗子

01应用实例

使用SysTick产生1s的定时,控制LED灯以2s为周期进行闪烁。

假设HCLK=180MHz。

在system_stm32f4xx.c文件中定义了全局变量uint32_t SystemCoreClock=180000000,并在头文件system_stm32f4xx.c->stm32f4xx.h中声明。

1-配置SysTick

按照1ms进行分片,配置程序如下:

SysTick_Config(SystemCoreClock/1000);

这样,SysTick会每1ms产生一次异常请求。全局变量定义:

volatile   uint32_tTimingDelay;

volatile防止变量TimingDelay在使用过程中被优化

2-写延时函数

编写以1ms为计时基准的函数:

void delay_ms(uint32_t nTime)
{ 
TimingDelay=nTime;
while(TimingDelay!=0);
}

其中,nTime是需要计时的ms数。

3-写中断服务函数

每1ms SysTick都会产生一次异常请求,执行其异常服务程序SysTick_Handler。对SysTick异常服务程序进行编写,每1ms对变量TimingDelay减1次。

void SysTick_Handler(void)
{
  if (TimingDelay!=0)
{ 
TimingDelay--;
}
}

4-应用

int main(void)
{
/*配置SysTick为每1ms异常一次*/
if (SysTick_Config(SystemCoreClock/1000))
{ 
/*SystemCoreClock/1000超出计数最大值时报错,程序陷入空循环*/ 
while (1);
}
/*初始化LED灯的GPIO*/
LED_Config ();
while (1)
{
/*反转LED灯状态*/
LED_TOGGLE;
/*延时1s*/
delay_ms (1000);
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5032

    浏览量

    117745
  • STM32
    +关注

    关注

    2240

    文章

    10674

    浏览量

    348806
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112043
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    12950
收藏 人收藏

    评论

    相关推荐

    STM32学习及应用笔记SysTick定时器学习及应用

    定时器 (SysTick) 馈送 8 分频的 AHB 时钟 (HCLK)。”另外,STM32在中断部分对SysTick也有句话的描述。如在
    发表于 12-18 15:19

    systick嘀嗒时钟设定为9MHz(HCLK/8的最大值)时产生1ms时间基准应该不对吧?

    ; 产生1us? fac_ms=(u16)fac_us*1000;}在stm32参考手册是这样描述的,系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值)
    发表于 09-02 20:28

    嘀嗒定时器SysTick

    第22章 STM32F407的SysTick实现多组软件定时器本章节为大家讲解嘀嗒定时器SysTick嘀嗒定时器比较容易掌握,其实大家只要
    发表于 08-10 07:59

    SysTick使用详解

    处理器的微控制器都可以由这个定时器获得定的时间间隔。2. SysTick相关寄存器状态寄存器-CTRLSTCLK外部时钟源:AHB总线时钟的 1/8FCLK 内部
    发表于 08-12 06:32

    STM32SysTick时钟

    有位朋友在后台大概问了这样个问题:STM32SysTick时钟源是来自Cortex系统定时器吗?引伸:为什么STM32CubeMX中Co
    发表于 08-19 06:47

    Systick的信号来源

    STM32入门:Systick(系统嘀嗒定时器)学习Systick 介绍Systick
    发表于 08-19 06:56

    详解STM32时钟系统与SysTick定时器

    STM32时钟系统是什么意思?STM32时钟系统有什么意义呢?SysTick定时器的工作原理是什么呢?如何去实现对
    发表于 11-22 07:37

    STM32嘀嗒定时器编程步骤

    STM32嘀嗒定时器编程步骤(个人学习总结)基本知识SysTick 属于CM3,CM4内核芯片内部资源。个24位的倒计数定时器,计到0时,将从RELOAD寄存器中自动重装载定时初值,
    发表于 01-10 08:05

    CH579M的SysTick时钟如何设置?

    当系统嘀嗒时钟设定为 32MHz,系统嘀嗒校准值固定为 32000,将产生 1mS 时间基准。(SysTick时钟如何设置,没有找到设置的函
    发表于 08-25 07:33

    STM32中的SysTick时钟源来自哪里?

    STM32SysTick时钟源来自哪里?
    的头像 发表于 03-03 14:32 7398次阅读

    STM32—关于SYSTICK系统时钟详解及学习笔记

    SysTick_Handler中也无需对中断标志进行清零(参考exit外部中断服务函数)2.要注意的是关于systick其实有两个关键函数,SySTick_Config,SysTick
    发表于 11-30 15:51 14次下载
    <b class='flag-5'>STM32</b>—关于<b class='flag-5'>SYSTICK</b>系统<b class='flag-5'>时钟</b>的<b class='flag-5'>详解</b>及学习笔记

    STM32F103:精准延时delay——SysTick使用

    处理器的微控制器都可以由这个定时器获得一定的时间间隔。2. SysTick相关寄存器状态寄存器-CTRLSTCLK外部时钟源:AHB总线时钟的 1/8FCLK 内部时钟:AHB总线
    发表于 12-02 18:36 9次下载
    <b class='flag-5'>STM32</b>F103:精准延时delay——<b class='flag-5'>SysTick</b>使用

    17、STM32——SysTick详解

    。不过,STCLK 的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要查找芯片的器件手册来决定选择什么作为时钟源。Cortex-M3 的内核中包含一个 SysTick
    发表于 12-23 19:56 0次下载
    17、<b class='flag-5'>STM32</b>——<b class='flag-5'>SysTick</b><b class='flag-5'>详解</b>

    初学stm32-Systick滴答时钟定时

    系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如uCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做uCOS心跳时钟
    发表于 12-31 19:46 15次下载
    初学<b class='flag-5'>stm32-Systick</b>滴答<b class='flag-5'>时钟</b>定时

    STM32SysTick时钟源来自哪里?

    STM32SysTick时钟源来自哪里?
    的头像 发表于 10-26 15:58 976次阅读
    <b class='flag-5'>STM32</b>的<b class='flag-5'>SysTick</b><b class='flag-5'>时钟</b>源来自哪里?