我是这样理解定时器的,定时器的定时功能就是定时器内部自己产生波形进行定时,定时器的输出比较就是定时器把产生的波形通过引脚输出给了外部设备,并且这个波形不一定非得是方波,可以调节占空比。我是这样理解输入捕获的,外部设备比如某一个信号源会产生波形,然后把这个信号源送入stm32的某一个引脚,这个引脚就可以通过输入捕获的方式去测量信号源发出的信号,至于怎么测就是我把定时器配置成输入捕获的模式,然后设置一些特定的参数就可以,这样就是输入捕获。这就是我目前对定时器的理解。

输出比较

输入捕获是要在输出比较的基础之上去理解的。

定时器之所以能够实现定时就是因为定时器其实就是一个计数器,这个计数器可以产生波形用来计时,最关键的就是这个计数器就是CNT,所以我感觉定时器最重要的部分就是CNT。

捕获/比较寄存器是输入捕获和输出比较共用的,当使用输入捕获时,他就是捕获寄存器。  当使用输出比较时,他就是比较寄存器。在输出比较中,会比较CNT和CCR的值,CNT计数自增,CCR是我们给定的一个值,当CNT大于CCR、小于CCR或等于CCR时,输出就会对应的置0、1。4个通道有各自的CCR寄存器,但是他们是共用一个CNT计数器的。

使用PWM波形是用来等效的实现一个模拟信号的输出。

分辨率就是用来决定当我的占空比想要设置50%时,我的ccr的值应该是多少,ARR越大50%占空比的误差就越小,分辨率就越高。

PWM的频率=计数器的更新频率=定时器时钟源频率/预分频器PSC+1/自动装载值ARR+1

高级定时器的输出比较通道

我驱动H桥电机的时候可以使用高级定时器,使用高级定时器的时候会用到一个通道,高级定时器的一个通道就可以去控制电机的正转和反转。也可以使用基本定时器,但是使用基本定时器会用到两个通道,分别去控制电机的正反转。

定时器基本定时的功能

在我的代码当中没有开启NVIC标志位,但这个中断请求不会被CPU接收,因此不会跳转到中断服务函数去执行我的操作。只有当我开启了NVIC,这个硬件事件才会触发CPU去执行中断函数。所以说定时器溢出中断产生的标志位。

定时时长:总结一下,就是我现在让外部时钟产生72兆Hz的脉冲波。现在的情况就是外部时钟会源源不断的产生脉冲波,然后让定时器的CnT进行计数,因为定时器是16位的,所以最大的arr二只能是65536,假如没有对定时器进行分屏的话就是会以72兆Hz的频率去计数这个时候我的计数器会每秒计数72000000个,假如我对他进行2分频的话,我的计数器就会每秒计36000000,这样我的速度就会比原来慢二倍,但是我的arr的值还是那些。想要计数的脉冲是不变的,但是我的速度慢了二倍。所以用的时间就会长二倍,这样就可以实现定时多二倍。 

频率最小取倒数之后时间就是最大的,72M/65536/65536这是最慢的频率       

定时器级联:总结一下就是对于第一个定时器,当第一个定时器进行2分频,捕获到72兆Hz外部时钟源的第二个上升沿的时候,第一个定时器就会计数一,假设第一个定时器会用5秒的时间溢出,那么第二个定时器检测到第一个定时器溢出,就是相当于第一个定时器检测到了外部时钟源的第二个上升沿,假设没有对溢出进行分屏的话,那么定时的时间就是5×65536,假如对溢出进行分频的话,并且假设是2分频,定时的时间就会是5*2*65536。         

时基单元:定时器当中的时基单元就是用来计数的,只要是用到了定时器,不管你使用到了定时器的计时功能还是输入捕获功能,还是输入比较功能,都得要这个时基单元进行计数。 时基单元(就是那个计数器CNT)是定时器的心脏,是所有高级功能(PWM、输入捕获、输出比较)的基石。定时器进行定时的功能的时候,cnt就是在加1+1这样的。在定时器进行输出比较功能的时候cnt就是当CT加到特定的数值的时候,波形就会改变。

基本定时器       

 主从触发DAC:它能让内部硬件在不受程序的控制下实现自动运行,会极大减轻CPU的负担,在使用DAC的时候可能会用DAC输出一段波形,那就需要每隔一段时间来触发一次DAC,让它输出下一个电压点,如果按正常思路实现的话,就是先设置一个定时器产生中断,每隔一段时间在中断程序中调用代码手动触发一次DAC转换,然后DAC输出,这样会使主程序处于频繁被中断的状态,会影响主程序的运行和其他中断的响应。使用主模式可以把定时器的更新事件映射到触发输出TRGO的位置,然后TRGO直接接到DAC的触发转换引脚上,这样定时器的更新就不需要再通过中断来触发DAC转换了,整个过程不需要软件的参与,实现了硬件的自动化

通用定时器       

简单定时器级联       

       

比如可以先初始化TIM3,然后使用主模式把他的更新事件映射到TRGO上,接着再初始化TIM2,选择的是ITR2,对应的就是TIM3的TRGO,然后后面再选择时钟为外部时钟模式1,这样TIM3的更新事件就可以驱动TIM2的实际单元,也就实现了定时器的级联

定时器级联代码的实现
#include "stm32f10x.h"

/**
  * @brief  初始化TIM3作为主定时器,产生更新事件到TRGO
  * @note   TIM3的更新事件将作为TIM2的时钟源
  */
void TIM3_Master_Config(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    
    // 开启TIM3时钟(APB1总线,最大时钟频率72MHz)
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    
    // TIM3基本配置
    TIM_TimeBaseInitStructure.TIM_Period = 999;          // 自动重装载值,计数到999产生更新事件
    TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;      // 预分频器,7200分频
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;  // 时钟分频,不分频
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;  // 向上计数模式
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; // 重复计数器(高级定时器用)
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);  // 初始化TIM3时基单元
    
    // 配置TIM3为主模式,将更新事件映射到TRGO(触发输出)
    // TRGO信号将连接到TIM2的触发输入
    TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);
    
    // 使能TIM3计数器开始工作
    TIM_Cmd(TIM3, ENABLE);
}

/**
  * @brief  初始化TIM2作为从定时器,使用TIM3的TRGO作为时钟源
  * @note   TIM2工作在从模式,时钟由TIM3的更新事件提供
  */
void TIM2_Slave_Config(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    
    // 开启TIM2时钟(APB1总线)
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    
    // TIM2基本配置
    TIM_TimeBaseInitStructure.TIM_Period = 65535;        // 最大自动重装载值,提供更长的定时周期
    TIM_TimeBaseInitStructure.TIM_Prescaler = 0;         // 预分频器为0,不分频
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;  // 时钟分频,不分频
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;  // 向上计数模式
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; // 重复计数器
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);  // 初始化TIM2时基单元
    
    // 选择ITR2作为触发输入(TIM3的TRGO对应内部触发输入ITR2)
    // ITR2是TIM2的内部触发源2,对应TIM3的TRGO输出
    TIM_SelectInputTrigger(TIM2, TIM_TS_ITR2);
    
    // 设置TIM2为从模式,选择外部时钟模式1
    // 在此模式下,TIM2使用TIM3的TRGO作为时钟源
    TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_External1);
    
    // 使能TIM2计数器开始工作
    TIM_Cmd(TIM2, ENABLE);
}

/**
  * @brief  配置TIM2更新中断
  * @note   当TIM2计数溢出时会产生更新中断
  */
void TIM2_Interrupt_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    
    // 配置NVIC(嵌套向量中断控制器)
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;      // TIM2中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  // 抢占优先级0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;   // 子优先级1
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      // 使能该中断通道
    NVIC_Init(&NVIC_InitStructure);                      // 初始化NVIC
    
    // 使能TIM2更新中断(当计数器溢出时产生中断)
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
}

/**
  * @brief  主函数
  * @note   程序入口,初始化系统后进入主循环
  */
int main(void)
{
    // 系统时钟初始化(根据实际配置,通常设置为72MHz)
    SystemInit();
    
    // 先初始化主定时器TIM3(必须先初始化主定时器)
    TIM3_Master_Config();
    
    // 再初始化从定时器TIM2(TIM2依赖TIM3的触发信号)
    TIM2_Slave_Config();
    
    // 如果需要中断,配置TIM2中断
    TIM2_Interrupt_Config();
    
    // 主循环
    while(1)
    {
        // 此处可以添加其他应用程序代码
        // TIM2的中断服务函数会处理定时事件
    }
}

/**
  * @brief  TIM2中断服务函数
  * @note   当TIM2发生更新中断时自动调用此函数
  */
void TIM2_IRQHandler(void)
{
    // 检查是否是更新中断(计数器溢出)
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
    {
        // 处理TIM2更新事件
        // 这里可以添加你的处理代码,例如:
        // - 翻转LED灯
        // - 执行定时任务
        // - 更新显示内容等
        
        // 清除TIM2更新中断标志位
        // 注意:必须清除标志位,否则会持续进入中断
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    }
}

/**
  * 定时器级联工作原理说明:
  * 
  * 1. TIM3配置:
  *    - 时钟源:内部时钟(72MHz)
  *    - 分频:7200分频 → 10kHz
  *    - 周期:1000次计数 → 更新频率10Hz(100ms一次)
  *    - 每次更新事件产生TRGO输出
  * 
  * 2. TIM2配置:
  *    - 时钟源:TIM3的TRGO(10Hz)
  *    - 不分频,直接计数
  *    - 周期:65536次计数 → 约6553.6秒溢出一次
  * 
  * 3. 级联效果:
  *    - TIM3每100ms产生一次更新事件
  *    - 每个更新事件使TIM2计数一次
  *    - TIM2约每6553.6秒产生一次更新中断
  *    - 实现了长周期定时功能
  */

外部时钟模式1:

用内部时钟初始化代码:                                                                                                                   
/**
  * @brief  配置TIM3使用内部时钟源,并初始化基本参数
  * @param  无
  * @retval 无
  */
void TIM3_InternalClock_Config(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    
    // 1. 开启TIM3的时钟(挂在APB1总线上)
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    
    // 2. 配置定时器基本参数
    TIM_TimeBaseInitStructure.TIM_Period = 999;                // 自动重装载值 (ARR),计数到1000(0-999)产生更新
    TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;            // 预分频器 (PSC),7200分频
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频,与内部时钟无关,用于滤波器
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;       // 重复计数器(高级定时器特有,通用定时器写0即可)
    
    // 【核心】此函数调用后,TIM3默认就使用内部时钟源,但计数器还未启动
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); // 修正:参数前应加&
    
    // 3. (可选)清除更新中断标志,避免首次进入中断
    TIM_ClearFlag(TIM3, TIM_FLAG_Update);
    
    // 4. 使能TIM3的计数器,定时器开始根据内部时钟计数
    TIM_Cmd(TIM3, ENABLE);
}
定时器输入通道1(TI1FP1):
/**
  * @brief  配置TIM3使用外部时钟模式1,时钟源为TI1FP1(TIM3_CH1引脚)
  * @param  无
  * @retval 无
  */
void TIM3_ExternalClock_TI1_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_ICInitTypeDef TIM_ICInitStructure;
    
    // 1. 开启时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // TIM3时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIOA时钟(TIM3_CH1在PA6引脚)
    
    // 2. 配置GPIO引脚:PA6作为TIM3_CH1输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;       // TIM3_CH1对应PA6引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;   // 下拉输入(根据外部信号选择)
    // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入也可用
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 3. 初始化定时器基本参数(注意:此时钟参数基于外部时钟计算)
    TIM_TimeBaseInitStructure.TIM_Period = 0xFFFF;        // 自动重装载值,根据需要设置
    TIM_TimeBaseInitStructure.TIM_Prescaler = 0;          // 预分频器,不分频(每个外部脉冲计数1次)
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;  // 高级定时器用,TIM3写0
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
    
    // 4. 配置输入通道1(建立TI1到TI1FP1的信号路径)
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;      // 通道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(TIM3, &TIM_ICInitStructure);
    
    // 5. 【核心配置】选择触发源为TI1FP1
    TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);
    
    // 6. 【核心配置】设置为外部时钟模式1
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_External1);
    
    // 7. 使能定时器(开始等待外部时钟脉冲)
    TIM_Cmd(TIM3, ENABLE);
}
定时器的TRGO作为时钟源:
         
/**
  * @brief  配置TIM2为主定时器,产生TRGO信号
  * @param  无
  * @retval 无
  */
void TIM2_Master_Config(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    
    // 1. 开启TIM2时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    
    // 2. 配置TIM2基本参数(使用内部时钟)
    TIM_TimeBaseInitStructure.TIM_Period = 999;          // 自动重装载值
    TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;      // 预分频器,72MHz/7200=10kHz
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    
    // 3. 【关键】配置TIM2为主模式,将更新事件映射到TRGO输出
    TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
    
    // 4. 使能TIM2
    TIM_Cmd(TIM2, ENABLE);
}

/**
  * @brief  配置TIM3为从定时器,使用TIM2的TRGO作为时钟源
  * @param  无
  * @retval 无
  */
void TIM3_Slave_Config(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    
    // 1. 开启TIM3时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    
    // 2. 配置TIM3基本参数(参数基于TRGO频率计算)
    TIM_TimeBaseInitStructure.TIM_Period = 99;           // 自动重装载值
    TIM_TimeBaseInitStructure.TIM_Prescaler = 0;         // 预分频器,不分频
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
    
    // 3. 【关键】选择内部触发源ITR
    // 需要查阅芯片数据手册的"内部触发连接"表
    // 对于STM32F1,TIM2的TRGO通常连接到TIM3的ITR0
    TIM_SelectInputTrigger(TIM3, TIM_TS_ITR0);
    
    // 4. 【关键】设置为外部时钟模式1
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_External1);
    
    // 5. 使能TIM3(开始等待TIM2的TRGO脉冲)
    TIM_Cmd(TIM3, ENABLE);
}

/**
  * @brief  主函数中调用顺序
  */
int main(void)
{
    // 初始化系统时钟等...
    
    TIM2_Master_Config();    // 先配置主定时器
    TIM3_Slave_Config();     // 再配置从定时器
    
    while(1)
    {
        // 可以通过读取TIM3->CNT来验证计数
    }
}
定时器输入通道2(TI2FP2)
/**
  * @brief  配置TIM3使用外部时钟模式1,时钟源为TI2FP2(TIM3_CH2引脚)
  * @param  无
  * @retval 无
  */
void TIM3_ExternalClock_TI2_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_ICInitTypeDef TIM_ICInitStructure;
    
    // 1. 开启时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // TIM3时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIOA时钟(TIM3_CH2在PA7引脚)
    
    // 2. 配置GPIO引脚:PA7作为TIM3_CH2输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;       // TIM3_CH2对应PA7引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;   // 下拉输入(根据外部信号选择)
    // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入也可用
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 3. 初始化定时器基本参数
    TIM_TimeBaseInitStructure.TIM_Period = 0xFFFF;        // 自动重装载值
    TIM_TimeBaseInitStructure.TIM_Prescaler = 0;          // 预分频器,不分频
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
    
    // 4. 配置输入通道2(建立TI2到TI2FP2的信号路径)
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;      // 【改为通道2】
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; // 选择上升沿有效
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 直接映射到TI2输入
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 不分频
    TIM_ICInitStructure.TIM_ICFilter = 0x0;               // 不滤波
    TIM_ICInit(TIM3, &TIM_ICInitStructure);
    
    // 5. 【核心改变】触发源改为TI2FP2
    TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);
    
    // 6. 设置为外部时钟模式1
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_External1);
    
    // 7. 使能定时器
  外部触发输入(ETR):
/**
  * @brief  配置TIM3使用外部时钟模式2,时钟源为ETR引脚
  * @param  无
  * @retval 无
  */
void TIM3_ExternalClock_ETR_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    
    // 1. 开启时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // TIM3时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOB时钟(TIM3_ETR在PB5引脚,以STM32F103为例)
    
    // 2. 配置GPIO引脚:PB5作为TIM3_ETR输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;       // TIM3_ETR对应PB5引脚(请查阅具体芯片数据手册)
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
    // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入(根据外部信号驱动能力选择)
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    // 3. 初始化定时器基本参数
    TIM_TimeBaseInitStructure.TIM_Period = 0xFFFF;        // 自动重装载值
    TIM_TimeBaseInitStructure.TIM_Prescaler = 0;          // 预分频器,ETR脉冲直接驱动计数器
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
    
    // 4. 【核心配置】配置ETR引脚参数
    // 参数:定时器,ETR预分频器,ETR极性,ETR滤波器
    TIM_ETRClockMode2Config(TIM3, 
                           TIM_ExtTRGPSC_OFF,      // ETR预分频器:关闭(每个ETR脉冲计数1次)
                           TIM_ExtTRGPolarity_NonInverted, // ETR极性:不反相(上升沿有效)
                           0x0);                   // ETR滤波器:不滤波
    
    // 5. 使能定时器(开始等待ETR引脚脉冲)
    TIM_Cmd(TIM3, ENABLE);
}

 注意:   我要是想用内部时钟的话,只需要软件上进行配置就可以,但是我想要外部时钟的话,比如etr2的话,就需要在某一个引脚上面去。传递脉冲波,还有就是输入捕获通道一的话,也得给这个通道一传递一个脉冲波,这时候定时器才能进行开启时钟。外部模式1的情况中   定时器输入通道1(TI1FP1)  、定时器输入通道2(TI2FP2)    外部触发输入(ETR)是需要用到外部的引脚的,但是定时器的TRGO作为时钟源时内部连接的,用不到引脚。           

高级定时器         

预分频时序

  公式

            

Logo

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

更多推荐