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

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

3天内不再提示

浅析STM32 Systick查询定时的处理过程

冬至子 来源:纷纭杂谈 作者:CY_CHEN 2023-07-21 17:47 次阅读

STM32处理器有一个24位的系统滴答定时器SysTick,它从重新加载值开始倒数到0,然后在下一个时钟边缘重新加载(包装到)STK_LOAD寄存器中的值,然后在随后的时钟上倒数。

图片

计数标志位COUNTFLAG在系统控制和状态寄存器STK_CTRL的16位,当计时器减计数到0时,返回1。

时钟源选择位CLKSOURCE在系统控制和状态寄存器STK_CTRL的2位,赋值为0时为8分频,赋值为1时为1分频。想要计数速度更快可以选择1分频的时钟源。

SysTick异常请求允许位TICKINT在系统控制和状态寄存器STK_CTRL的1位,赋值为0时禁止异常请求,赋值为1时允许异常请求。软件可以使用COUNTFLAG来判断SysTick是否曾经被计数为零。

计数使能位在系统控制和状态寄存器STK_CTRL的0位,赋值0时禁止计数,赋值1时使能计数。

图片

重装载值RELOAD在SysTick重载值寄存器STK_LOAD的0~23位,加载寄存器指定在启用计数器时和计数器达到0时加载到当前值寄存器STK_VAL的起始值。

图片

当前的计数器值CURRENT在当前值寄存器STK_VAL的1~23位。前值寄存器STK_VALSysTick计数器的当前值。读取返回SysTick计数器的当前值。任何值的写入都会将字段清除为0,并将STK_CTRL寄存器中的COUNTFLAG位清除为0。

查询us、ms延时函数

void Systick_Delayus(u32 us)
{
  SysTick- >CTRL &=~ (1< < 2);                   //选择时钟源,8分频 
  SysTick- >LOAD  =  21*us - 1;                //赋值装载值
  SysTick- >VAL   =    0;                      //清除当前值
  SysTick- >CTRL  |=  1< < 0;                    //使能计数器
  while((SysTick- >CTRL  &  (1< < 16)) == 0);    //判断计数是否结束
  SysTick- >CTRL  &=~  (1< < 0);                 //禁止计数器
}
void Systick_Delayms(u16 ms)
{
  Systick_Delayus(ms * 1000);
}

图片

从时钟树可以知道,系统时钟168Mhz,8分频后得到滴答定时器时钟为21Mhz,装载值(需要延时时间)可根据时钟频率计算求得,每秒可计数21000000次,每微秒可计数21次。装载值和当前值都是24位,最大为16777215,最大微秒定时798915us,最大毫秒定时798ms。

结合LED灯和Systick定时让LED灯500ms闪烁一次,主函数为

#include "stm32f4xx.h"
#include "led.h"
#include "delay.h"


int main()
{
  LED_Init();              //初始化LED灯

  while(1)                //点亮或熄灭LED灯
  {
    GPIOH- >ODR      &=~    (0x01< < 10);      //输出为0,led灯亮
    GPIOH- >ODR      &=~    (0x01< < 11);      //输出为0,led灯亮
    Systick_Delayus(500000);
    GPIOH- >ODR      |=    (0x01< < 10);      //输出为1,led灯灭
    GPIOH- >ODR      |=    (0x01< < 11);      //输出为1,led灯灭
    Systick_Delayms(500);
  }
}

编译成功后将程序烧入,LED每500ms闪烁一次,Systick查询定时成功。

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

    关注

    22

    文章

    1554

    浏览量

    107037
  • 计数器
    +关注

    关注

    32

    文章

    2127

    浏览量

    93028
  • 状态寄存器
    +关注

    关注

    0

    文章

    37

    浏览量

    7021
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    12954
  • STM32处理器
    +关注

    关注

    0

    文章

    5

    浏览量

    1106
收藏 人收藏

    评论

    相关推荐

    STM32 SYSTICK定时器常见问题

    我们知道,STM32库函数里通常使用来自内核的系统定时SYSTICK作为时基,实现计数延时。一般来讲,ST公司提供的库函数里将SYSTICK定时
    发表于 09-13 16:20 2460次阅读

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

    本课将为大家讲解CKS32F4xx系列产品的SysTick定时器原理及使用方法。SysTick定时器也叫SysTick滴答
    的头像 发表于 12-18 09:21 535次阅读
    CKS32F4xx系列MCU <b class='flag-5'>SysTick</b><b class='flag-5'>定时</b>器的原理及使用方法

    数字电视的典型的处理过程

    典型的处理过程 下面介绍数字电视的几个典型的处理过程
    发表于 07-31 14:23 1411次阅读
    数字电视的典型的<b class='flag-5'>处理过程</b>

    浅析单片机中断处理过程

    中断处理过程可分为中断响应、中断处理和中断返回三个阶段。
    的头像 发表于 11-06 14:31 1.7w次阅读
    <b class='flag-5'>浅析</b>单片机中断<b class='flag-5'>处理过程</b>

    STM32 Systick系统定时

    @STM32 Systick系统定时器#简介在之前的实验中,我们只用到的delay函数通过while语句做循环的方式来占用时间,达到延时的目的。但是这种方式延时的时间不好把控,无法应用于更加
    发表于 11-25 10:06 4次下载
    <b class='flag-5'>STM32</b> <b class='flag-5'>Systick</b>系统<b class='flag-5'>定时</b>器

    利用systick实现1s定时

    SysTick一般用于操作系统的产生时基功能,以维持操作系统的“心跳”。问题描述:利用stm32自带的滴答定时器,也就是systick定时
    发表于 11-25 11:06 26次下载
    利用<b class='flag-5'>systick</b>实现1s<b class='flag-5'>定时</b>

    嵌入式单片机基础篇(十)之Systick定时器原理及应用

    来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。(3)
    发表于 11-26 11:51 4次下载
    嵌入式单片机基础篇(十)之<b class='flag-5'>Systick</b><b class='flag-5'>定时</b>器原理及应用

    STM32入门(十五)----SysTick系统定时

    的Cortex-M内核的单片机都具有这个定时器。《STM32参考手册》里的一句话:关于Cortex-M3核心、 SysTick定时器和NVIC的详细说明,请参考另一篇ST的文档和一篇A
    发表于 12-01 15:06 8次下载
    <b class='flag-5'>STM32</b>入门(十五)----<b class='flag-5'>SysTick</b>系统<b class='flag-5'>定时</b>器

    STM32F4: Systick滴答定时器-延时函数讲解(五)

    CM3,CM4内核芯片,都有Systick定时器。Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时
    发表于 12-01 15:21 12次下载
    <b class='flag-5'>STM32</b>F4: <b class='flag-5'>Systick</b>滴答<b class='flag-5'>定时</b>器-延时函数讲解(五)

    Stm32入门——Systick定时

    Stm32入门——Systick定时Systick定时器是什么?从原理上来说,Systick
    发表于 12-07 17:51 12次下载
    <b class='flag-5'>Stm32</b>入门——<b class='flag-5'>Systick</b><b class='flag-5'>定时</b>器

    STM32学习笔记(5)——系统定时SysTick

    单独拿出来讲的一个内核外设(所以不要期望在STM32中文参考手册找到它!即使找到也只会叫你看cm3内核编程手册),说明它真的很重要。STM32学习笔记(5)——系统定时SysTick
    发表于 12-23 19:56 3次下载
    <b class='flag-5'>STM32</b>学习笔记(5)——系统<b class='flag-5'>定时</b>器<b class='flag-5'>SysTick</b>

    STM32笔记(七)---Systick系统定时

    SysTick系统定时器文章目录SysTick系统定时器一、 概念1-1 Systick简介1-2 Sy
    发表于 12-23 20:01 1次下载
    <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心跳时钟。Systi
    发表于 12-31 19:46 15次下载
    初学<b class='flag-5'>stm32-Systick</b>滴答时钟<b class='flag-5'>定时</b>

    STM32SysTick滴答定时器(delay延时函数讲解)

    Systick定时器,是一个简单的定时器,对于CM3、CM4内核芯片,都有Systick定时器。Syst
    发表于 02-10 10:35 13次下载
    【<b class='flag-5'>STM32</b>】<b class='flag-5'>SysTick</b>滴答<b class='flag-5'>定时</b>器(delay延时函数讲解)

    STM32 SysTick定时器讲解

    本文将介绍SysTick定时器、其工作原理与寄存器、及对应的应用实例
    的头像 发表于 04-21 11:31 1232次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>SysTick</b><b class='flag-5'>定时</b>器讲解