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

    文章

    1592

    浏览量

    108007
  • 计数器
    +关注

    关注

    32

    文章

    2256

    浏览量

    94575
  • 状态寄存器
    +关注

    关注

    0

    文章

    39

    浏览量

    7088
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    13094
  • STM32处理器
    +关注

    关注

    0

    文章

    5

    浏览量

    1123
收藏 人收藏

    评论

    相关推荐

    STM32 SYSTICK定时器常见问题

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

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

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

    浅析单片机中断处理过程

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

    STM32单片机对Systick心跳定时器的设计

    用途: 1.产生操作系统的时钟节拍 2.便于不同处理器之间程序移植 SysTick定时器被捆绑在NVIC中,异常号15 3.作为一个闹铃测量时间用于测量时间, 但当
    发表于 12-11 15:44 4184次阅读

    什么是SysTick定时器?实现STM32时钟系统的详细资料说明

    什么是SysTick定时器?实现STM32时钟系统的详细资料说明主要内容包括了:Systick原理和配置方法,ALIENTEK 延时函数delay讲解
    发表于 01-02 08:00 3次下载
    什么是<b class='flag-5'>SysTick</b><b class='flag-5'>定时</b>器?实现<b class='flag-5'>STM32</b>时钟系统的详细资料说明

    如何使用STM32单片机systick来实现延时定时功能

    1、前言 CM4内核的处理和CM3一样,内部都包含了一个SysTick定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时,将
    的头像 发表于 02-14 06:25 6830次阅读
    如何使用<b class='flag-5'>STM32</b>单片机<b class='flag-5'>systick</b>来实现延时<b class='flag-5'>定时</b>功能

    【野火指南者】STM32F103延时函数及其系统定时器—SysTick

    学习目的:1、学习STM32的系统定时器及其相关的寄存器2、使用STM32的系统定时器来配置延时函数内容介绍:一、Systick简介二、
    发表于 11-24 20:06 7次下载
    【野火指南者】<b class='flag-5'>STM32</b>F103延时函数及其系统<b class='flag-5'>定时</b>器—<b class='flag-5'>SysTick</b>

    STM32 Systick系统定时

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