STM32笔记12--滴答定时器

SysTick定时器,也叫滴答定时器或者系统定时器。

12.1、Systick定时器基础知识讲解

12.2、Systick相关寄存器库函数讲解

12.3、delay延时函数讲解(Systick应用)

本节参考资料:《STM32F1开发指南-库函数版本》,5.1节delay文件夹介绍

12.1、Systick定时器基础知识讲解

(1)Systick定时器是什么?

Systick定时器是一个比较简单的定时器,常用于延时或者计时,也可以用作实时系统的心跳时钟。节省通用定时器的资源。

Systick定时器是一个24位倒计数的定时器,计时到0时,会自动从RELOAD寄存器中自动重装载定时初值。只要不把它在Systick控制及状态寄存器中的使能位清除,就永不停息。(只要不把Systick定时器关闭,它就会循环往复计时)在睡眠模式下也能工作。

Systick定时器被捆绑在NVIC(中断优先管理),用于产生Systick异常(意思是Systick定时器也可以产生中断,即每次从初值倒计数到0就可以视为一次中断,可以编写中断控制函数)

Systick中断的优先级也可以设置。

(2)4个Systick寄存器

CTRL: Systick控制和状态寄存器

RELOAD(LOAD): Systick自动重装载初值寄存器

VAL: Systick当前值寄存器

CALIB: Systick校准寄存器

VAL中存放的数值在每一个Systick周期后减1,当减为0后,VAL就会从LOAD中加载初值,再进行倒计数。

(3)Systic控制和状态寄存器-CTRL

HCLK:即AHB总线时钟 

PS:在任何情况下,我们使用一个资源,一般都有使能位,并且,我们在调用该资源时,第一步都是使能该资源的时钟,因此在上表中的位0:ENABLE就是Systick的使能位。

上表中位1:TICKINT的意思是:在使用时选择Systick是否要产生中断。若把位2设置为1,则Systick在从初值倒计数到0时就会产生中断。

上表中位2:用于设置Systick的时钟源。设置为0,则Systick的时钟源就是外部时钟;设置为1,则Systick的时钟源就是内部时钟。

(4)Systick重装载数值寄存器-LOAD

 重装载寄存器也为24位(0~23)这是因为Systick是24位时钟,因此其寄存器也应为24位。

(5)Systick当前值急寄存器-VAL

12.2、Systick相关寄存器库函数讲解

(1)固件库中Systick相关函数:

SysTick_CLKSourceConfig()  //SysTick时钟源选择;

SysTick_Config(unit32_t ticks)  //初始化SysTick时钟为HLCK,并且开启中断;

(2)SysTick中断服务函数

void SysTick_Handler(void);

PS:上述代码均可以在“跑马灯实验-库函数版本----->FWLIB------>misc.c”中查到。

关于在STM32库函数中SysTick的定义以及其寄存器对应地址的映射如下:

#define SysTick             ((SysTick_Type *)       SysTick_BASE) //对SysTick的宏定义



//systick寄存器对应的映射地址,包装在一个结构体中

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;

如何设置或者选择SysTick的时钟源?函数如下:

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
  assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
  if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
  {
    SysTick->CTRL |= SysTick_CLKSource_HCLK;  //选择内部时钟源HLCK时钟
  }
  else
  {
    SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;  //选择外部时钟源HCLK的1/8
  }
}

PS:对于STM32,外部时钟源是HCLK的1/8,内核时钟是HCLK。

如何开启中断,这一部分函数位于内核,几乎所有STM32的芯片都适用;

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
                                                               
  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 */
}

注意:systick=sysclk,而sysclk有二个来源,可以二选一,HSI,HSE,这二个的意思是一个外部晶振电路提供的频率,一个内部rc震荡提供的频率这二个频率自身只有8MHZ是无法给cpu提供频率,所以要通过pll倍频电路倍频到72MHZ(103的工作频率),然后AHB等等之类的总线是挂载在sysclk下的不同分支上,有的分频了36MHZ有的未分频等等

意思是AHB总线的频率就=sysclk的频率,而其他的APB等总线频率只有sysclk的八分之一

对于这段话的理解,可以参考时钟总线框图:

12.3、delay延时函数讲解(Systick应用)

1、用中断的方式实现delay延时

在使用延时函数前,记得初始化延时函数

delay_init(); //初始化延时函数 

  • 15
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32滴答定时器是一种用于产生定时中断的硬件模块。通过配置滴答定时器的参数,可以实现在指定的时间间隔内产生中断。在STM32中,滴答定时器的配置可以通过调用相应的函数来完成。 引用\[1\]中的代码是一个用于配置滴答定时器的函数mysystick_config。该函数的参数ms表示需要延时的时间,单位为毫秒。函数内部通过调用SysTick_Config函数来配置滴答定时器的重装值和中断优先级,并通过循环延时指定的时间。 引用\[2\]中的代码是SysTick_Config函数的源码解析。该函数用于配置滴答定时器的重装值、中断优先级和使能开关。在函数内部,首先检测传入的ticks参数是否溢出,然后将重装值存放到LOAD寄存器中。接着设置初始值为0,并配置时钟源、使能中断和使能开启。最后返回0表示函数执行成功。 综上所述,通过调用相应的函数来配置滴答定时器,可以实现在STM32中使用滴答定时器产生定时中断。 #### 引用[.reference_title] - *1* *2* [STM32-基本知识梳理5-滴答定时器配置与使用](https://blog.csdn.net/ADAS_sunshine/article/details/129963034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值