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

深入解析STM32定时器从模式:原理、实战与高级应用

1. 项目概述:为什么需要深入理解定时器从模式?

如果你用过STM32的定时器,大概率是从“主模式”开始的:配置一个ARR(自动重装载值)和一个PSC(预分频器),然后启动定时器,让它自己数数,数到ARR就产生一个更新事件或者中断。这就像你设置了一个闹钟,让它每隔固定时间响一次,简单直接。但STM32的定时器远不止于此,它的“从模式”功能,才是真正体现其灵活性和强大协同能力的地方。

想象一个场景:你需要精确测量一个外部信号的频率,或者需要让一个定时器的动作严格跟随另一个定时器的节奏,又或者需要用一个外部脉冲来精确复位你的定时器计数。这些需求,单靠一个定时器的主模式是难以优雅实现的。这时,定时器的“从模式”就登场了。它本质上是一种工作模式,允许一个定时器(称为“从定时器”)的时钟、启动、停止、复位等行为,不再仅仅由内部时钟源决定,而是受另一个定时器(称为“主定时器”)或外部引脚上的特定事件控制。这种主从联动,构建了STM32定时器系统内部精密的事件驱动网络。

对于嵌入式开发者,尤其是从事电机控制、数字电源、精密测量等领域的朋友,不理解从模式,就等于只用了定时器一半的功力。很多复杂的时序逻辑、同步需求,用从模式可以化繁为简,用纯硬件实现,不仅精度高,还能极大减轻CPU的中断负担。网络上很多关于PWM输入捕获、编码器接口、定时器级联的高级应用,其底层核心逻辑都离不开从模式。所以,今天我们就抛开简单的定时中断,深入STM32定时器的腹地,把“从模式”这个关键角色彻底讲透。

2. 定时器从模式的核心概念与工作机理

要理解从模式,必须先搞清楚几个核心概念:主定时器、从定时器、触发源和从模式本身。它们共同构成了一套事件响应体系。

2.1 主从定时器与触发源

在STM32中,并非所有定时器都能随意互为主从。它们通过内部的“触发控制器”连接。通常,高级定时器(如TIM1, TIM8)和通用定时器(如TIM2-TIM5)可以作为触发源输出,也可以配置为接收触发输入。基本定时器(如TIM6, TIM7)功能较少,一般只作为从定时器使用。

触发源是启动从定时器动作的“钥匙”。STM32定义了多种触发源:

  1. ITR0, ITR1, ITR2, ITR3: 内部触发输入。这是定时器之间直接连接的通道。例如,TIM2的TRGO(触发输出)可以连接到TIM3的ITR2输入,从而让TIM3以TIM2为触发源。具体的连接关系需要查阅芯片参考手册的“定时器内部触发连接”表格,不同系列和型号的STM32连接方式可能不同。
  2. TI1F_ED: TI1引脚上的边沿检测(上升沿和下降沿)。
  3. TI1FP1: 经过输入滤波和极性选择后的TI1引脚信号。
  4. TI2FP2: 经过输入滤波和极性选择后的TI2引脚信号。
  5. ETRF: 外部触发输入引脚(ETR)上的信号。

从定时器的工作,就由这些触发源信号来“指挥”。

2.2 六种从模式详解

STM32的从模式主要分为六种,通过配置从模式控制寄存器(SMCR)中的SMS位来选择。每种模式都定义了从定时器如何响应触发信号。

#### 2.2.1 复位模式(Reset Mode)

  • 模式值: SMS=0x100 (0x4)
  • 工作原理: 当有效的触发输入事件发生时,从定时器的计数器CNT立即被清零复位。同时,如果配置了预分频器为硬件复位模式,PSC的缓冲器也会被更新。之后,计数器从0开始重新向上计数。
  • 典型应用: 实现两个定时器的硬件同步启动。例如,主定时器TIM2产生一个更新事件作为触发输出,从定时器TIM3配置为复位模式并以TIM2为触发源。当TIM2第一次计数溢出时,TIM3的CNT被清零,两者从此保持确定的相位关系(通常TIM3滞后TIM2一个时钟周期),非常适合需要多个定时器严格同步的PWM生成场景。

#### 2.2.2 门控模式(Gated Mode)

  • 模式值: SMS=0x101 (0x5)
  • 工作原理: 从定时器的使能信号(CEN)受触发输入电平的控制。当触发输入为高电平时,计数器开始计数;当触发输入变为低电平时,计数器停止计数。触发输入的电平极性可以通过配置来反转。
  • 典型应用: 用于测量一个外部脉冲信号的有效宽度(高电平或低电平持续时间)。将被测信号连接到从定时器的触发输入引脚(如ETR),配置为门控模式。计数器只在信号有效期间计数,计数值乘以计数周期就是脉冲宽度。这种方法比用输入捕获中断更节省CPU资源。

#### 2.2.3 触发模式(Trigger Mode)

  • 模式值: SMS=0x110 (0x6)
  • 工作原理: 当有效的触发输入事件发生时,从定时器被启动(CEN位被硬件置位),开始计数。注意,它只响应触发信号的边沿。一旦启动,除非软件干预,否则会一直计数下去。
  • 典型应用: 用一个外部事件(如按键、传感器信号)来启动一个精确定时操作。比如,用外部引脚的一个上升沿来触发启动一个延时定时器。

#### 2.2.4 外部时钟模式1(External Clock Mode 1)

  • 模式值: SMS=0x111 (0x7)
  • 工作原理: 这是最常用的从模式之一。在此模式下,从定时器放弃使用内部时钟(CK_INT),而是将指定的触发输入信号作为自己的计数时钟(CK_PSC)。触发信号的每次有效边沿(可配置上升沿或下降沿)都会使计数器CNT加1(或减1)。
  • 典型应用
    • 脉冲计数: 直接对外部脉冲进行计数。
    • 频率测量: 结合另一个定时器(主模式)可以构建高精度频率计。让从定时器工作在外部时钟模式1,以待测信号为时钟;主定时器工作在标准定时模式,产生固定的闸门时间(例如1秒)。在闸门时间内,从定时器的计数值就是信号的频率。
    • 定时器级联: 将TIM2的溢出更新事件作为触发输出,连接到TIM3的外部时钟模式1输入。这样,TIM2每溢出一次,TIM3才计一个数。相当于将两个16位定时器级联成一个32位定时器,大大扩展了定时范围。

#### 2.2.5 编码器模式(Encoder Mode)

  • 模式值: SMS=0x011 (0x3) 等(具体模式与编码器类型有关)
  • 工作原理: 这是一种特殊的从模式,专为连接正交编码器设计。它同时使用TI1和TI2两个通道作为触发输入。根据两个信号的相位关系,硬件自动判断旋转方向,并相应地递增或递减计数器CNT。
  • 典型应用: 电机位置反馈。无需CPU干预,计数器值即代表电机的相对位置,方向代表正反转。这是无刷直流电机(BLDC)和伺服控制中的基石功能。

#### 2.2.6 组合模式某些模式可以组合使用。例如,复位模式 + 外部时钟模式1。先配置为复位模式,指定一个触发源用于同步复位;再通过配置,让另一个触发源作为外部时钟。这可以实现更复杂的同步计数逻辑。

注意: 从模式的配置有严格的顺序。通常需要先配置触发源(TS位),再选择从模式(SMS位),最后才使能定时器。顺序错误可能导致模式无法正常工作。

3. 从模式实战:以外部时钟模式1实现高精度频率测量

理论讲得再多,不如动手做一遍。我们用一个经典的“等精度测频”方案来实战从模式。这个方案能消除传统测频法在闸门时间与被测信号不同步时产生的±1个计数误差,精度更高。

3.1 方案设计与硬件连接

目标: 测量输入到TIM2_CH1(PA0引脚)上的方波信号频率。思路

  1. 从定时器(计数): TIM2配置为从模式-外部时钟模式1,触发源选择为TI1FP1(即通道1的输入)。这样,TIM2的计数器CNT的时钟就是待测信号本身,CNT值直接记录了在某个时间段内收到的脉冲个数。
  2. 主定时器(闸门): TIM3配置为主模式,产生一个非常精确的固定时间间隔(例如1秒)的更新事件。我们将TIM3的更新事件作为触发输出(TRGO)。
  3. 联动: 将TIM3的TRGO连接到TIM2的触发输入(通过内部线路,通常是ITRx)。但这里有个关键:我们不是用这个信号做TIM2的时钟,而是用它来同时启动和停止TIM2的计数。这需要一点技巧:利用TIM2的从模式门控模式来控制计数使能,而时钟源依然是TI1FP1。更常见的等精度测频实现会使用一个DMA请求,在TIM3的更新事件时,将TIM2的CNT值搬运到内存并清零TIM2。为了清晰展示从模式,我们采用一个简化但核心原理相同的流程:用TIM3的更新中断来读取并保存TIM2的CNT值。

简化硬件连接

  • 待测信号接 PA0 (TIM2_CH1)。
  • TIM2和TIM3内部通过触发控制器连接(例如,在F1系列中,TIM3的TRGO可连接到TIM2的ITR1)。

3.2 寄存器级配置步骤详解

我们以STM32F1系列为例,展示关键寄存器配置。使用库函数或HAL库的开发者,可以此为参照理解底层逻辑。

步骤1:配置TIM2(从定时器,用于脉冲计数)

  1. 将PA0引脚配置为复用功能上拉输入,映射到TIM2_CH1。
  2. 配置TIM2的时基单元通常不重要,因为时钟来自外部。但ARR可以设置为最大值0xFFFF,以获取最大计数范围。
  3. 配置输入捕获通道1(IC1):
    • CCMR1寄存器: 设置CC1S=01,将TI1映射到IC1。
    • CCER寄存器: 设置CC1P=0/1,选择TI1FP1的极性(上升沿/下降沿检测)。
    • SMCR寄存器: 这是核心!
      • TS[2:0]: 选择触发源。例如,选择110(TI1FP1)。
      • SMS[2:0]: 选择从模式。设置为111(外部时钟模式1)。
    • CR1寄存器: 最后,将CEN位置1,启动定时器。注意,在外部时钟模式1下,即使CEN=1,计数器也必须等到有效的触发边沿才会动作。

步骤2:配置TIM3(主定时器,用于产生闸门时间)

  1. 配置TIM3的时基单元。假设系统时钟72MHz,要产生1秒的更新事件。
    • 预分频PSC = 7200 - 1,使得计数器时钟为10kHz。
    • 自动重载值ARR = 10000 - 1,这样更新周期就是10000 / 10kHz = 1秒。
  2. 配置TIM3为主模式:
    • CR2寄存器: 设置MMS[2:0]=010,选择更新事件(UG)作为触发输出(TRGO)。
  3. 使能TIM3的更新中断,并在中断服务程序中读取TIM2->CNT的值。
  4. 启动TIM3。

3.3 核心代码与流程分析

// 简化版寄存器操作示例(基于STM32标准外设库思路) void FrequencyMeter_Init(void) { // 1. 初始化TIM2为外部时钟模式1 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIOA.0 作为 TIM2_CH1 输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 0xFFFF; // 最大计数 TIM_TimeBaseStructure.TIM_Prescaler = 0; // 不分频,时钟来自外部 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 配置输入通道1 TIM_ICInitTypeDef TIM_ICInitStructure; TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; // 检测上升沿 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 直接映射到TI1 TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x0; // 不滤波 TIM_ICInit(TIM2, &TIM_ICInitStructure); // 配置从模式:外部时钟模式1,触发源为TI1FP1 TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_External1); // 注意:标准库中TIM_SlaveMode_External1即对应外部时钟模式1 TIM_Cmd(TIM2, ENABLE); // 启动TIM2,等待外部时钟 // 2. 初始化TIM3为1秒定时器,并产生更新事件作为TRGO RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period = 10000 - 1; TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1; // 72MHz / 7200 = 10kHz TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 配置TIM3的更新事件作为主模式触发输出 TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update); // 使能TIM3更新中断 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); NVIC_EnableIRQ(TIM3_IRQn); TIM_Cmd(TIM3, ENABLE); // 启动TIM3 } volatile uint32_t pulseCount = 0; // TIM3 1秒更新中断服务程序 void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 在中断发生时,立即读取TIM2的计数值 pulseCount = TIM_GetCounter(TIM2); // 可选:清零TIM2计数器,开始下一个1秒的计数。 // 但注意,清零操作会丢失清零瞬间到下一个外部脉冲之间的时间。 // 更严谨的等精度测频需要更复杂的同步逻辑,如使用DMA或两个定时器交替。 TIM_SetCounter(TIM2, 0); } }

流程分析

  1. TIM2启动后,其计数器CNT在每个PA0引脚的上开沿加1。
  2. TIM3独立运行,每1秒产生一次更新中断。
  3. 在TIM3的中断里,我们读取过去1秒内TIM2累计的脉冲数pulseCount,这个值就是信号的频率(Hz)。
  4. 将TIM2计数器清零,开始下一个测量周期。

实操心得: 上述简化方法在中断响应和清零操作期间会引入微小误差。对于追求极限精度的场合,标准的等精度测频会使用TIM3的更新事件同时触发一个DMA请求,该DMA请求将TIM2的CNT值读取到内存并立即将TIM2的CNT清零。这个过程完全由硬件完成,不受软件中断延迟影响,实现了真正的“同步”采样和清零,精度仅取决于基准时钟(TIM3的时钟)的稳定性。

4. 从模式在高级应用中的实战技巧与避坑指南

掌握了基本模式后,我们来看看如何将它们组合起来,解决更复杂的工程问题,并分享一些容易踩坑的细节。

4.1 高级应用场景:互补PWM与死区插入的同步

在电机驱动和全桥电源电路中,经常需要生成两组互补的PWM信号(例如,控制一个桥臂的上管和下管),并且中间必须插入死区时间,防止上下管直通。使用STM32的高级定时器(如TIM1)可以方便地生成带死区的互补PWM。但如果有多个桥臂需要同步呢?比如三相逆变器。

这时,从模式就派上用场了。我们可以配置一个定时器(如TIM1)作为主定时器,生成第一组互补PWM。然后配置另一个定时器(如TIM8)为从模式,触发源选择TIM1的TRGO,模式选择为复位模式

工作流程

  1. TIM1的计数器运行,在其更新事件时,会输出一个触发信号(TRGO)。
  2. 这个触发信号连接到TIM8的ITRx输入。
  3. TIM8配置为复位模式,因此每当收到TIM1的更新触发时,TIM8的计数器CNT就被清零。
  4. 由于TIM1和TIM8使用相同的内部时钟(APB2),且TIM8的ARR、PSC与TIM1设置相同,那么TIM8的PWM输出就会与TIM1的PWM输出保持完全同步,仅有一个时钟周期的固定相位差。

这样,我们就用硬件实现了多组PWM的严格同步,CPU无需干预。所有定时器的PWM周期和占空比都由主定时器TIM1的参数决定,修改起来非常集中。

4.2 常见问题排查与调试技巧

从模式配置相对复杂,出问题时可以从以下方面排查:

问题1:从定时器根本不计数。

  • 检查触发源路径: 这是最常见的问题。确认主定时器的触发输出(TRGO)是否已正确使能(CR2.MMS)。确认从定时器的触发输入选择(SMCR.TS)是否与芯片手册中定义的内部连接一致。例如,想让TIM3以TIM2为触发源,需要查表确认TIM2的TRGO对应TIM3的ITR几,然后正确设置TS位。
  • 检查从模式是否使能: 确认SMCR.SMS位已设置为正确的从模式值(非000)。
  • 检查时钟和引脚: 如果使用外部引脚作为触发源(如ETR、TIx),确保对应GPIO已正确配置为复用功能或外部中断模式,并且信号确实存在。
  • 检查定时器使能顺序: 通常建议先使能从定时器(CEN=1),再使能主定时器。对于某些模式(如门控模式),从定时器需要先处于“准备”状态。

问题2:计数不准或行为异常。

  • 检查滤波和极性: 如果使用引脚输入作为触发源,检查输入捕获通道的滤波器(ICx_F)和极性(CCxP)设置。过强的滤波可能滤掉高频信号,错误的极性会检测不到边沿。
  • 检查从模式与触发源的匹配: 例如,将“外部时钟模式1”的触发源错误地设置为另一个定时器的更新事件,而该事件频率很低,那么从定时器就会“慢吞吞”地计数。
  • 注意影子寄存器: 在复位模式下,如果修改了从定时器的ARR值,需要确保产生了更新事件(或手动产生UG事件)来将影子寄存器更新到实际寄存器,否则同步可能出错。

问题3:如何验证触发信号是否送达?

  • 使用调试器: 在调试模式下,查看从定时器SMCR寄存器的TRGI位(触发输入标志)。当主定时器产生触发事件时,该位会被硬件置1。这是一个非常重要的调试标志。
  • 利用从模式状态: 有些从模式(如门控模式)下,从定时器的状态位(SR寄存器)会反映触发输入的电平。
  • 引脚输出: 可以将主定时器的某个通道配置为PWM输出模式,并将其映射到TRGO(通过MMS选择),这样就能用示波器在对应引脚上直接看到触发信号,非常直观。

4.3 寄存器操作与库函数选择的权衡

很多初学者依赖HAL库或标准外设库,但对于定时器从模式这类复杂功能,我强烈建议在理解寄存器操作的基础上再使用库函数。原因如下:

  1. 库函数可能封装过度: 一些库函数为了通用性,会在配置过程中修改多个关联寄存器,可能会无意中清除你之前精心设置的其他位。例如,调用TIM_ICInit()可能会影响SMCR寄存器的部分位。
  2. 调试困难: 当从模式不工作时,如果你只调用了HAL_TIM_SlaveConfigSynchronization()这样的高级函数,很难单步跟踪到底层寄存器是如何被设置的。而直接操作寄存器,你可以清晰地看到每一步配置对应的比特位。
  3. 灵活性受限: 某些特殊的组合模式或边缘用例,库函数可能没有提供直接的接口。

我的建议是:先用库函数快速搭建原型,验证基本功能。一旦遇到问题或需要优化性能,立即切换到查阅参考手册,直接操作寄存器来精确控制。你可以把库函数的源代码当作最好的学习资料,看看ST的工程师是如何配置这些寄存器的。

例如,标准库中配置从模式的函数TIM_SelectSlaveMode()TIM_SelectInputTrigger(),其内部实现就是直接对SMCR寄存器进行位操作。理解了这个,你就能在需要时绕过库函数,写出更高效、更可靠的代码。

// 直接寄存器操作示例:将TIM2配置为以TI1FP1为时钟的外部时钟模式1 TIM2->SMCR &= ~(TIM_SMCR_SMS); // 清零SMS位 TIM2->SMCR |= TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0; // SMS=111, 外部时钟模式1 TIM2->SMCR &= ~(TIM_SMCR_TS); // 清零TS位 TIM2->SMCR |= TIM_SMCR_TS_2 | TIM_SMCR_TS_1; // TS=110, 选择TI1FP1作为触发输入 // TIM_SMCR_TS_2等宏定义需要根据具体芯片的头文件确定

5. 从模式与其他外设的协同:构建硬件自动化流水线

STM32的从模式之美,不仅在于定时器之间的联动,更在于它能与DMA、ADC等外设组成全硬件的自动化处理流水线,将CPU彻底解放出来。

5.1 与DMA的联动:实现无CPU干预的数据搬运

这是从模式最强大的应用之一。我们延续第3章的频率测量例子,实现一个真正的等精度频率计。

方案升级

  1. TIM2(从定时器)配置不变(外部时钟模式1,计数外部脉冲)。
  2. TIM3(主定时器)配置不变(1秒定时,更新事件作为TRGO)。
  3. 关键一步:配置DMA。将TIM3的更新事件(不是中断,而是DMA请求)与DMA通道关联。
  4. 设置DMA的传输方向为从外设(TIM2的CNT寄存器地址)到内存(一个数组),传输数据宽度为半字(16位定时器)。
  5. 配置DMA为循环模式,并使能DMA传输完成中断

工作流程

  1. TIM3每1秒产生一个更新事件。
  2. 该更新事件同时触发两件事:
    • a) 作为TIM2的触发源(如果配置了某种同步模式),但这里我们主要用它来触发DMA。
    • b) 向DMA控制器发出请求。
  3. DMA收到请求后,自动将TIM2->CNT的当前值搬运到指定的内存数组中。
  4. 搬运完成后,DMA可以在中断里通知CPU,或者由CPU定期去检查内存数组。更重要的是,在DMA传输完成后,可以在中断服务程序里安全地清零TIM2->CNT,或者通过配置TIM2为复位模式,用TIM3的更新事件来硬件清零TIM2的CNT。
  5. 整个过程,CPU只在DMA传输完成中断中处理一下数据(比如计算频率),或者完全不用处理,由后台任务读取数组即可。测量间隔内没有软件延迟,精度达到硬件极限。

5.2 与ADC的联动:实现精准的定时采样

在需要周期性采集模拟信号的系统中(如音频处理、电源监控),通常需要ADC以固定频率采样。用定时器触发ADC是最佳实践。

典型配置

  1. 选择一个通用定时器(如TIM2),配置为普通PWM模式或输出比较模式,产生一个固定频率的脉冲(比如10kHz的PWM或OCREF信号)。
  2. 配置该定时器为主模式,将其更新事件或比较匹配事件作为触发输出(TRGO)。
  3. 配置ADC(如ADC1)为外部触发模式,触发源选择为该定时器的TRGO事件。
  4. 同时,可以启用ADC的DMA功能,让ADC每完成一次转换,就通过DMA将数据存入内存。

这样,一个由定时器驱动的、ADC采样到DMA存储的完整硬件流水线就搭建好了。CPU只需要在DMA缓冲区满时处理一批数据即可,采样间隔由定时器硬件保证,极其精准和稳定。这里的定时器是“主”,ADC是“从”(受定时器触发),而DMA又是ADC的“从”(受ADC转换完成触发),形成了一个高效的硬件事件链。

5.3 设计模式:硬件状态机思维

理解并熟练运用从模式,要求开发者具备一种“硬件状态机”的思维。你需要将系统功能拆解成一系列由事件驱动的状态转换:

  • 事件: 定时器溢出、比较匹配、外部引脚边沿、ADC转换完成、DMA传输完成等。
  • 动作: 启动/停止计数器、产生中断、触发DMA、复位计数器、切换输出引脚等。

你的任务不再是编写代码去轮询或延时,而是正确地配置这些硬件模块,将它们的事件输出和动作输入通过内部总线或触发线连接起来。STM32的参考手册中通常会有一张“定时器内部触发连接图”,这就是你的硬件编程“接线图”。

例如,要实现一个“收到外部启动信号后,延迟一段精确时间再输出一个脉冲”的功能,传统软件方式需要中断和忙等。硬件方式则可以:

  1. 外部启动信号连接到定时器A的ETR引脚,配置A为触发模式(Trigger Mode),该信号上升沿启动定时器A。
  2. 定时器A配置为单脉冲模式(One-pulse mode),产生一个宽度为所需延迟时间的脉冲。
  3. 定时器A的更新事件(脉冲结束)作为触发输出,连接到定时器B的触发输入。
  4. 定时器B配置为门控模式(Gated Mode),受A的更新事件控制。当A的脉冲结束时,启动B。
  5. 定时器B配置为PWM模式或单脉冲模式,产生最终需要的输出脉冲。

整个过程由硬件自动完成,延迟精度仅取决于时钟精度,与CPU负载和中断响应时间无关。这种设计思路,是提升嵌入式系统实时性、可靠性和能效的关键。从模式,就是实现这种硬件自动化的核心工具。当你开始以这种视角看待STM32的外设时,你会发现一片全新的、充满可能性的天地。

http://www.cnnetsun.cn/news/3721682.html

相关文章:

  • Python实战网格交易策略:从核心原理到实盘部署的完整指南
  • 基于Dify与RAG技术构建游戏智能助手实战指南
  • 卡尔曼滤波与扩展卡尔曼滤波:从原理到工程实践详解
  • MATLAB数学实验报告:从课程作业到工程项目的思维跃迁
  • Java原生HttpURLConnection对接企业微信API:轻量级打卡数据拉取实战
  • LTE Cat 1bis模块与PIC18微控制器的物联网应用方案
  • Python批量处理PDF文档:自动化关键词统计与文本分析实战
  • 猜数字游戏:Python实现与核心算法解析
  • NBM7100A双级DC-DC架构在物联网低功耗设计中的应用
  • linux之vim编辑器
  • 通达信高胜率量化策略开发指南
  • STM32 ADC从原理到实战:精度优化、DMA配置与调试技巧全解析
  • 增程式电动汽车Simulink建模与性能仿真实践
  • Python--包/模块/第三方库
  • 仿BOSS招聘平台实现(5)
  • MATLAB大型方程组求解:LU、QR与Cholesky分解原理与工程实战
  • 如何快速掌握小红书数据采集:Python开发者的完整指南
  • 3D打印技术如何为视障儿童创造可触摸的教育世界
  • STM32 ADC从原理到实战:高精度数据采集与DMA应用详解
  • XSS主动防御:构建实时监控与响应系统的工程实践
  • 整理抖音长视频要点太慢不会梳理?试试实用的抖音视频总结方法
  • 物联网设备安全连接方案:PIC18与A5000硬件加密实践
  • 西门子PLC与组态王在水泥生产线称重控制中的应用
  • 上海、安徽、浙江、江苏制造业智能仓储服务商选型指南与主流方案解析
  • 自适应遗传算法在分布式电源优化配置中的应用
  • 03-特性与参数
  • dvwa之weak session ids
  • 瓷砖一线高端品牌金丝玉玛,一块K金砖为什么让人排队看
  • Simulink与CarSim联合仿真:驾驶员模型方向盘转角控制全解析
  • c语言学习:循环嵌套与数组