SysTick timer(STK)

前言

1MHZ=1000KHZ=1000 000HZ
"延迟函数的实现中,要注意的是,全局变量TimingDelay必须使用volatile,否则可能会被编译器优化。 "

详解

系统滴答定时器

  1. 存在于内核
  2. 只能递减
  3. 24位 max 2^24
  4. 嵌套在NVIC中
  5. 所有Cortex-M 都具有

功能框图
指南者开发板随板资源视频老师自画
通过这个框图我们了解到:
counter递减计数器在时钟(系统时钟 一般72m 也可八分频)的驱动下开始计数
若递减计数器的值(STK_VAL)减为0 (此间可以监测current value)
则使能中断可以产生并且置位COUNTFLAG为1,那么就可以执行响应函数并且重装载寄存器reload就会重新赋值给递减计数器,如此循环

下面是关于SysTick Timer 官方资料的目录结构:
上面一个为控制和状态寄存器 下面一个为重装载值寄存器
关于控制和状态寄存器
在这里插入图片描述
只有这四个位是有效的,具体有什么作用呢:
在这里插入图片描述

COUNTFLAG:如果该位变为1 需要我们软件读取 并且读取完清零
CLKSOURCE: 设置时钟源 具体可追溯到之前的时钟设置的那个框图 如下
(即可以/8=9 也可以直接输进去=72)
在这里插入图片描述
TICKINT: 设置是否产生中断的一个位 如果写为0 那么计数器无论多少次递减为0都不会产生中断 反之写为1即可
ENABLE:这个就不必赘述 每一个外部都有的开关 此处是使能定时器

RELOAD: 来自下面一个文档 24有效 设置的值将会记作计数递减的开始值
CURRENT:实时记录着递减计数器的值

对应到固件库:
core_m3.h里的结构体定义

typedef struct
{
__IO uint32_t CTRL; /*!< Offset: 0x00 SysTick Control and Status Register /
__IO uint32_t LOAD; /
!< Offset: 0x04 SysTick Reload Value Register /
__IO uint32_t VAL; /
!< Offset: 0x08 SysTick Current Value Register /
__I uint32_t CALIB; /
!< Offset: 0x0C SysTick Calibration Register */
} SysTick_Type;
校正不常用

core_m3.h 里的固件库函数 (也是在这个头文件里面)

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible /
//形参ticks写进LOAD里面 也就是设置重装载的最大值
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /
set reload register /
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /
set Priority for Cortex-M0 System Interrupts /
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 */
}

时间计算
CLK=72M 由CTRL配置
SKT_LOAD=7200次 由RELOAD配置

频率 一秒钟之内振荡次数 一秒内计数次数 所用时间
72M 72000 000次 72000 000次 1s
set reload 72000 次 0.001s = 1 ms
set reload 72 次 0.000001= 1 us

(每次振荡就是一次计数)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值