11.SysTick 详解:从原理到实战,掌握 Cortex-M 系统嘀嗒定时器

第11章 基础重点—SysTick 定时器 SysTick定时器(又名系统滴答定时器)是存在于Cortex-M3的一个定时器,只要是ARM Cotex-M系列内核的MCU都包含这个定时器。使用内核的SysTick定时器来实现延时,可以不占用系统定时器,节约资源。由于SysTick是在CPU核内部实现的,跟MCU外设无关,因此它的代码可以在不同厂家之间移植。本章将使用系统滴答定时器实现延时函数, 注 意 SysTick 用于了 HAL 库的毫秒级延时函数“HAL_Delay()”,不建议日常使用SysTick去作为其它用途,这里只作为演示。 阅读详情

摘要:SysTick 是 ARM Cortex-M 内核内置的 24 位向下计数定时器,具有可产生固定周期中断、跨芯片通用等特点,常用于 RTOS 时钟节拍、精确延时和时间测量。本文从工作原理、寄存器详解、配置步骤入手,结合 STM32F103 给出寄存器直操作与 CMSIS 标准函数两种实战代码,并梳理典型应用场景与常见问题排查,帮助读者快速掌握 SysTick 的使用方法。

关键词:SysTick、Cortex-M、定时器、延时、RTOS

一、SysTick 概述

SysTick(System Tick,系统嘀嗒定时器)是 ARM Cortex-M 内核中内置的一个简单 24 位向下计数定时器,属于 NVIC(嵌套向量中断控制器)的一部分。它独立于芯片厂商的外设定时器,所有基于 Cortex-M 内核的 MCU(如 STM32、GD32(兆易创新)、NRF52 等)都具备这个外设。

核心特点:24 位递减计数器、可产生固定周期中断、内核级外设(跨芯片通用)、通常用作操作系统时基或精确延时。

主要用途

  • 操作系统时基:FreeRTOS、RT-Thread、uC/OS 等 RTOS 的时钟节拍(Tick)通常由 SysTick 提供,典型节拍为 1ms。

  • 精确延时:裸机程序中利用 SysTick 实现微秒/毫秒级延时函数。

  • 时间测量:作为简单的时间基准,测量代码执行时间。

  • 轮询调度:在非 OS 环境下提供周期性任务触发。

二、工作原理

SysTick 的计数流程可以概括为「装载初值、递减计数、归零重装」三个环节,其完整循环如下图所示:

flowchart TD
    A[向 LOAD 写入初值 N] --> B[使能定时器,VAL 从 N 开始]
    B --> C[每个时钟周期 VAL 递减 1]
    C --> D{VAL 减到 0?}
    D -- 否 --> C
    D -- 是 --> E[COUNTFLAG 置 1]
    E --> F{是否开启中断?}
    F -- 是 --> G[触发 SysTick 异常]
    F -- 否 --> H[继续轮询 COUNTFLAG]
    G --> I[从 LOAD 重新装载初值]
    H --> I
    I --> C

整个流程是一个不断循环的闭环:计数器从重装载值 N 开始,每个时钟周期递减 1,减到 0 时置位 COUNTFLAG 并根据是否开启中断决定触发异常还是轮询等待,随后自动从 LOAD 重新装载初值进入下一轮计数,如此往复形成稳定的系统时基。

SysTick 的工作机制非常简单:

  1. 向重装载寄存器(LOAD)写入初值 N。

  2. 使能定时器后,计数器(VAL)从 N 开始,每个时钟周期递减 1。

  3. 当计数器减到 0 时:

    1. 若开启了中断,则触发 SysTick 异常(异常号 15,优先级可配置)。

    2. COUNTFLAG 状态位置 1。

    3. 计数器自动从 LOAD 重新装载初值,继续下一轮计数。

注意:SysTick 是 24 位计数器,最大计数值为 2^24 - 1 = 16,777,215。若时钟频率为 72MHz,最大定时时间约为 16,777,215 / 72,000,000 ≈ 233ms。超过这个时长需要多次中断累计。

三、寄存器详解

SysTick 共有 4 个寄存器,映射在内核外设地址空间(基地址 0xE000E010):

寄存器

偏移地址

作用

SYST_CSR(CTRL)

0x00

控制与状态寄存器:使能、中断使能、时钟源选择、计数标志

SYST_RVR(LOAD)

0x04

重装载值寄存器:24 位,计数器归零时重新装载的值

SYST_CVR(VAL)

0x08

当前计数值寄存器:读取返回当前计数,写入任意值会清零并清除 COUNTFLAG

SYST_CALIB(CALIB)

0x0C

校准寄存器:指示 10ms 校准值及是否有精确参考时钟(通常由芯片厂商设置)

CTRL 寄存器位定义

位

名称

说明

0

ENABLE

定时器使能位。1 = 使能计数,0 = 关闭

1

TICKINT

中断使能位。1 = 计数到 0 时触发 SysTick 异常,0 = 不触发中断(可轮询 COUNTFLAG)

2

CLKSOURCE

时钟源选择。1 = 内核时钟(HCLK/ AHB 时钟),0 = 外部参考时钟(STCLK,通常为 HCLK/8,具体由芯片决定)

16

COUNTFLAG

计数标志位。计数器从上一次读取后减到 0 过则为 1;读取 CTRL 寄存器后自动清零

四、配置步骤

配置 SysTick 通常遵循以下四步:

  1. 设置重装载值:根据所需定时周期和时钟频率计算 LOAD 值。 公式:LOAD = 定时周期(秒) × 时钟频率(Hz) - 1 例如 72MHz 内核时钟、1ms 周期:LOAD = 0.001 × 72,000,000 - 1 = 71,999

  2. 清零当前计数值:向 VAL 寄存器写入任意值(通常写 0),清零计数器和 COUNTFLAG。

  3. 配置控制寄存器:设置时钟源、使能中断、使能定时器。

  4. 实现中断服务函数:如果开启了中断,编写 SysTick_Handler() 处理函数。

五、代码实战

5.1 直接操作寄存器(以 STM32F103 为例,72MHz)

// 配置 SysTick:1ms 定时中断
void SysTick_Init(void)
{
    // 设置重装载值:72MHz 下 1ms = 72000 个时钟周期,减 1
    // LOAD 寄存器(SYST_RVR,偏移 0x04)为 24 位重装载值寄存器,
    // 计数器归零后会自动从该值重新装载。LOAD = 周期(秒) × 频率(Hz) - 1
    // = 0.001 × 72,000,000 - 1 = 71,999,写入 72000 - 1 即 71,999。
    SysTick->LOAD = 72000 - 1;

    // 清零当前计数值,同时清除 COUNTFLAG
    // VAL 寄存器(SYST_CVR,偏移 0x08)为当前计数值寄存器,
    // 写入任意值会清零计数器并清除 CTRL 中的 COUNTFLAG 位(位 16),
    // 确保使能后第一个计数周期从完整的 LOAD 值开始,避免首周期不完整。
    SysTick->VAL = 0;

    // 配置控制寄存器(SYST_CSR/CTRL,偏移 0x00):
    // 以下三个宏定义来自 CMSIS 头文件 core_cm3.h(STM32F103 为 Cortex-M3 内核),
    // 由 ARM 在 CMSIS 标准中统一定义,位于 core_cm3.h 的 SysTick 结构体声明附近:
    //   SysTick_CTRL_CLKSOURCE_Msk = (1UL << 2)  —— 位 2,时钟源选择
    //   SysTick_CTRL_TICKINT_Msk   = (1UL << 1)  —— 位 1,中断使能
    //   SysTick_CTRL_ENABLE_Msk    = (1UL << 0)  —— 位 0,定时器使能
    // 使用位掩码按位或(|)组合,可避免误改其它位,比直接写数值更清晰、可移植。
    //
    // CLKSOURCE=1:选择内核时钟(HCLK/AHB 时钟,此处为 72MHz)作为计数时钟源;
    //              若为 0 则使用外部参考时钟 STCLK(通常为 HCLK/8)。
    // TICKINT=1:计数到 0 时触发 SysTick 异常(异常号 15),进入 SysTick_Handler()。
    // ENABLE=1:使能定时器,计数器开始从 LOAD 值递减。
    SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
                    SysTick_CTRL_TICKINT_Msk   |
                    SysTick_CTRL_ENABLE_Msk;
}

// 全局毫秒计数器
volatile uint32_t g_sys_tick = 0;

// SysTick 中断服务函数(启动文件中已定义弱符号,此处重写)
void SysTick_Handler(void)
{
    g_sys_tick++;  // 每 1ms 加 1
}

// 获取当前毫秒数
uint32_t GetTick(void)
{
    return g_sys_tick;
}

// 毫秒级延时
void Delay_ms(uint32_t ms)
{
    uint32_t start = GetTick();
    while ((GetTick() - start) < ms);
}

5.2 使用 CMSIS 标准函数(推荐)

CMSIS 提供了 SysTick_Config() 函数,一行即可完成配置:

// 配置 1ms  SysTick 中断(SystemCoreClock 为内核时钟频率,单位 Hz)
// 函数内部自动完成 LOAD、VAL、CTRL 的配置及中断优先级设置
if (SysTick_Config(SystemCoreClock / 1000))
{
    // 配置失败(通常是 LOAD 值超过 24 位范围)
    while (1);
}

// 中断服务函数同上
void SysTick_Handler(void)
{
    g_sys_tick++;
}

SysTick_Config(ticks) 的参数是两次中断之间的时钟周期数。要得到 1ms:ticks = SystemCoreClock / 1000;要得到 1us:ticks = SystemCoreClock / 1000000。

5.3 微秒级延时(轮询方式,不占用中断)

static uint32_t fac_us = 0; //us延时倍乘数

void delay_init(uint8_t SYSCLK)
{
  fac_us = SYSCLK;
}

void delay_us(uint32_t nus)//100  6800
{
  uint32_t ticks;
  uint32_t told, tnow, tcnt = 0;
  uint32_t reload = SysTick->LOAD; //LOAD的值
  ticks = nus * fac_us;            //需要的节拍数
  told = SysTick->VAL;             // 24  刚进入时的计数器值
  while (1)
  {
    tnow = SysTick->VAL;//22  20  0
    if (tnow != told)
    {
      if (tnow < told)
        tcnt += told - tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
      else
        tcnt += reload - tnow + told;
      told = tnow;
      if (tcnt >= ticks)
        break; //时间超过/等于要延迟的时间,则退出.
    }
  };
}
void delay_ms(uint16_t nms)
{
  uint32_t i;
  for (i = 0; i < nms; i++)
    delay_us(1000);
}

六、典型应用场景

6.1 RTOS 时钟节拍

以 FreeRTOS 为例,其 vPortSetupTimerInterrupt() 函数内部就是通过配置 SysTick 来产生 1ms(configTICK_RATE_HZ = 1000)的节拍中断,驱动任务调度。用户通常无需手动配置。

6.2 裸机非阻塞延时

利用全局 Tick 计数器实现非阻塞延时,避免 CPU 空转:

void App_Task(void)
{
    static uint32_t last_led_tick = 0;
    static uint32_t last_sensor_tick = 0;

    uint32_t now = GetTick();

    // 每 500ms 翻转 LED
    if (now - last_led_tick >= 500)
    {
        last_led_tick = now;
        LED_Toggle();
    }

    // 每 100ms 读取传感器
    if (now - last_sensor_tick >= 100)
    {
        last_sensor_tick = now;
        Sensor_Read();
    }
}

七、注意事项与常见问题

  1. 计数器初值:使能后第一次计数是从 LOAD 值开始,不是从 0 开始。如果 VAL 未清零就使能,第一次计数周期可能不完整,因此配置时务必先写 VAL = 0。

  2. 校准寄存器:CALIB 寄存器中的 TENMS 字段给出了产生 10ms 延时所需的计数值,但不同芯片厂商实现可能不同,实际开发中建议根据具体时钟频率自行计算,不依赖 CALIB。

常见问题排查

下面汇总了 SysTick 使用中常见的 5 个典型问题,并给出原因分析与解决方案,便于快速定位和修复。

常见问题

原因分析

解决方案

延时不准(偏长或偏短)

LOAD 值计算错误,或实际内核时钟频率与配置不一致;CLKSOURCE 选择了错误的时钟源。

确认 SystemCoreClock 与实际运行频率一致,按 LOAD = 周期(秒) × 频率(Hz) - 1 重新计算;核对 CLKSOURCE 位,确保使用预期的内核时钟。

中断不触发

TICKINT 位未置 1;SysTick 异常优先级被屏蔽;中断服务函数未实现或未正确链接。

检查 CTRL 寄存器 TICKINT 位;确认 NVIC 中 SysTick 异常未被屏蔽;实现并链接 SysTick_Handler(),避免使用弱符号覆盖冲突。

与 RTOS 冲突(节拍错乱)

用户代码与 RTOS 同时抢占 SysTick,或修改了 RTOS 已配置的 LOAD/CTRL 寄存器。

在 RTOS 环境下不要手动重配 SysTick,统一使用 RTOS 提供的节拍接口;若需额外延时,改用其他定时器或软件延时。

首次计数周期不完整

使能前未清零 VAL,计数器从残留值开始递减,导致第一个周期偏短。

配置时先向 VAL 写入任意值(通常写 0)清零计数器,再使能定时器,确保首个周期完整。

长时间延时失效

SysTick 为 24 位计数器,单次最大定时约 233ms(72MHz 下),超过后未做多次中断累计。

在中断服务函数中维护全局 Tick 计数器,通过多次中断累计实现长延时;或改用硬件定时器。

边界条件与极端情况

除了上述常见问题,SysTick 在低时钟频率、低功耗模式和多核架构等边界条件下还有一些容易被忽略的细节,下面逐一说明。

1. 低时钟频率下的 LOAD 值溢出

SysTick 的 LOAD 寄存器只有 24 位,最大可写入值为 2^24 - 1 = 16,777,215。当时钟频率较低时,同样的定时周期换算出的计数值可能超过该上限。以 32kHz 时钟为例,若要产生 1 秒定时,LOAD = 1 × 32,000 - 1 = 31,999,仍在 24 位范围内;但若要产生 10 分钟(600 秒)定时,LOAD = 600 × 32,000 - 1 = 19,199,999,已超过 16,777,215,写入后会被截断,导致实际定时时间远小于预期。解决思路是:先计算 LOAD 值并判断是否超过 0xFFFFFF,若超限则改用多次中断累计,或换用硬件定时器;也可以适当降低定时周期,通过中断计数累加实现长延时。

2. 与低功耗模式(睡眠/停止)的交互

SysTick 的计数时钟通常来自内核时钟(HCLK)或外部参考时钟(STCLK)。在睡眠模式下,若内核时钟仍在运行,SysTick 可继续计数并正常触发中断唤醒;但在停止模式下,内核时钟通常被关闭,SysTick 会停止计数,此时依赖 SysTick 的延时和 RTOS 节拍都会失效。因此,在进入停止模式前应暂停依赖 SysTick 的任务,改用支持低功耗唤醒的定时器(如 RTC 或 LPTIM)作为唤醒源;若必须保留时间基准,可考虑在唤醒后重新校准 SysTick 的 LOAD 和 VAL 值,避免计数偏差累积。

3. 多核处理器中的 SysTick 归属

在 Cortex-M 多核处理器(如 Cortex-M33 + Cortex-M4 组合)中,每个内核都拥有自己独立的 SysTick 实例,寄存器地址相同但物理上相互独立。因此,各核应分别配置和使用自己的 SysTick,不能跨核访问或共享同一个 SysTick 中断服务函数。若需要跨核同步时间基准,建议通过核间通信机制(如 Mailbox 或共享内存)传递 Tick 值,而不是直接操作对方内核的 SysTick 寄存器。

4. 24 位计数器回绕时的无符号减法处理

SysTick 的 VAL 是 24 位递减计数器,读取到的值会从 LOAD 递减到 0 后重新装载,因此在连续读取时可能出现回绕。利用无符号整数的回绕特性,可以用一次减法安全地计算时间差,而无需判断是否发生回绕。例如:

uint32_t start = SysTick->VAL;
// 执行需要测量的代码段
uint32_t end = SysTick->VAL;
uint32_t elapsed = (start - end) & 0x00FFFFFF;  // 取低 24 位,自动处理回绕

由于 start 和 end 都是无符号数,且差值不超过 2^24,直接相减再按位与 0x00FFFFFF 即可得到正确的递减计数差值,无需判断 end 是否大于 start。这一技巧同样适用于基于全局 Tick 计数器的毫秒级延时判断,例如 (GetTick() - start) < ms 的写法正是利用了无符号回绕特性,即使 Tick 计数器溢出也能正确计算时间差。

八、精准上报实验

  • 1ms精准上报

  • 10ms精准上报

九、总结与展望

SysTick 作为 Cortex-M 内核自带的 24 位递减定时器,凭借配置简单、跨芯片通用、不占用外设定时器资源等优势,已成为 RTOS 时钟节拍、裸机精确延时和时间测量的首选方案。选型时建议优先使用 CMSIS 标准函数,并注意时钟源、重装载值与中断优先级的正确配置。展望未来,随着低功耗设计日益普及,SysTick 在休眠唤醒、动态节拍(tickless)等场景中的作用将更加突出;在 RTOS 集成方面,其与任务调度、功耗管理的协同优化也将成为嵌入式开发的重要方向。

深入解析Cortex-M4四大核心外设:从SysTick到FPU的嵌入式实战指南 在嵌入式系统开发中,实时性、稳定性和计算效率是衡量系统性能的关键指标。其底层原理依赖于处理器内核的核心外设模块,这些模块负责系统的调度、保护和硬件加速。通过深入理解系统定时器、中断控制器、内存保护单元和浮点运算单元的工作原理,工程师能够构建响应迅速、安全可靠的嵌入式应用。在工业控制、物联网终端和汽车电子等领域,精准的定时调度、高效的中断管理、坚固的内存隔离以及硬件加速的浮点运算,是实现复杂算法和实时控制的技术基石。本文聚焦于ARM Cortex-M4内核的SysTick、NVIC、MPU和FPU四大核心外设 阅读详情

相关推荐

情系淮思:五款车规MCU横向对比与VCU选型

本文对比五款车规MCU中的S32K312与S32K324,聚焦核心架构、存储、通信及安全特性。S32K324为双核160MHz Cortex-M7,内存、外设(如以太网、QuadSPI、SAI)全面升级,支持高实时并行处理与复杂应用;而S32K312为单核120MHz,适用于中端车身控制。两者均满足ASIL B功能安全,具备完整安全引擎。选型建议:中端用S32K312,高端复杂系统优选S32K324。

本不平凡 314

STM32系统滴答定时器SysTick:从原理到精准延时实战

本文深入解析STM32系统滴答定时器SysTick的工作原理与精准延时实现技巧。通过详细讲解寄存器配置、时钟源选择策略及微秒/毫秒级延时函数优化,帮助开发者掌握这一嵌入式时间基准的核心技术,并分享实际项目中的误差分析与补偿方法。

l3m4n的博客 1067

21 硬件工程师笔面试高频考点真题解析——单片机

本文系统介绍了单片机的核心概念与应用知识,包括:单片机定义与选型要点(性能、存储、外设等);核心参数(主频、I/O、通信接口等);最小系统组成(电源、复位、晶振、BOOT);常见外设(GPIO、ADC、定时器等);GPIO工作模式(输入/输出);死机原因分析(硬件干扰、软件错误等);上电故障排查流程(电源、时钟、程序等);与DSP、FPGA的对比(控制vs运算vs可编程);常用通信总线特点(UART、I2C、SPI、CAN);看门狗功能(超时复位防死机)。内容涵盖单片机硬件设计关键要点,适合嵌入式开发者参考

XU157303764的博客 1317

stm32f4xx-systick系统滴答时钟

​ SysTick叫做系统嘀嗒时钟,系统定时器,属于Cortex-M4内核中的一个(外设)外围设备,并且是24bit向下递减的计数器lSystick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。lSystick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。

qq_45698138的博客 2445

SDU CS 期末考回忆版合集

删除原有分散的版本,合订起来画个。包括:机器学习、算法、图形学、操作系统、编译原理、软件工程、大数据分析管理、计算机体系结构等。

https://github.com/ZhaoyungZhang 6650

从零开始的BW(五) 外部系统供数之OData测试

5、激活添加的服务,如提示下图中的激活失败,根据生成URI在事务代码SICF目录中找到对应的服务,设置超时时间,设置完之后重新激活即可,详情可参考SAP note 1986626。如果刚才设置BY Odata的query在这没有显示,SE38执行程序EQ_RS_AUTOSETUP,选中需要生成服务的query,生成服务后再去添加服务。测试get方法,URI中默认的参数是?4、事务代码/IWFND/MAINT_SERVICE中添加服务,如果提示用户不再登陆,在事务代码前加上/O或者/N即可。

m0_61386064的博客 1111

SysTick的优先级是高还是低

摘要             SysTick系统嘀嗒定时器是Cortex内核的部分,尤其对于有实时操作系统的软件,它一般会作为整个系统的时基,所以这个对操作系统非常重要。             SysTick                、CM3、系统嘀嗒                    SysTick系统嘀嗒定时器并非STM32独有的,它是Cortex内核的部分

abcdefg的专栏 1万+

oscp备考,oscp系列——Djinn3靶场:ssti漏洞,pkexec提权

oscp备考,oscp系列——Djinn3靶场:ssti漏洞,pkexec提权难度简单偏上对于低权限shell获取涉及:ssti漏洞对于提权:pkexec提权。

2202_75361164的博客 634

系统滴答定时器

SysTick是一个24位定时器,属于Corte-M4内核中的一个外设,类似NVIC。 一个周期定时器,用于提供时间基准,多为操作系统所使用,常用于对时间要求严格的情况。 SysTick定时器一次最多可以计数2^24(24bit)个时钟脉冲,这个脉冲计数值保存在当前计数值寄存器STK_VAL(Systick current value register)中,只能向下计数,也就是倒计数,每接收到一个时钟脉冲(CPU主频),STK_VAL的值就会向下-1,当减到0时,硬件会自动将重装载寄存器STK_LOA.

m0_54929728的博客 3547

从入门到精通:HyperMesh实体选择全攻略(含2025新界面操作)

本文系统解析了HyperMesh从基础到高级的实体选择技巧,重点介绍了2025新界面的交互逻辑与效率提升。内容涵盖选择模式、框选方法、右键菜单高级选择、图形窗口选择器与命令面板的智能联动,以及利用浏览器和过滤器进行精准定位的实战指南,帮助用户显著提升前处理建模效率。

open4的博客 1087

如何利用DeepSeek自动生成PLC程序?

在工业自动化领域,PLC是核心控制设备,其编程效率和质量直接影响生产线的运行效果。 然而,传统PLC编程依赖工程师手动编写代码,不仅耗时耗力,还容易出错。通过自动生成PLC程序,DeepSeek不仅大幅提升了编程效率,还优化了代码质量。 那么DeepSeek到底能否自动生成PLC程序呢? 有位电气工程师就尝试让DeepSeek设计一套五层电梯控制系统的PLC程序,下面就让我们看看吧。 技术原理:DeepSeek如何实现自动编程DeepSeek利用自然语言处理技术,将工程师输入的文本指令转换为PLC代码。例

Qinmingyue13的博客 6180

STM32 HAL库延时与计时全解析:从阻塞延时到非阻塞调度

在嵌入式系统开发中,延时与计时是基础且关键的技术概念,其核心原理在于对CPU时间片的精准管理。从简单的忙等待到硬件定时器中断,不同的实现方式直接影响系统实时性与效率。技术价值在于实现非阻塞、高精度的时间控制,避免CPU空转,提升多任务并发能力。应用场景广泛,包括传感器数据采集、通信协议时序控制、电机PWM驱动以及多任务调度等。本文聚焦STM32 HAL库,深入剖析HAL_Delay的阻塞陷阱、SysTick微秒延时实现,并详解硬件定时器在输入捕获、PWM输出及编码器模式下的应用,帮助开发者构建高效可靠的时间

wangqiaowqo的专栏 510

MAX30102心率血氧传感器:从原理到实践的可穿戴健康监测方案

本文深入解析MAX30102心率血氧传感器的工作原理及在可穿戴健康监测中的实践应用。通过反射式光电容积脉搏波(PPG)技术,该传感器能精准测量心率和血氧饱和度,具备低功耗、高抗干扰等优势。文章详细介绍了信号处理算法、硬件连接技巧及创新应用场景,为开发者提供全面的解决方案。

weixin_29184371的博客 284

STM32学习

本课程中,使用STM32F103ZET6这款芯片,相比51,32的参数性能明显能拉爆前者,这也是为什么51只用于教学而32却能用于真实生产场景中。

qq_46433748的博客 278

部署OpenClaw(ClawdBot、MoltBot)后访问localhost:18789报1008错误怎么办?

部署openclaw(曾用名ClawdBot、MoltBot)后访问localhost:18789出现1008授权错误❌?本文分享如何快速解决这个问题✅

XiaoqiangClub的博客 1万+

一文搞懂YOLO各版本差异:v5易用、v8多任务、v10低延迟,该怎么选?

YOLOv5的“易用”是为了降低入门门槛,适合新手启蒙和旧项目维护;YOLOv8的“多任务”是为了满足工业需求,成为目前的主流版本;YOLOv10的“低延迟”是为了适配边缘计算,代表未来的发展趋势。选型的核心不是“选最新的”,而是“选最适合自己场景的”。记住选型口诀,按场景对号入座,就能避开99%的坑。希望这篇文章能帮你彻底搞懂各版本差异,选对属于自己的YOLO版本!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1170

基本定时器(TIM6/TIM7)

基本定时器最简单,就干一件事:到点了触发中断。定时器本质就是计数器,每个时钟脉冲加1,数到ARR就溢出、产生中断、清0重来。三个核心寄存器:PSC(预分频器):对输入时钟分频CNT(计数器):从0往上数ARR(自动重装载值):数到这个值就溢出,CNT清0,产生更新中断公式:  定时周期 = (PSC+1) × (ARR+1) / 定时器时钟  更新事件频率 = 定时器时钟 / ((PSC+1) × (ARR+1)) 例:TIM6时钟84MHz,要定时0.5秒(2

2401_89890233的博客 260

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

7-2 按键控制LED流水灯(SDCC + Notepad++ + STC-ISP/普中ISP)

本节基于上节定时器T0设计,实现按键控制LED流水灯。通过配置12MHz晶振下16位定时器模式,初值设为64536(0xFC18),每1毫秒溢出一次,替代原有Delay方法。启用定时器中断,设置TR0启动,TF0标志自动置位触发中断,配合外部按键控制流水灯状态,提升系统实时性与效率。

xunyan6234的博客 82

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

TMS320F28335 学习笔记(二):系统时钟、PLL 与看门狗

本文系统介绍F28335的时钟架构与看门狗应用,涵盖外部晶振、PLL倍频生成系统时钟(SYSCLKOUT)、高速/低速外设时钟分频配置,以及看门狗的启用、关闭与喂狗机制。强调时钟配置准确性对延时、PWM、通信等外设的重要性,指出常见错误如晶振不匹配、未等待PLL锁定、随意修改PLL或喂狗周期过长等问题,并提供初始化框架与验证方法,帮助开发者正确配置时钟系统,确保程序稳定运行。

2403_83044722的博客 370

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

代码小白笔记:江科大 51 单片机 LCD1602 课程详解

本文为单片机新手梳理江科大51课程中LCD1602的驱动逻辑,聚焦“看懂代码”而非深究寄存器。通过解析接线、底层函数(延时、写命令/数据)、初始化流程及光标定位,详解字符、字符串、数字(十进制、十六进制、二进制)的显示原理,核心在于理解“RS控制指令/数据”、“地址映射规则”及“数字转字符”的位运算技巧,帮助读者快速上手并自定义显示内容。

2301_81429079的博客 341

MCU 启动流程解析:从 SRAM 到 DDR

MCU 的性能瓶颈通常不在 DDR 带宽,而在访问延迟与确定性。因此,关键代码、中断向量、栈以及功能安全数据应放在片内 SRAM;大块传感器数据缓冲、堆和冷数据则放在 DDR。启动流程的核心可以概括为三步:Boot ROM 搬运、Remap 切换、SRAM 执行。

Where there is life, there is hope. 291

XZ6273H 100V低功耗高压LDO硬件设计与实测体验

这款LDO提供SOT23-3、SOT89-3和TO92三种通用封装,不同场景下可以灵活选择:做小型化的PCB节点时用SOT23-3,板卡面积能控制得非常小;常规工业板卡选SOT89-3,贴片焊接方便,自带的焊盘也能提供基础散热能力;从实际落地的情况来看,它最适配两类场景:一类是汽车电子里的休眠值守子模块,车辆熄火后仍能保持极低的待机功耗,不会过度消耗电瓶电量;另一类是户外无人值守的通信远端节点,长期运行下的低功耗表现能大幅降低设备的供电维护成本。

koce13544100678的博客 231

MCU的ADC采样怎么配

一块采集板,室温下读电池电压挺准,一上高低温箱就差出0.3V。软件反复查了三遍,没改一行代码,最后发现是参考电压选错了——电源纹波直接灌进了测量基准。ADC这东西,代码就那么几行,坑全在配置里。这篇拿ATmega16当例子,把采样链路从头讲清:参考电压怎么选、时钟为什么卡在50到200kHz、结果为什么要讲究读取顺序。这些规则不只对AVR成立,换成车规MCU,思路一样。

qq_43241255的博客 194

HAL库基本定时器框架分析

这部分是在main.c里面调用的,使能定时器外设和中断位。实时真正干活的操作在中断处理函数里进行。流程1 定时器外设初始化和中断配置。流程2 使能定时器中断相关位。流程3 中断处理函数。

tecoes的博客 29

PHY内部环回通过,能证明网口整条链路正常吗?

PHY内部环回通过,只能证明该测试路径在记录条件下工作正常,不能直接证明变压器、RJ45、网线和对端组成的整条链路正常。采购收到“环回合格”报告时,应先确认数据从哪里发出、在哪里折返、又在哪里检查。

Voohu_Elsa的博客 191
上一篇: 10.DHT11温湿度传感器详解:原理、时序与程序设计
下一篇: 12.STM32 定时器(TIM)从原理到实战:四种核心工作模式详解
硅基造物主
博客等级 码龄4年 17粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值