HAL库 Systick定时器 基于STM32F103EZT6 野火霸道,可做参考

目录

1.时钟选择(这里选择高速外部时钟)

​编辑

2.调试模式和时基源选择:

[3.LED的GPIO配置 这里用板子的红灯PB5](#3.LED的GPIO配置 这里用板子的红灯PB5)

4.工程配置

[5.1ms的systick中断实现led闪烁 源码:](#5.1ms的systick中断实现led闪烁 源码:)

6.修改systick的中断频率

7.systick定时原理

[SysTick 定时器的工作原理](#SysTick 定时器的工作原理)

中断触发机制

[HAL_SYSTICK_Config 函数](#HAL_SYSTICK_Config 函数)

举个例子


1.时钟选择(这里选择高速外部时钟)

2.调试模式和时基源选择:

这里我用的是SW调试模式,因为只占用两个GPIO,时基源选择systick 系统定时器

3.LED的GPIO配置 这里用板子的红灯PB5

LED原理图

低电平点亮,配置GPIO

4.工程配置

5.1ms的systick中断实现led闪烁 源码:

在原本生成的代码中修改部分

main.c

/* USER CODE BEGIN Includes */
#include "stm32f1xx_it.h"
/* USER CODE END Includes */

/* USER CODE BEGIN WHILE */
  while (1)
  {
      if(flag==1)
      {
        HAL_GPIO_TogglePin((GPIO_TypeDef *)GPIOB, (uint16_t) GPIO_PIN_5);
          flag=0;
      }
          
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

stm32f1xx_it.h

/* USER CODE BEGIN Includes */
extern volatile  int systick,flag;
/* USER CODE END Includes */

stm32f1xx_it.c

/* USER CODE BEGIN Includes */
volatile int systick=0,flag=0;
/* USER CODE END Includes */

void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */
  if(flag==0)
  {
    systick++;
    if(systick>1000)
    {
        flag=1;
        systick=0;
    }
  }
  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  /* USER CODE BEGIN SysTick_IRQn 1 */

  /* USER CODE END SysTick_IRQn 1 */
}

6.修改systick的中断频率

HAL系统默认的systick的中断频率是1kHZ 也就是1ms中断一次

  /* USER CODE BEGIN 2 */
  
   // 修改时钟源为 HCLK(8MHz)
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

// 再重新配置重装载值
uint32_t new_load = (8000000 / 1000) - 1; // 1ms中断(7999)
HAL_SYSTICK_Config(new_load);

  /* USER CODE END 2 */

在while(1)前配置 为1ms中断

7.systick定时原理

SysTick 定时器是一个广泛应用于嵌入式系统中的定时器,常用于周期性中断。它的基本工作原理是基于系统时钟(SystemCoreClock)来生成一个定时周期,并通过计数器进行倒计时,直到计数器的值为零时触发一个中断。

SysTick 定时器的工作原理

  1. 系统时钟(SystemCoreClock

    • SysTick 定时器的计数频率由系统时钟决定。系统时钟频率就是每秒钟系统产生的时钟周期数,也可以理解为每秒系统执行的时钟信号的次数。
  2. 定时器计数器

    • SysTick 是一个 24 位的倒计时计数器,从 ReloadValue 开始倒数。
    • SysTick 的计数器在每次时钟周期减少 1,直到计数器的值减少到 0 为止。
    • 当计数器的值为 0 时,SysTick 会触发一个中断,表示定时周期已到。
  3. 重载值(ReloadValue

    • ReloadValue 定义了定时器倒计时的起始值,它通过公式与系统时钟频率相关。
    • 我们通过设置 ReloadValue 来控制定时器的计数周期,从而设置中断的时间间隔。

    例如,如果我们希望每 1 毫秒触发一次中断,而系统时钟频率为 8 MHz(即 8,000,000 Hz),则需要将 ReloadValue 设置为:

    这表示计数器会从 8000 开始倒数,经过 8000 个时钟周期后触发中断,每个时钟周期为 1 微秒,所以总共时间为 1 毫秒。

  4. 定时器的倒计时与重载

    • 每当计数器倒计时到 0 时,SysTick 会重新加载 ReloadValue(即 8000),然后继续倒计时,形成一个循环。
    • 这一周期性过程确保了每次计数器到 0 时,都会触发一个中断,时间间隔与 SystemCoreClockReloadValue 密切相关。

中断触发机制

  • 每当 SysTick 定时器的计数器从 ReloadValue 值递减到 0 时,系统会触发一个中断,通知 MCU 进行特定的任务。
  • 这个中断的触发频率与重载值密切相关。例如,设置 ReloadValue 为 8000,且系统时钟为 8 MHz,每经过 8000 个时钟周期就会触发一次中断,时间间隔为 1 毫秒。

HAL_SYSTICK_Config 函数

在 STM32 的 HAL 库中,HAL_SYSTICK_Config 函数用于配置 SysTick 定时器。它的原理如下:

HAL_SYSTICK_Config(SystemCoreClock / 1000);
  • 该函数通过将 SystemCoreClock / 1000 作为重载值设置给 SysTick,意味着系统时钟除以 1000,设置定时器的重载值,使得 SysTick 每经过 1000 微秒(即 1 毫秒)触发一次中断。
  • SystemCoreClock / 1000 的结果就是每 1 毫秒触发一次中断,这使得你可以在中断服务程序中执行特定的任务。

举个例子

假设系统时钟为 8 MHz:

  • 通过 HAL_SYSTICK_Config(SystemCoreClock / 1000),将重载值设置为 8000。
  • 每经过 8000 个时钟周期,SysTick 会触发一个中断。
  • 8000 个时钟周期表示 1 毫秒,触发频率为 1 毫秒一次。

当中断发生时,你可以在中断处理函数中编写需要定时执行的任务,比如采样数据、更新计数器等。

相关推荐
linhhanpy1 小时前
自制虚拟机(C/C++)(一、分析语法和easyx运用,完整虚拟机实现)
c语言·汇编·c++·单片机·操作系统
CoreMaker-lab2 小时前
e2studio开发RA2E1(7)----定时器GPT输出PWM
单片机·mcu·gpt·pwm·e2studio·瑞萨ra·r7fa2e1a72dfl
膝盖中箭-_-#4 小时前
【STM32系列】利用MATLAB配合ARM-DSP库设计IIR数字滤波器(保姆级教程)
stm32·matlab·数字滤波器·iir
YE_lou4 小时前
【蓝桥杯嵌入式】4_key:单击+长按+双击
stm32·嵌入式硬件·蓝桥杯
程序员JerrySUN5 小时前
AIoT 未来趋势:机遇与挑战并存
linux·嵌入式硬件·docker·容器·eureka
sakabu12 小时前
STM32HAL库RTC时钟
stm32·单片机·实时音视频
电子绿洲14 小时前
售后板子HDMI无输出分析
单片机·嵌入式硬件·智能硬件
LK_0714 小时前
【蓝桥杯—单片机】第十届省赛真题代码题解题笔记 | 省赛 | 真题 | 代码题 | 刷题 | 笔记
笔记·单片机·蓝桥杯