【转载】SysTick原理介绍

本文详细介绍了STM32SysTick定时器的工作原理,包括状态控制寄存器的使用、计数机制、时钟频率的选择以及如何实现不同延时(us和ms)的代码示例。它还提到了CortexM3和M4处理器的应用指南作为参考。

转载:个人对STM32 SysTick的总结(寄存器操作) - STM32/8

SysTick概述

SysTick是一个简单的递减24位计数器
如果你不需要再应用程序中嵌入操作系统,SysTick可以作为简单的延时和产生周期性的中断;
状态控制寄存器的第0位可以使能计数器,current value register(当前值寄存器)随着时钟一直递减,当他减到0的时候,重装载寄存器(reload value register)就会重新装载这只的值,计数器继续从这个值递减

SysTick相关寄存器

Ctrl and Status Register

Load Register

Val Register

SysTick逻辑框图

时钟频率与延时

时钟选择

采用参考8分频的参考时钟(168M / 8 = 21M)比较准,所以此处SysTick计数器选择21M的时钟

如何延时1us

时钟频率为21M,也就是1s的时间技术21M次。
由此可知计数一次用了 (1/21000000) s ,用了(1/21000) ms, 用了(1/21) us
所以,1us计数21次。
  • 如何延时1ms

因为1ms = 1000us,所以综上所述,1ms计数1000*21次计数,1ms也就是21000次计数

最大延时

24位计数器能保存的最大值 : 16777215。
最大延时时间 =:16777215 / 21 = 798915 us = 798.915ms

代码实现步骤

Delay初始化

  • 选择时钟源
  • 关闭计数器

延时函数

  • 设置重装载值
  • 当前值清零
  • 使能SysTick
  • 等待计数器计数完毕
  • 当前值清零
  • 关闭计数器

示例代码

#include "delay.h"
#define    Value_us    21
#define    Value_ms    21000
void delay_init(void)
{
    SysTick->CTRL &= (1 << 2); //控制寄存器位2置0,选择8分频时钟
    SysTick->CTRL &= ~(1 << 0); //关闭计数器
}
void delay_us(u32 num)
{            
    SysTick->LOAD = num * Value_us;
    SysTick->VAL = 0;
    SysTick->CTRL |= (1 << 0); //使能计数器
    while (!(SysTick->CTRL & 1<<16));              //判断是否计数完毕
    SysTick->VAL = 0;
    SysTick->CTRL &= ~(1 << 0); //关闭计数器            
}
void delay_ms(u32 num)
{                           
    SysTick->LOAD = num * Value_ms;
    SysTick->VAL = 0;
    SysTick->CTRL |= (1 << 0); //使能计数器
    while (!(SysTick->CTRL & 1<<16));
    SysTick->VAL = 0;
    SysTick->CTRL &= ~(1 << 0); //关闭计数器            
}

参考

  • Cortex M3M4权威指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值