SysTick 简介

SysTick—系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC (嵌套向量中断控制器) 中。系统定时器是一个24bit的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK 等于 72M 。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。

因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。

SYSCLK 前面的项目一般是设置为 72MHz, 则其计一次数的时间为 1/72M 秒

1s = 1000ms. 设置重装载数值寄存器的值为 72000, 则可每 1ms 触发一次中断.

中断的概念

中断( interrupt ):在主程序运行过程中,出现了特定的打断条件(中断源),让CPU暂停当前正在运行的程序,去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。

嵌套向量中断控制器 (Nested Vectored Interrupt Controller : NVIC)

CM3内核支持256个中断,包括16个内核中断和250个外部中断,同时具有256级的可编程中断设置。而STM32只使用了一部分。STM32拥有84个中断,包括16个内核中断和68个可屏蔽中断(STM32F107系列才使用了68个可屏蔽中断),还拥有16级可编程的中断优先级。STM32F103系列只使用了60个可屏蔽中断。

项目配置

这里可以看到, Timebase Source (时钟基准源) 有五个选项可供选择 (SysTick, TIM1~4 (通用定时器))

设置核心板上三个 LED 灯对应的 GPIO 口为输出, 默认电平为高 (灯熄灭)

代码部分

/**
  * @brief This function handles System tick timer.
  */
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */
  
  static uint16_t count = 0; // 定义静态变量 count, 用于在每次中断中累计次数 (不随函数退出清零)
  
  count++; // 每进一次中断 (1ms), count 加 1.
  
  if (count >= 500) // 如果累计达到 500 次 (即500ms)
  {
    // 清零 count, 重新开始计数
    count = 0;
    // 翻转 LED 的状态, 实现闪烁效果. 
    HAL_GPIO_TogglePin(GPIOA, LED_R_Pin | LED_G_Pin | LED_B_Pin);
  }

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

  /* USER CODE END SysTick_IRQn 1 */
}
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐