STM32学习总结之Sysstick(系统滴答定时器)

学习目标:

  • 掌握 STM32 基础知识

STM32单片机学习总结之------Sysstick(系统滴答定时器)


学习内容:

1、Cortex-M3 在内核部分 包含了一个简单的定时器——SysTick timer
STM32内核有一个定时器。

2、有定时器就需要有时钟源,时钟源可以是内部的还可以是外部的,需要阅读使用手册确定什么作为时钟源。
在STM32 中SysTick 以 HCLK(AHB 时钟)或HCLK/8 作为运行时钟

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

4、要使SysTick 进行工作必须要进行SysTick 进行配置。它的控制配置很简单,只有三个控制位和一个标志位,都位于寄存器STK_CTRL(SysTick control and status register )中,
在这里插入图片描述
Bit0: ENABLE
为SysTick timer 的使能位,此位为1 的时候使能SysTick timer,此位为0的时候关闭SysTick timer。

Bit1:TICKINT
为异常触发使能位,此位为1 的时候并且STK_VAL 计数至0 时会触发SysTick 异常,此位被配置为0 的时候不触发异常

Bit2:CLKSOURCE
为SysTick 的时钟选择位,此位为1 的时候SysTick 的时钟为AHB 时钟,此位为0 的时候SysTick 时钟为AHB/8(AHB 的八分频)。

Bit16:COUNTFLAG
为计数为0 标志位,若STK_VAL 计数至0,此标志位会被置1。与SysTick 控制相关的所有寄存器如图 0-2,其中上面没有介绍的STK_CALIB 寄存器是用于校准的,不常用。
在这里插入图片描述

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

6、使用
在这里插入图片描述
函数作用:

SysTick_Init() :配置好SysTick 定时器,这个函数中包含对SysTick的配置,即调用了SysTick_Config()函数。

Delay_us() :进行精确延时。

到函数SysTick_Init(),在调用SysTick_Config()函数时,向它输入
的参数为:SystemCoreClock / 100000 ,SystemCoreClock 为定义了系统时钟
(SYSCLK)频率的宏,即等于AHB 的时钟频率,AHB 被配置为72MHz 的,也就是这个SystemCoreClock 宏展开为数值7200 0000。

7、时间的计算
下面为计算公式:
T=ticks*(1/f)
T 为要定时的总时间。
ticks 为SysTick_Config()的输入参数。
1/ f 即为SysTick timer 使用的时钟源的时钟周期,
f 为该时钟源的时钟频率,当时钟源确定后为常数。

例如:使用时钟源为AHB 时钟,其**频率被配置为72MHz。*调用函数时,把ticks 赋值为ticks=SystemFrequency / 10 000 =720,表示720 个时钟周期中断一次;(1/f)是时钟周期的时间,此时(1/f =1/72 us ),所以最终定时总时间T=720(1/72),为720 个时钟周期,正好是10us。
SysTick 定时器的定时时间(配置为触发中断,即为中断周期),由ticks 参数决定,最大定时周期不能超过2^24 个。
在这里插入图片描述

8、总延时时间的计算
总的延时时间T 延时= T 中断周期 * TimingDelay 。
第7点中计算的T,为一个中断周期
TimingDelay为函数Delay_us() 形参,50000为实参。

9、
调用了Delay_us() 函数,SysTick 定时器就被开启,按照设定好
的定时周期递减计数,SysTick 的计数寄存器里面的值减为0 时,就进入中断函
数,当中断函数执行完毕之后由重新计时,如此循环,除非它被关闭。

在这里插入图片描述
这里TimingDelay不等于0,就一直delay。
然后系统对TimingDelay进行下图运算。直至等于0
在这里插入图片描述
此次配置为 10us中断一次,每次中断把TimingDelay 减1。
所以TimingDelay的值就决定了中断几次,进而决定了中断时间。
在这里插入图片描述


学习总结:

可以利用SysTick 进行时间测量。
开启SysTick 定时器后,定时器开始工作,可以定义一个变量a来对中断次数进行记录,在定时器进入中断时,这个变量就a ++,当我们关闭定时器后,将变量的数值乘与定时器的中断周期 就等于测量时间。


  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,针对您的问题,可以按照以下步骤开启STM32F401的系统滴答定时器中断: 1. 首先,需要开启系统滴答定时器TIM6,使用HAL库函数进行初始化: ```c // 定义TIM_HandleTypeDef类型的结构体变量 TIM_HandleTypeDef htim6; // 初始化TIM6 void TIM6_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = {0}; htim6.Instance = TIM6; htim6.Init.Prescaler = 8399; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; htim6.Init.Period = 999; htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim6) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) { Error_Handler(); } } ``` 其中,TIM6_Init()函数是自定义的初始化函数,使用了宏定义的方式配置了预分频器,计数模式和自动重载,最终调用HAL_TIM_Base_Init()函数进行初始化。 2. 开启TIM6的中断,并编写中断服务函数,使用HAL库函数进行配置: ```c // TIM6中断服务函数 void TIM6_DAC_IRQHandler(void) { HAL_TIM_IRQHandler(&htim6); } // 配置TIM6中断 void TIM6_ConfigInterrupt(void) { HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); HAL_TIM_Base_Start_IT(&htim6); } ``` 其中,TIM6_DAC_IRQHandler()是TIM6的中断服务函数,使用了HAL_TIM_IRQHandler()函数进行中断处理;TIM6_ConfigInterrupt()函数是配置TIM6中断的函数,使用了HAL_NVIC_SetPriority()函数设置中断优先级,使用了HAL_NVIC_EnableIRQ()函数开启中断,最终调用HAL_TIM_Base_Start_IT()函数开启TIM6的中断。 以上就是开启STM32F401的系统滴答定时器中断的步骤,希望能对您有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jory&W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值