STM32G4之SysTick系统时钟


前言


提示:以下是本篇文章正文内容

一、SysTick系统滴答定时器

SysTick是一个24位定时器,属于Cortex-M4内核中的一个外设,类似NVIC。

一个周期定时器,用于提供时间基准,多为操作系统所使用,常用于对时间要求严格的情况,意义是很重要的

SysTick定时器一次最多可以计数2^24(24bit)个时钟脉冲,这个脉冲计数值保存在当前计数值寄存器STK_VAL(Systick current value register)中,只能向下计数,也就是倒计数。

每接收到一个时钟脉冲(CPU主频),STK_VAL的值就会向下减1,当减到0时,硬件会自动将重装载寄存器STK_LOAD(可以设定,跟STK_VAL初始值相等)中保存的数值加载到STK_VAL,使其重新计数,并且,系统滴答定时器就产生一次中断,以此循环往复,只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息

Systick相关寄存器
在这里插入图片描述
在这里插入图片描述

若VAL中的数值为 80,脉冲频率为 80MHz,则VAL由 80 减到 0 所需要的时间为80/80MHz=1us,并且当减到 0 时会触发中断(相当于 1us 定时器),同时 LOAD 的值也会重新载入到VAL中

STM32CubeMX系统时钟的配置
在这里插入图片描述
在 STM32CubeMX 中配置好时钟树后,时钟频率会输入到 Cortex System timer内核时钟 。所以, SysTick 的脉冲频率来自于此

二、SysTick系统定时器原理

在HAL_Init()(HAL_Init–>HAL_InitTick–>HAL_SYSTICK_Config–>SysTick_Config) 使用SysTick作为时基源,并配置1ms定时(重置后的默认时钟为 HSI)。但是 HSI 为内部时钟,而我们使用的是外部时钟,这里的1ms定时是不精准的

/* Use SysTick as time base source and configure 1ms tick (default clock after Reset is HSI) */
  if (HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK)
  {
    status = HAL_ERROR;
  }

精准的1ms定时在系统定时器配置函数SysTick_Config() 在core_cm4.h头文件里面

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
  {
    return (1UL);                                                   /* Reload value impossible */
  }

  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
  SysTick->VAL   = 0UL;                                             /* 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 (0UL);                                                     /* Function successful */
}

在这个函数里面进行对系统定时器的寄存器进行配置

系统滴答定时器中断服务函数:每隔1ms进入该服务函数

注:SysTick系统滴答定时器每1ms产生中断

/**
  * @brief This function handles System tick timer.
  */
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  /* USER CODE BEGIN SysTick_IRQn 1 */

  /* USER CODE END SysTick_IRQn 1 */
}

__weak void HAL_IncTick(void)
{
  uwTick += uwTickFreq; // uwTickFreq = 1
}
__IO uint32_t uwTick;
uint32_t uwTickFreq = HAL_TICK_FREQ_DEFAULT;  /* 1KHz */

在中断服务函数中 uwTick 会每1ms加1, 一直循环,直到溢出达到232(大约要一直运行40几天)

uwTick一般用于计数或者延时函数(HAL_Delay()

__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }

  while ((HAL_GetTick() - tickstart) < wait)
  {
  }
}

__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}

HAL_GetTick获取当前uwTick,若传入参数500,tickstart 为 HAL_GetTick() 最初的值(即进入延时时uwTick的值),固定不变。
HAL_GetTick() 与 tickstart 的差值若小于用户定义的500,则继续循环等待;若超过500,则跳出循环(即跳出HAL_Delay() ),延时结束


总结

提示:这里对文章进行总结:

Systick的两大作用:
1、可以产生精确的延时(HAL_Delay())
2、可以提供给操作系统一个单独的心跳(时钟)节拍(操作系统时基)

### STM32G4 内部时钟配置和工作原理 #### 1. 主要时钟STM32G4 微控制器拥有多个内部时钟源,这些时钟源可以被灵活地配置来满足不同的应用需求。主要的时钟源包括: - **HSI (High Speed Internal)**:高速内部振荡器,默认频率为16 MHz,启动速度快,在上电复位后自动启用。 - **HSE (High Speed External)**:外部高速晶振或谐振电路,通常用于更精确的时间基准,可选范围广泛。 - **LSI (Low Speed Internal)**:低速内部RC振荡器,典型值约为32 kHz,主要用于实时时钟(RTC)功能。 - **LSE (Low Speed External)**:外部低速晶体,常设定为32.768 kHz,适用于RTC和其他低功耗模式下的计时。 对于具体型号如STM32G431而言,其默认配置为主频达到80 MHz的工作状态[^1]。 #### 2. PLL (Phase-Locked Loop) 为了获得更高的处理速度,STM32G4 使用PLL倍频技术将较低频率的输入信号放大至所需的高频操作频率。通过调整PLL参数,可以使系统核心运行在一个稳定而高效的速率下,例如上述提到的80 MHz主频设置即是由PLL产生的。 #### 3. AHB/APB 总线与时钟分配 从PLL输出得到的核心时钟会被分发给各个外设总线(AHB、APB)。其中,AHB作为高级高性能总线负责连接CPU与其他快速组件;而APB则服务于较慢速的外围设备。不同级别的APB可能具有各自独立的比例因子以适应特定外设的需求。 #### 4. SysTick 定时器 除了基本的时钟架构之外,还有一个重要的组成部分叫做SysTick定时器。它是基于Cortex-M系列处理器的一个硬件特性,能够接收来自内核时钟经过预分频后的脉冲来进行滴答计数。这意味着当开发者利用STM32CubeMX工具完成时钟树的设计之后,所选定的时钟频率也会直接影响到SysTick的行为表现[^2]。 ```c // 配置SysTick定时器为例程程序片段 void systick_config(void){ if (SysTick_Config(SystemCoreClock / TICKRATE_HZ)) { // 如果初始化失败,则触发错误处理机制 while (1); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Super.Bear

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

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

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

打赏作者

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

抵扣说明:

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

余额充值