• 《嵌入式系统》知识总结12:SysTick定时器


    SysTick定时器

     系统时钟(SysTick)

    Corte-M3在内核中包含的简单定时器
    • 该定时器的时钟源可以来自CM3内部时钟(FCLK),或CM3外部时钟(STCLK)
    • 在STM32微控制器中,SysTick的时钟源可以是:“AHB时钟”、或者“AHB时钟/8”
    SysTick定时器是一个24位递减计数器
    • 设置初值、允许计数后,每来一个时钟,计数值减1
    • 计数值减为0时,计数器被自动载入初值、继续计数
    同时内部标志COUNTFLAG被置位、并触发中断
    • SysTick中断连接中断控制器NVIC,异常号为15

     

     SysTick寄存器

     SysTick timer工作分析

    SysTick是一个24位的定时器,即一次最多可以计数224 个时钟脉冲,这个脉冲计数值被保
    存 到 当 前 计 数 值 寄 存 器 VAL (SysTick current value register) 中,只能减计数,每接收到一个时钟脉冲VAL的值就减1,直至0,当VAL的值被减至0时,由硬件自动把重载 寄 存 器 LOAD ( SysTick reload valueregister)中保存的数据加载到VAL,重新向下计数。当VAL的值被计数至0时,触发异常,就可以在中断服务函数中处理定时事件了。

    要 使 SysTick 进 行 以 上 工 作 必 须 要 进 行SysTick进行配置。它的控制配置很简单,只有三个控制位和一个标志位,都位于寄存器SysTick_CTRL ( SysTick control andstatus register )中

    控制和状态寄存器(SysTick_CTRL)

     

    (12)STCLKAHB预分频时钟被8分频后送内核,为STCLK
    (13)FCLKAHB预分频时钟不分频送内核,为FCLK
    (14)APB1时钟
    (16)APB2时钟
    APB总线有APB1和APB2,因此有两个APB预分频器,AHB预分频时钟通过它们进行分频,当对应外设被使能的情况下,分别得到APB1时钟PCLK1和APB2时钟PCLK2

    重载值寄存器(SysTick_LOAD)

    当前值寄存器(SysTick_VAL )

     每经过一个SysTick时钟周期,VAL寄存器值-1
     读取寄存器:返回当前VAL值
    写 寄 存 器 : 清 零 VAL , 还 会 使 CTRL 寄 存 器 中COUNTFLAG位清0

    校准值寄存器(SysTick_CALIB)

     SysTick寄存器编程

     

    (1)禁止SysTick定时器
    (因为SysTick可能已经被允许了)
    SysTick->CTRL = 0; // 关闭SysTick
    (2)写入重载值
    SysTick->LOAD = 256-1; // 假设计数值为256
    (3)清除当前值为0
    (向当前值寄存器SysTick_VAL写入任何值)
    SysTick->VAL = 0;
    (4)允许SysTick定时器
    SysTick->CTRL = 1; // 打开SysTick 

    SysTick结构定义

    SysTick结构定义
    系统时钟SysTick属于Cortex内核部件
    驱动程序定义在core_cm3.h(不是core_cm3.c)文件
     SysTick寄存器的结构类型

    1. typedef struct
    2. { __IO uint32_t CTRL;
    3. __IO uint32_t LOAD;
    4. __IO uint32_t VAL;
    5. __I uint32_t CALIB;
    6. } SysTick_Type;

    有关地址定义的语句如下:
     

    1. #define SCS_BASE (0xE000E000)
    2. #define SysTick_BASE (SCS_BASE + 0x0010)
    3. #define SysTick ((SysTick_Type *) SysTick_BASE)

     SysTick精确延时

    软件延时

     • 利用内核执行循环实现,延时的时间无法精确测量,有很大的局限性

    可以利用SysTick timer实现基于硬件的精确延时
    • 理论上它的最小计时单位为AHB的时钟周期,即1/72000000 秒,72分之一的微秒,足以满足大部分应用需求。

    main函数

     整个main函数的流程就是先初始化LED、配置SysTick定时器之后,就进入死循环,轮流点亮LED1、LED2、LED3,点亮的时间为精确的500ms。

    配置并启动SysTick timer

    SysTick_Init() 这个函数,是由用户在SysTick.c这个文件中实现的,其功能是启动系统滴答定时器
    SysTick,并将SysTick配置为 10 us 中断一次

    SysTick应用

    可用于精确延时

    • 系统时钟72MHz,最小的计时单位(时钟周期)(1/72)×10-6秒、即72分之一的微秒

    使用SysTick进行时间测量

    •  当我们开启SysTick定时器后,定时器开始工作,我们可以定义一个变量a(初值为0)来对中断次数进行记录,在定时器进入中断时a++,当我们关闭定时器时,将变量a的数值乘以定时器的中断周期就等于待测时间。一般利用该功能测量程序的运行时间。

     SysTick可作为操作系统的时基

    •  例如:操作系统可以为多个任务分配不同数目的时间片,确保没有一个任务能霸占系统;或者将每个定时器周期的某个时间范围赐予特定的任务等
    • 因为SysTick为CM3的内核资源,软件在不同芯片厂商的CM3器件间的移植工作得以简化。
  • 相关阅读:
    计算机网络——香农公式
    OpenAI与微软合作,构建 ChatGPT 5 模型;10天准确天气预报
    海思平台SS528V100编译 linux kernel tun.c eth_get_headlen 编译 出错的问题
    查询快递单号物流,自动识别出物流是否签收
    【HarmonyOS】鸿蒙入门学习
    1024特别剪辑: 使用Python Turtle 库绘制一棵随机生成的树
    解决shardingsphere SQLFeatureNotSupportedException: isValid
    AN动画基础——摄像头
    mybatis中使用@Column(name = “`group`“)失效
    DHTMLX JavaScript Gantt 8.0.6 Crack
  • 原文地址:https://blog.csdn.net/qq_53914247/article/details/131057167