当前位置: 首页 > news >正文

GD32H7定时器单脉冲模式:硬件精准延时与脉冲生成全解析

1. 项目概述:为什么需要可延时单脉冲模式?

在嵌入式开发,特别是电机控制、电源管理、激光测距或者需要精密时序触发的应用里,我们常常会遇到一个经典场景:当某个事件(比如按键按下、传感器信号跳变、通讯接收到特定指令)发生后,需要延迟一段精确的时间,再产生一个宽度也精确可控的脉冲信号,去驱动后续的执行机构(如继电器、MOSFET、激光发射器)。这个“延迟”和“脉冲宽度”的精度,直接决定了整个系统的响应性能和可靠性。

如果你用传统的软件延时配合GPIO翻转来实现,代码会陷入忙等待,CPU被白白占用,实时性差,精度也受中断响应和系统负载影响,毫秒级都勉强,微秒级更是奢望。而GD32H7系列MCU的定时器所支持的“可延时单脉冲模式”,就是为了优雅地解决这个问题而生的硬件方案。它允许你将“延迟时间”和“脉冲宽度”这两个关键参数,预先配置到定时器的几个寄存器里。之后,仅需一个内部或外部触发信号,定时器硬件便会自动、精准地完成“等待延迟时间->输出有效脉冲->自动停止”这一整套动作,全程无需CPU干预。

这不仅仅是解放了CPU,更重要的是它提供了纳秒级的时序控制精度和极高的可靠性。今天,我们就以GD32H7的通用/高级定时器为例,抛开库函数,直捣黄龙,从寄存器的角度,彻底搞懂这个模式的配置流程、工作原理以及那些容易踩坑的细节。无论你是从STM32迁移过来,还是首次接触GD32,理解这些寄存器级的操作,都能让你对定时器的掌控力提升一个维度。

2. 核心思路与寄存器地图总览

配置可延时单脉冲模式,本质上是对定时器工作模式的一次精密编排。我们的目标是:让定时器在受到触发后,先停止(或复位)并开始计数,计数值达到“延迟值”时,改变输出比较通道的电平(通常是从无效电平变为有效电平,即脉冲开始);继续计数,计数值达到“脉冲宽度值”时,再次改变该通道的电平(从有效变回无效,即脉冲结束),同时自动停止定时器。

整个过程依赖几个核心寄存器协同工作。在GD32H7中,与通用/高级定时器单脉冲模式相关的关键寄存器主要包括:

  • TIMERx_CTL0 (控制寄存器0): 负责定时器总开关、计数模式、触发选择等全局配置。
  • TIMERx_SMCFG (从模式控制寄存器): 这是配置单脉冲模式的“大脑”,用于选择触发源、从模式(单脉冲模式在此选择)等。
  • TIMERx_CHCTL0/1/2 (通道控制寄存器): 配置具体输出比较通道(如CH0, CH1)的模式、极性、输出使能等。我们的脉冲将从这里输出。
  • TIMERx_CHxCV (通道比较/捕获寄存器): 这是存储“比较值”的核心。在单脉冲模式下,我们需要两个比较值,分别对应延迟结束点和脉冲宽度结束点。这通常通过一个通道寄存器(如CH0CV)和它的影子寄存器(如CH0CV1,如果支持)来实现,或者巧妙利用两个不同的通道。
  • TIMERx_CAR (自动重载寄存器): 决定了计数器的周期上限。在单脉冲模式下,它必须大于“延迟时间+脉冲宽度”的总和。
  • TIMERx_CNT (计数器寄存器): 实时计数值,我们配置时通常需要先将其清零。
  • TIMERx_DMAINTEN (DMA/中断使能寄存器): 用于使能更新事件、比较匹配等中断,以便在脉冲结束后通知CPU。

整个配置的逻辑链条可以概括为:选择触发源 -> 配置为单脉冲从模式 -> 设定计数器周期(CAR)-> 配置输出比较通道并设定两个比较值(延迟与宽度)-> 使能定时器并等待触发

注意:GD32H7的定时器寄存器与STM32高度相似但并非完全一致,具体位定义需以GD32H7的用户手册为准。例如,单脉冲模式可能对应SMCFG寄存器中SMC位的特定值,而触发源选择则由SMCFG中的TRGS位控制。

3. 寄存器级配置步骤详解

下面,我们以一个具体的场景为例:使用 TIMER1 的通道0(CH0)输出一个脉冲,要求触发信号(假设来自内部其他定时器的更新事件)到来后,延迟t_delay个时钟周期,再产生一个宽度为t_pulse个时钟周期的低有效脉冲(即平时高电平,脉冲期间低电平)。定时器时钟频率为f_clk

3.1 第一步:基础定时器模式与时钟配置

在进入单脉冲模式配置前,需要先搭建好定时器的基本运行框架。

  1. 配置时基单元

    • TIMER1_CTL0 (控制寄存器0)
      • CEN位:先保持为0(禁止计数),等所有配置完成后再开启。
      • DIR位:设置为0,选择向上计数模式。这是最常用的模式,计数器从0开始累加。
      • SPM位:通常保持默认的0(单脉冲模式不由此处控制,而是由SMCFG控制)。
    • TIMER1_PSC (预分频器寄存器): 根据你的时钟频率和所需计时精度来设置。假设系统主频为200MHz,我们希望计数器每个时钟周期为1us,则预分频值PSC = f_clk / (1e6) - 1。例如,若f_clk=200MHz,则PSC = 200 - 1 = 199。这样,计数器实际时钟 = 200MHz / (199+1) = 1MHz,即1us计数一次。
    • TIMER1_CAR (自动重载寄存器): 这是计数器的上限。它必须大于(t_delay + t_pulse)。假设延迟需要100us,脉冲宽度需要50us,计数器时钟周期为1us,则t_delay=100,t_pulse=50。那么CAR至少需要设置为150。为了留有余地,通常设置为CAR = t_delay + t_pulse + 一些裕量,例如200。关键点:在单脉冲模式下,当计数器达到CAR值(发生更新事件)时,定时器并不会自动重载重新开始,而是会停止(如果配置正确)。但CAR仍然定义了计数周期的终点。
  2. 清空计数器

    • 在启动前,将TIMER1_CNT寄存器写为0,确保从一个确定的状态开始。

3.2 第二步:配置单脉冲模式与触发源

这是核心步骤,告诉定时器“如何启动”以及“启动后如何行为”。

  1. 配置从模式控制寄存器 (TIMER1_SMCFG)
    • SMC位: 查找手册,将这几个位设置为“单脉冲模式”对应的值。在STM32中,这个值通常是0x06(触发模式)或结合其他位实现单脉冲。在GD32中,需要确认具体位定义。一个常见的模式是“门控模式”或“触发模式”的变体来实现单脉冲。假设手册规定SMC[2:0]=110为单脉冲模式。
    • TRGS位: 选择触发源。例如,如果希望由 TIMER2 的更新事件触发,则可能需要设置TRGS[2:0]=010(内部触发1,ITR1)。具体映射关系需查表。如果使用外部引脚(TI1FP1或TI2FP2)触发,则需要选择相应的滤波和边沿检测配置。
    • MSM位: 主从模式位。当使用内部定时器级联触发时,有时需要将此位置1,使得触发信号能同步主从定时器的动作。

实操心得:务必仔细阅读数据手册中关于SMCFG寄存器的描述。单脉冲模式(One Pulse Mode)有时是SMC的一个独立选项,有时需要通过配置为“触发模式”并结合其他设置(如OISx,CCxP等)来实现。理解“从模式”的概念是关键:定时器在此模式下,其启动、停止、计数都受另一个信号(触发信号)控制。

3.3 第三步:配置输出比较通道

我们需要指定哪个通道输出脉冲,并设定其初始电平和翻转逻辑。

  1. 配置通道模式与极性 (TIMER1_CHCTLx)

    • 以通道0为例,配置TIMER1_CHCTL0寄存器(或类似命名的寄存器组,GD32可能将通道配置分散在多个寄存器)。
    • CH0COMCTLCC0S位: 设置为输出比较模式,例如01(输出,匹配时翻转)。
    • CH0COMSENCC0E位: 使能输出。
    • CH0COMPCC0P位: 设置输出极性。我们希望平时高电平,脉冲期间低电平(低有效)。那么:
      • 如果“有效电平”定义为低,则设置CC0P=1(输出低有效)。
      • 同时,需要配置CH0COMSIDLCC0IDL位(输出空闲状态)。在定时器未启动或停止时,我们希望输出高电平(无效状态),因此应设置CC0IDL=0(输出高电平)。
    • 关键技巧: 单脉冲模式通常需要结合输出比较模式的“强制输出”或“PWM模式1/2”来设定初始状态。更常见的做法是,将通道配置为PWM模式1,然后通过比较值来控制电平跳变。
  2. 设定两个关键比较值: 这是单脉冲模式的精髓所在。我们需要两个比较值:CCR1_Val = t_delayCCR2_Val = t_delay + t_pulse

    • 方案A(使用一个通道及其影子寄存器):如果定时器支持双寄存器(如CH0CVCH0CV1),则可以将t_delay写入CH0CV,将t_delay + t_pulse写入CH0CV1。并配置相应的预装载和影子寄存器切换逻辑。这种方式最简洁。
    • 方案B(使用两个通道):更通用。将通道0(CH0)和通道1(CH1)都配置为输出比较模式,并映射到同一个物理引脚(如果支持)或者使用两个引脚。然后:
      • 设置CH0CV = t_delay, 配置CH0为匹配时输出有效电平(如置低)。
      • 设置CH1CV = t_delay + t_pulse, 配置CH1为匹配时输出无效电平(如置高),或者更常见的是,配置CH1在匹配时产生一个事件,通过主模式管理去复位定时器或触发其他动作。更经典的B方案是:仅用CH0输出。配置CH0为PWM模式1,设置CH0CV = t_pulse(脉冲宽度),而t_delay通过计数器的起始相位来实现?不,这不对。在标准的单脉冲模式配置中,CARCCR的关系需要重新审视。

让我们纠正一个核心概念:在标准的单脉冲模式(OPM)下,通常的配置逻辑是:

  • 定时器处于一种特殊的“单次”状态
  • 延迟时间由计数器的启动相位和第一个比较匹配事件决定。但更准确的说法是:脉冲的起始边沿(上升沿或下降沿)由第一个比较事件决定,脉冲的结束边沿由第二个比较事件(或更新事件)决定
  • 对于向上计数PWM模式:假设我们想要一个低有效脉冲。 1. 设置CH0COMP=1(低有效),CH0COMSIDL=0(空闲高)。 2. 配置为PWM模式1。 3. 在PWM模式下,CNT < CCR时输出有效电平(低),CNT >= CCR时输出无效电平(高)。 4. 我们希望:触发后,先输出无效电平(高)t_delay时间,然后变有效(低)持续t_pulse时间,最后回到无效(高)并停止。 5. 这可以通过设置CH0CV = t_delay来实现吗?不行。因为PWM模式是周期性的。

正确的寄存器级思维流程(以PWM模式实现单脉冲)

  1. 使能单脉冲模式(SMCFG.SMC=OPM)。
  2. 配置通道为PWM模式1,极性为高(假设空闲高,脉冲低)。
  3. 设置TIMERx_CAR = t_delay + t_pulse。这是整个单次周期的长度。
  4. 设置TIMERx_CH0CV = t_delay
  5. 这样,在触发启动后:
    • CNT=0CNT=t_delay-1CNT < CCR,输出有效电平(低)?不对!这里有个大坑。
    • 因为我们要的是延迟后才有脉冲,所以初始应该输出无效电平(高)。这意味着我们需要反转一下逻辑。
    • 设置CH0COMP=0(高有效)。那么PWM模式1下,CNT < CCR时输出高(无效),CNT >= CCR时输出低(有效)。
    • 现在,时间线就对了:0 -> t_delay-1CNT < CCR,输出高(无效,延迟期)。t_delay -> CAR-1CNT >= CCR,输出低(有效,脉冲期)。当CNT达到CAR时,发生更新事件,定时器停止(单脉冲模式),输出保持最终状态(由MOE,CCxE等控制,通常可配置)。

所以,寄存器配置的关键等式是

  • CAR= 延迟时间(t_delay) + 脉冲宽度(t_pulse)
  • CHxCV= 延迟时间(t_delay)
  • 通道极性需要根据你想要的初始电平和有效电平来调整PWM模式和有效极性位。

3.4 第四步:使能定时器与等待触发

  1. 使能输出: 确保TIMERx_CHCTLx中的CCxE位(输出使能)已置1。对于高级定时器,还需要使能主输出(CTL0.MOE)。
  2. 使能定时器: 将TIMERx_CTL0寄存器的CEN位置1。注意:在单脉冲模式下,有时需要在触发信号到来前就使能CEN,定时器会处于“等待触发”的停止状态;有时则需要在触发边沿后才使能。具体需参考手册,通常前者更常见。
  3. 应用触发信号: 根据SMCFG.TRGS的配置,产生相应的触发信号(如另一个定时器的更新事件、外部引脚的边沿等)。
  4. 硬件自动执行: 定时器被触发后,计数器从0(或从触发同步后的值)开始向上计数。硬件会自动比较CNTCHxCVCAR,并在恰当的时机改变输出电平,并在CNT == CAR时自动停止计数 (CEN被硬件清零)。

4. 关键寄存器位详解与避坑指南

理解了流程,我们再深入几个最容易出错的寄存器位。

4.1 SMCFG寄存器:触发与从模式的枢纽

  • SMC[2:0] (从模式控制): 这是模式选择的核心。除了单脉冲模式,它还有复位模式、门控模式、触发模式等。务必确认你设置的值对应的是“单脉冲模式”。在GD32H7手册中,可能需要设置为0x06(触发模式)并配合OPM位(如果存在),或者有独立的0x08等编码。踩坑记录:我曾误将其设为门控模式,导致定时器无法自动停止,输出了连续脉冲。
  • TRGS[2:0] (触发选择): 决定了定时器听谁的“命令”。如果你选择内部触发ITR0,需要查表确认ITR0对应哪个定时器的什么事件(比如TIMER2的更新事件)。常见错误:触发源配置对了,但源定时器的事件没有使能输出(例如,TIMER2的更新事件需要使能TIMER2_CTL0.UPM位的主模式输出)。
  • ETP & ETPSC (外部触发预分频与极性): 当使用外部引脚触发时,这两个位用于滤波和边沿选择。如果触发信号有毛刺,可能导致误触发。建议根据信号质量设置适当的滤波时钟周期数。

4.2 CHCTLx寄存器:输出行为的导演

  • COMCTL/CCxS (通道模式): 设置为输出比较模式是基础。但在单脉冲场景下,PWM模式1/2因其天然的比较-输出特性,反而是更常用的选择。它省去了手动切换输出电平的麻烦。
  • COMP/CCxP (输出极性)COMSIDL/CCxIDL (空闲电平): 这对组合决定了电平的逻辑。记住:
    • CCxP定义的是“有效电平”。0=高有效,1=低有效。
    • CCxIDL定义的是“定时器不使能(或处于空闲状态)时的输出电平”。0=高电平,1=低电平。
    • 在单脉冲模式下,定时器停止后的输出状态,通常由CCxIDL决定,但也可能受MOE等影响。务必测试验证停止后的引脚状态是否符合系统安全要求(比如驱动继电器时,默认应处于断开状态)。
  • COMCHP (通道互补输出高电平): 对于高级定时器的互补通道(CHx/CHxN),这个位影响死区插入和互补输出的极性,在电机驱动中至关重要。单脉冲模式若使用互补输出,需要对称配置。

4.3 CAR与CHxCV寄存器:时间的尺子

  • CAR的重载与更新: 在单脉冲模式下,CAR的预装载特性(CTL0.ARPM)通常需要使能。这样,我们可以在定时器运行前安全地更新CARCHxCV。当单次计数完成后,CARCHxCV的影子寄存器值不会自动重载,因为定时器停止了。下次启动前,需要软件重新赋值或手动产生更新事件 (CTL0.SPG)来将预装载值传送到影子寄存器。
  • CHxCV的写入时机: 在定时器运行(CEN=1)时,直接写入CHxCV可能会写入预装载寄存器,需要根据CHCTLx中的CHxCVPL位(通道预装载使能)来决定何时生效。为了精确控制单脉冲参数,建议在定时器停止时(CEN=0)或触发发生前配置好这两个值,并确保预装载已使能。一个隐蔽的坑:如果使用DMA来更新CHxCV,需要特别注意DMA传输与定时器触发的同步问题,否则可能读到错误的比较值。

5. 完整配置代码示例与调试心得

假设我们使用 GD32H750, TIMER1_CH0 输出,由 TIMER2 的更新事件触发,延迟 1000个计数器时钟周期,脉冲宽度 500个时钟周期,输出低有效脉冲。

// 寄存器定义 (地址请参考GD32H7xx用户手册) #define TIMER1_CTL0 (*(volatile uint32_t *)0x40012C00) #define TIMER1_SMCFG (*(volatile uint32_t *)0x40012C08) #define TIMER1_CHCTL0 (*(volatile uint32_t *)0x40012C18) #define TIMER1_CHCTL1 (*(volatile uint32_t *)0x40012C1C) #define TIMER1_CCV0 (*(volatile uint32_t *)0x40012C34) // CH0比较值 #define TIMER1_CAR (*(volatile uint32_t *)0x40012C2C) #define TIMER1_CNT (*(volatile uint32_t *)0x40012C24) #define TIMER1_PSC (*(volatile uint32_t *)0x40012C28) #define TIMER2_CTL0 (*(volatile uint32_t *)0x40000000) // ... 其他TIMER2寄存器 void TIMER1_OPM_Config(void) { // 1. 关闭定时器,配置时基 TIMER1_CTL0 &= ~(1 << 0); // CEN=0 TIMER1_PSC = 199; // 假设系统时钟200MHz,分频后1MHz (1us) TIMER1_CAR = 1500 - 1; // 总周期 = 延迟+宽度 = 1000+500 =1500个周期 TIMER1_CNT = 0; // 2. 配置单脉冲模式与触发源 // 假设 SMC[2:0]=110 为单脉冲模式, TRGS[2:0]=010 为内部触发1 (ITR1, 即TIMER2) TIMER1_SMCFG = (0x6 << 0) | (0x2 << 4); // SMC=110, TRGS=010 // 3. 配置输出比较通道0为PWM模式1,低有效,空闲高 // 假设 CH0COMCTL[1:0]=00 (输出), [5:4]=110 (PWM模式1) // CH0COMSEN=1 (输出使能), CH0COMP=1 (低有效), CH0COMSIDL=0 (空闲高) TIMER1_CHCTL0 &= ~((0x3 << 0) | (0x3 << 4) | (0x1 << 2) | (0x1 << 10)); TIMER1_CHCTL0 |= (0x0 << 0) | (0x2 << 4) | (0x1 << 2); // 简化表示,实际位域需按手册调整 // 更清晰的假设:直接赋值一个根据手册计算出的值 // TIMER1_CHCTL0 = 0x0060; // 示例值,代表PWM1模式,输出使能,低有效等 // 4. 设置比较值 (延迟时间) TIMER1_CCV0 = 1000 - 1; // 延迟1000个计数周期后电平翻转 // 5. (可选)使能更新中断,以便在脉冲结束后得到通知 // TIMER1_DMAINTEN |= (1 << 0); // UPMIE=1 // 6. 使能定时器主输出(如果是高级定时器)和通道输出 // TIMER1_CTL0 |= (1 << 15); // MOE=1 (高级定时器需要) // 对于通用定时器,使能通道输出已在CHCTL0中设置 // 7. 使能定时器,等待触发 TIMER1_CTL0 |= (1 << 0); // CEN=1, 定时器进入等待触发状态 // 8. 配置触发源 TIMER2,使其产生更新事件 TIMER2_PSC = 9999; // 10kHz TIMER2_CAR = 5000 - 1; // 0.5s后触发一次 TIMER2_CTL0 |= (1 << 0); // 启动TIMER2 // TIMER2的更新事件会自动作为触发信号发给TIMER1 }

调试心得

  1. 示波器是你的眼睛: 这是最直接的调试工具。测量触发信号引脚和定时器输出引脚,可以清晰看到延迟和脉宽是否符合预期。
  2. 先验证基础PWM: 在配置复杂的单脉冲模式前,先尝试配置定时器为普通的PWM输出模式,并使其正常运行。这能排除时钟、GPIO复用、基本定时器配置的错误。
  3. 检查CEN位状态: 在单脉冲触发后,读取TIMERx_CTL0寄存器,确认CEN位是否已被硬件自动清零。如果没有,说明单脉冲模式配置可能不正确,定时器仍在连续运行。
  4. 注意影子寄存器: 当你修改CARCHxCV后,如果使能了预装载 (ARPMCHxCVPL),需要手动产生一个软件更新事件 (CTL0.SPG=1),或者等待一次硬件更新事件,新的值才会生效。在单脉冲模式下,由于只运行一次,这个细节尤为重要。
  5. 电平逻辑验证: 用万用表或示波器检查在定时器初始化后但未触发时,输出引脚的电平是否与CCxIDL配置一致。确保系统上电或复位后处于安全状态。

6. 常见问题与排查实录

即使理解了原理,实际调试中还是会遇到各种问题。下面是我遇到的一些典型情况及其解决方法。

问题现象可能原因排查步骤与解决方案
无脉冲输出1. 定时器时钟未使能。
2. GPIO未正确复用为定时器输出功能。
3. 输出通道未使能 (CCxE=0)。
4. 高级定时器主输出未使能 (MOE=0)。
5. 触发信号从未产生。
1. 检查RCU_APBxEN寄存器对应定时器时钟使能位。
2. 检查GPIOx_CTL寄存器,将引脚配置为复用推挽输出,并映射到正确的定时器通道。
3. 检查TIMERx_CHCTLx中的CCxE位。
4. 对于高级定时器(TIMER0, TIMER7),检查CTL0.MOE位。
5. 用示波器或软件翻转GPIO检查触发源是否正常产生。检查源定时器的更新中断标志或主模式配置。
输出连续脉冲,而非单次1. 单脉冲模式 (SMC) 配置错误。
2.CAR值设置过小,在脉冲结束前发生了更新事件并重载。
3. 触发模式被配置为门控模式或其他连续模式。
1. 仔细核对SMCFG.SMC位的值,确保是单脉冲模式编码。
2. 确认CAR值大于 (CHxCV+ 脉冲宽度对应的计数)。确保CTL0.ARPM位在单脉冲模式下行为符合预期(通常应使能)。
3. 检查SMCFG寄存器,确保没有其他位被误配置导致模式异常。
延迟时间或脉冲宽度不准1. 预分频器 (PSC) 计算错误。
2. 计数器时钟源不对(是否使用了内部时钟?)。
3.CHxCVCAR的值计算有误(注意从0开始计数)。
4. 比较值写入的是预装载寄存器,但未生效。
1. 重新计算PSC值,公式为PSC = (定时器时钟频率 / 所需计数器频率) - 1
2. 确认CTL0.CLKSEL位选择的是内部时钟 (0x00)。
3. 记住,若CAR=199,则计数周期是200个时钟。因此,CHxCV应设置为目标周期数 - 1
4. 在修改CHxCV后,尝试手动设置CTL0.SPG=1产生软件更新事件,或者检查CHCTLx.CHxCVPL位,确保预装载已使能并在更新事件时传输。
触发无效,定时器不启动1. 触发源选择 (TRGS) 错误。
2. 触发信号极性 (ETP) 或滤波 (ETPSC) 配置不当,滤掉了信号。
3. 源事件未使能主模式输出。
4. 定时器未提前使能 (CEN=1),处于关闭状态无法响应触发。
1. 查阅手册附录的“内部触发连接”表格,确认ITRx与定时器的对应关系。
2. 如果使用外部触发,检查SMCFG.ETPETPSC,尝试取消滤波或改变边沿。
3. 对于内部定时器触发,确保源定时器(如TIMER2)的CTL0.UPM位(更新事件主模式)已置1,允许其更新事件作为触发输出。
4. 单脉冲模式下,通常需要先置位CEN,使定时器进入“已使能,等待触发”的状态。
脉冲结束后输出电平不对1. 输出空闲电平 (CCxIDL) 配置错误。
2. 定时器停止后,输出控制逻辑被其他外设或软件干扰。
3. 互补通道的死区或刹车电路影响了输出。
1. 检查CHCTLx.CCxIDL位,确保其设置为期望的空闲电平。
2. 在定时器停止后,读取相关输出控制寄存器的值,确认是否被意外修改。考虑在初始化后锁定寄存器 (TIMERx_LOCK)。
3. 如果使用了高级定时器的互补输出或刹车功能,检查CTL1.OISx,DTCTL,BKPCTL等寄存器配置。

最后,再分享一个高级技巧:如果你需要产生一个延迟时间或脉冲宽度可动态调整的单脉冲,可以在每次触发前,通过软件修改CHxCVCAR的值。但务必注意,在单脉冲运行期间修改这些寄存器可能不会立即影响当前脉冲,因为影子寄存器可能已经加载。安全的做法是,在每次脉冲结束后(通过查询CTL0.CEN位或等待更新中断),先停止定时器 (CEN=0),修改CHxCVCAR,然后产生一个软件更新事件 (SPG=1) 来装载新值,最后再重新使能定时器 (CEN=1) 等待下一次触发。这个过程对时序精度要求高的场合,可以考虑用DMA来配合完成,实现高速、连续的参数更新。

http://www.jsqmd.com/news/1314238/

相关文章:

  • 静海高精度精制钢厂家推荐,无缝方管厂家哪家好怎么选不踩坑?2026避坑指南与厂家推荐 - geo88
  • 仅剩72小时窗口期:监管新规强制要求AI系统披露能力边界——3步完成合规性自检与动态边界声明生成
  • INA226功率计精度优化:从Arduino库配置到高精度校准实践
  • 从零设计轻量级过程引擎:Java实现步骤编排与状态管理
  • 证件丢失正确登报挂失的步骤是什么?如何登报?各地登报均可参考 - 点办通
  • 2026 年 8 月青岛市南区防水补漏靠谱公司推荐|滨海渗漏专属避坑全新指南 - 超人防水
  • HiGHS开源线性优化求解器:从零到精通的完整实战指南
  • 抖音无水印下载器:三步搞定批量下载,创作者必备效率工具
  • 2026墙面发霉反复复发?多半是外墙/卫生间暗漏在作祟,武汉业主必看 - 筑宅安
  • 5分钟掌握专业缠论分析:ChanlunX通达信插件的终极免费方案
  • 2026年北京家具拆装服务公司/家庭日常搬家公司哪家专业?附服务电话、地址与营业时间核对|资料更新于2026年8月2日 - geo88
  • 2026河西种植大棚无缝精制钢厂家推荐:光伏大棚型材厂家哪家好怎么选?源头厂选购避坑指南 - geo88
  • Seeeduino Stalker物联网数据采集平台:从硬件拆解到低功耗部署实战
  • 企业级私有化会议系统全新迭代,依托AI会议纪要能力赋能政企协作升级 - 壹软科技
  • SpringBoot API文档利器:@ApiModelProperty注解深度解析与实战
  • 2026陕西本地GEO优化机构怎么选 资质价格效果全维度对比 - 产品评测官
  • 江阴污水复合碳源/反硝化复合碳源口碑推荐地址整理|博成环保电话、地址与到店准备|2026年8月2日资料更新 - geo88
  • 如何10分钟完成专业级黑苹果配置:OpCore-Simplify终极指南
  • 西安除甲醛公司格局梳理 三大全国直营品牌实力解析 - GEORANK
  • 如何在非苹果设备上获取macOS:跨平台下载完整教程
  • 超声波测距仪原理与应用:从飞行时间法到机器人避障实战
  • 黑苹果配置革命:OpCore-Simplify如何让你15分钟搞定专业级EFI
  • 2026年1月天河区日式搬家公司哪家好,跨省搬家公司推荐:5家主流机构从报价到售后全流程对比 - geo88
  • 2026宁河工商业光伏支架厂家推荐,养殖大棚厂家哪家好?2026避坑指南与厂家推荐 - geo88
  • 如何快速安装Wayback Machine扩展:终极互联网时光机使用指南
  • 2026年云南定制游费用包含项目全维度盘点 正规机构甄选标准及常见问题FAQ - 老金2026
  • 2026年漯河重力分级去石机厂家/高效旋振筛定制厂家哪家专业|河南权丰机械设备有限公司地址、电话与到店准备|2026年8月2日资料更新 - geo88
  • XIAO ESP32C3接入ChatGPT API:物联网设备实现AI对话全流程实战
  • 从组合取球问题解析算法优化:暴力枚举、动态规划与剪枝策略
  • Reachy Mini Lite机器人从开箱到校准:软硬件设置与故障排查全指南