基本模式设置

  • Slave Mode: Disable - 定时器独立工作,不作为从定时器
  • Trigger Source: Disable - 不使用外部触发源,用于定时器同步
  • Clock Source: Disable - 使用内部时钟源

通道配置

  • Channel1: PWM Generation CH1 - 通道1配置为PWM输出模式
  • Channel2: PWM Generation CH2 - 通道2配置为PWM输出模式(新增)
  • Channel3: Disable - 通道3未启用
  • Channel4: Disable - 通道4未启用

高级功能(新增部分)

  • Combined Channels: Disable - 组合通道功能未启用
  • Use ETR as Clearing Source: 未勾选 - 不使用外部触发作为清零源
  • XOR activation: 未勾选 - 不启用异或功能
  • One Pulse Mode: 未勾选 - 不使用单脉冲模式

Counter Settings(计数器设置)

  • Prescaler (PSC - 16 bits value)

    • 作用:预分频器,决定计数器时钟频率
    • 计算:定时器频率 = 系统时钟 / (PSC + 1)
    • 72-1:意味着72MHz系统时钟被分频为1MHz
    • 公式:72MHz / (72-1+1) = 1MHz
  • Counter Mode

    • 作用:计数方向
    • Up:向上计数(0→ARR)
    • Down:向下计数(ARR→0)
    • Center Aligned:中心对齐模式
  • Counter Period (AutoReload Register - 16 bits value)

    • 作用:自动重装载值,决定PWM频率
    • 计算:PWM频率 = 定时器频率 / (ARR + 1)
    • 65535:最大16位值,PWM频率 = 1MHz / 65536 ≈ 15.26Hz
  • Internal Clock Division (CKD)

    • 作用:内部时钟分频,主要用于滤波
    • No Division:不分频
    • 用途:影响输入捕获的数字滤波器
  • auto-reload preload

    • 作用:自动重装载预装载使能
    • Enable:ARR值在更新事件时才生效
    • Disable:ARR值立即生效

Trigger Output (TRGO) Parameters(触发输出参数)

1. Master/Slave Mode (MSM bit): Disable
  • 作用:主从模式位,用于定时器同步
  • Enable:延迟触发输出直到下一个更新事件
2. Trigger Event Selection: Reset
  • 作用:选择触发输出事件
  • Reset:复位事件作为触发输出
  • 其他:Enable、Update、Compare Pulse等

PWM Generation Channel 1(PWM生成通道1)加粗样式

  • Mode: PWM mode 1
    • PWM模式1:当CNT < CCR时输出有效电平
    • 下拉菜单显示可选择不同PWM模式
      在这里插入图片描述

  • Pulse (16 bits value): 0

    • 比较寄存器值,决定占空比
    • 当前为0,表示0%占空比
  • Output compare preload: Enable

    • 输出比较预装载使能,CCR值在更新事件时生效
  • Fast Mode: Disable

    • 快速模式禁用
  • CH Polarity: High

    • 通道极性为高电平有效
    • PWM Mode 1下:当CNT < CCR时输出高电平,CNT ≥ CCR时输出低电平

假设:ARR = 999,CCR = 500(50%占空比)

High极性波形:

     ┌─────┐     ┌─────┐
3.3V │     │     │     │
     │     │     │     │
0V   ┘     └─────┘     └─────
     0   500   999   500   999
     │←50%→│←50%→│←50%→│←50%→│

Low极性波形:

     ┌─────┐     ┌─────┐
0V   │     │     │     │
     │     │     │     │
3.3V ┘     └─────┘     └─────
     0   500   999   500   999
     │←50%→│←50%→│←50%→│←50%→│

程序中定时器寄存器代码解释

/**
  * @brief TIM Timers
  */
typedef struct
{
  __IO uint32_t CR1;             /*!< TIM control register 1,                      Address offset: 0x00 */
  __IO uint32_t CR2;             /*!< TIM control register 2,                      Address offset: 0x04 */
  __IO uint32_t SMCR;            /*!< TIM slave Mode Control register,             Address offset: 0x08 */
  __IO uint32_t DIER;            /*!< TIM DMA/interrupt enable register,           Address offset: 0x0C */
  __IO uint32_t SR;              /*!< TIM status register,                         Address offset: 0x10 */
  __IO uint32_t EGR;             /*!< TIM event generation register,               Address offset: 0x14 */
  __IO uint32_t CCMR1;           /*!< TIM  capture/compare mode register 1,        Address offset: 0x18 */
  __IO uint32_t CCMR2;           /*!< TIM  capture/compare mode register 2,        Address offset: 0x1C */
  __IO uint32_t CCER;            /*!< TIM capture/compare enable register,         Address offset: 0x20 */
  __IO uint32_t CNT;             /*!< TIM counter register,                        Address offset: 0x24 */
  __IO uint32_t PSC;             /*!< TIM prescaler register,                      Address offset: 0x28 */
  __IO uint32_t ARR;             /*!< TIM auto-reload register,                    Address offset: 0x2C */
  __IO uint32_t RCR;             /*!< TIM  repetition counter register,            Address offset: 0x30 */
  __IO uint32_t CCR1;            /*!< TIM capture/compare register 1,              Address offset: 0x34 */
  __IO uint32_t CCR2;            /*!< TIM capture/compare register 2,              Address offset: 0x38 */
  __IO uint32_t CCR3;            /*!< TIM capture/compare register 3,              Address offset: 0x3C */
  __IO uint32_t CCR4;            /*!< TIM capture/compare register 4,              Address offset: 0x40 */
  __IO uint32_t BDTR;            /*!< TIM break and dead-time register,            Address offset: 0x44 */
  __IO uint32_t DCR;             /*!< TIM DMA control register,                    Address offset: 0x48 */
  __IO uint32_t DMAR;            /*!< TIM DMA address for full transfer register,  Address offset: 0x4C */
  __IO uint32_t OR;              /*!< TIM option register,                         Address offset: 0x50 */
}TIM_TypeDef;
  1. CR1 (Control Register 1) - 控制寄存器1
    地址偏移: 0x00
  • 功能: 定时器的基本控制设置
  • 主要位域:
    • CEN (bit 0): 计数器使能位,1=启动定时器,0=停止定时器
    • UDIS (bit 1): 更新禁止位,1=禁止更新事件
    • URS (bit 2): 更新请求选择
    • OPM (bit 3): 单脉冲模式,1=计数器在下次更新事件时停止
    • DIR (bit 4): 方向位,0=向上计数,1=向下计数
    • CMS (bit 5-6): 中心对齐模式选择
    • ARPE (bit 7): 自动重装载预装载使能
  • 使用场景: 启动/停止定时器,设置计数方向,配置单脉冲模式等
  1. CR2 (Control Register 2) - 控制寄存器2
    地址偏移: 0x04
  • 功能: 定时器的高级控制功能
  • 主要位域:
    • CCDS (bit 3): 捕获/比较DMA选择
    • MMS (bit 4-6): 主模式选择,用于触发其他定时器
    • TI1S (bit 7): TI1选择
  • 使用场景: 配置定时器级联,DMA触发源选择
  1. SMCR (Slave Mode Control Register) - 从模式控制寄存器
    地址偏移: 0x08
  • 功能: 配置定时器的从模式操作
  • 主要位域:
    • SMS (bit 0-2): 从模式选择
    • TS (bit 4-6): 触发选择
    • MSM (bit 7): 主/从模式
    • ETF (bit 8-11): 外部触发滤波
    • ETPS (bit 12-13): 外部触发预分频器
    • ECE (bit 14): 外部时钟使能
    • ETP (bit 15): 外部触发极性
  • 使用场景: 编码器模式,外部时钟源,定时器级联
  1. DIER (DMA/Interrupt Enable Register) - DMA/中断使能寄存器
    地址偏移: 0x0C
  • 功能: 控制各种中断和DMA请求的使能
  • 主要位域:
    • UIE (bit 0): 更新中断使能
    • CC1IE (bit 1): 捕获/比较1中断使能
    • CC2IE (bit 2): 捕获/比较2中断使能
    • CC3IE (bit 3): 捕获/比较3中断使能
    • CC4IE (bit 4): 捕获/比较4中断使能
    • TIE (bit 6): 触发中断使能
    • UDE (bit 8): 更新DMA请求使能
    • CC1DE-CC4DE (bit 9-12): 捕获/比较DMA请求使能
  • 使用场景: 使能定时器溢出中断,PWM比较中断,DMA传输等
  1. SR (Status Register) - 状态寄存器
    地址偏移: 0x10
  • 功能: 显示定时器的各种状态标志
  • 主要位域:
    • UIF (bit 0): 更新中断标志
    • CC1IF (bit 1): 捕获/比较1中断标志
    • CC2IF (bit 2): 捕获/比较2中断标志
    • CC3IF (bit 3): 捕获/比较3中断标志
    • CC4IF (bit 4): 捕获/比较4中断标志
    • TIF (bit 6): 触发中断标志
    • CC1OF-CC4OF (bit 9-12): 捕获/比较溢出标志
  • 使用场景: 在中断服务函数中检查和清除中断标志
  1. EGR (Event Generation Register) - 事件产生寄存器
    地址偏移: 0x14
  • 功能: 软件产生各种事件
  • 主要位域:
    • UG (bit 0): 更新产生
    • CC1G-CC4G (bit 1-4): 捕获/比较事件产生
    • TG (bit 6): 触发事件产生
  • 使用场景: 软件触发定时器更新,立即装载新的比较值
  1. CCMR1 (Capture/Compare Mode Register 1) - 捕获/比较模式寄存器1
    地址偏移: 0x18
  • 功能: 配置通道1和通道2的工作模式
  • 输出比较模式:
    • OC1M (bit 4-6): 输出比较1模式
    • OC1PE (bit 3): 输出比较1预装载使能
    • OC1FE (bit 2): 输出比较1快速使能
    • CC1S (bit 0-1): 捕获/比较1选择
  • 输入捕获模式:
    • IC1F (bit 4-7): 输入捕获1滤波器
    • IC1PSC (bit 2-3): 输入捕获1预分频器
  • 使用场景: 配置PWM输出,输入捕获测量
  1. CCMR2 (Capture/Compare Mode Register 2) - 捕获/比较模式寄存器2
    地址偏移: 0x1C
  • 功能: 配置通道3和通道4的工作模式
  • 位域: 与CCMR1类似,但针对通道3和4
  • 使用场景: 配置更多PWM通道或输入捕获通道
  1. CCER (Capture/Compare Enable Register) - 捕获/比较使能寄存器
    地址偏移: 0x20
  • 功能: 使能和配置捕获/比较通道
  • 主要位域:
    • CC1E (bit 0): 捕获/比较1输出使能
    • CC1P (bit 1): 捕获/比较1输出极性
    • CC2E, CC3E, CC4E: 其他通道使能
    • CC2P, CC3P, CC4P: 其他通道极性
  • 使用场景: 使能PWM输出引脚,设置输出极性
  1. CNT (Counter Register) - 计数器寄存器
    地址偏移: 0x24
  • 功能: 当前计数值
  • 特点: 可读可写,范围0-65535
  • 使用场景: 读取当前计数值,设置初始计数值
  1. PSC (Prescaler Register) - 预分频器寄存器
    地址偏移: 0x28
  • 功能: 设置计数器时钟预分频系数
  • 公式: 定时器频率 = 输入时钟频率 / (PSC + 1)
  • 使用场景: 降低定时器工作频率,调整定时精度
  1. ARR (Auto-Reload Register) - 自动重装载寄存器
    地址偏移: 0x2C
  • 功能: 设置计数器的最大值
  • 工作原理: 计数器从0计数到ARR值,然后重新开始
  • 使用场景: 设置定时周期,PWM周期
  1. RCR (Repetition Counter Register) - 重复计数器寄存器
    地址偏移: 0x30
  • 功能: 设置更新事件的重复次数
  • 特点: 主要用于高级定时器(TIM1, TIM8)
  • 使用场景: 降低更新事件频率
  1. CCR1-CCR4 (Capture/Compare Register 1-4) - 捕获/比较寄存器1-4
    地址偏移: 0x34, 0x38, 0x3C, 0x40
  • 输出比较模式: 设置比较值,用于PWM占空比控制
  • 输入捕获模式: 存储捕获的计数器值
  • 使用场景: PWM占空比设置,输入信号测量
  1. BDTR (Break and Dead-Time Register) - 刹车和死区寄存器
    地址偏移: 0x44
  • 功能: 配置刹车功能和死区时间
  • 主要位域:
    • DTG (bit 0-7): 死区时间配置
    • LOCK (bit 8-9): 锁定配置
    • OSSI, OSSR (bit 10-11): 空闲和运行状态下的输出状态
    • BKE (bit 12): 刹车使能
    • BKP (bit 13): 刹车极性
    • AOE (bit 14): 自动输出使能
    • MOE (bit 15): 主输出使能
  • 使用场景: 电机控制,防止上下臂同时导通
  1. DCR (DMA Control Register) - DMA控制寄存器
    地址偏移: 0x48
  • 功能: 配置DMA突发传输
  • 主要位域:
    • DBA (bit 0-4): DMA基地址
    • DBL (bit 8-12): DMA突发长度
  • 使用场景: 批量更新定时器寄存器
  1. DMAR (DMA Address for Full Transfer Register) - DMA传输地址寄存器
    地址偏移: 0x4C
  • 功能: DMA突发传输的数据寄存器
  • 使用场景: 与DCR配合使用,实现批量寄存器更新
  1. OR (Option Register) - 选项寄存器
    地址偏移: 0x50
  • 功能: 定时器的特殊功能配置
  • 使用场景: 特定型号的特殊功能配置

常见应用场景

  1. 基本定时器功能
// 配置1ms定时器 (假设72MHz系统时钟)
TIM2->PSC = 7199;      // 预分频器: 72MHz/(7199+1) = 10kHz
TIM2->ARR = 9;         // 自动重装载: 10kHz/10 = 1kHz (1ms)
TIM2->DIER |= TIM_DIER_UIE;  // 使能更新中断
TIM2->CR1 |= TIM_CR1_CEN;    // 启动定时器
  1. PWM输出
// 配置PWM输出
TIM3->CCMR1 |= (6 << 4);     // OC1M = 110 (PWM模式1)
TIM3->CCMR1 |= TIM_CCMR1_OC1PE;  // 使能预装载
TIM3->CCER |= TIM_CCER_CC1E;     // 使能通道1输出
TIM3->CCR1 = 500;            // 设置占空比
TIM3->ARR = 999;             // 设置PWM周期
  1. 输入捕获
// 配置输入捕获
TIM4->CCMR1 |= TIM_CCMR1_CC1S_0;  // CC1S = 01 (TI1映射到CC1)
TIM4->CCER |= TIM_CCER_CC1E;      // 使能捕获
TIM4->DIER |= TIM_DIER_CC1IE;     // 使能捕获中断

输出比较配置结构体

/**
  * @brief  TIM Output Compare Configuration Structure definition
  */
typedef struct
{
  uint32_t OCMode;        /*!< Specifies the TIM mode.
                               This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */

  uint32_t Pulse;         /*!< Specifies the pulse value to be loaded into the Capture Compare Register.
                               This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */

  uint32_t OCPolarity;    /*!< Specifies the output polarity.
                               This parameter can be a value of @ref TIM_Output_Compare_Polarity */

  uint32_t OCNPolarity;   /*!< Specifies the complementary output polarity.
                               This parameter can be a value of @ref TIM_Output_Compare_N_Polarity
                               @note This parameter is valid only for timer instances supporting break feature. */

  uint32_t OCFastMode;    /*!< Specifies the Fast mode state.
                               This parameter can be a value of @ref TIM_Output_Fast_State
                               @note This parameter is valid only in PWM1 and PWM2 mode. */


  uint32_t OCIdleState;   /*!< Specifies the TIM Output Compare pin state during Idle state.
                               This parameter can be a value of @ref TIM_Output_Compare_Idle_State
                               @note This parameter is valid only for timer instances supporting break feature. */

  uint32_t OCNIdleState;  /*!< Specifies the TIM Output Compare pin state during Idle state.
                               This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State
                               @note This parameter is valid only for timer instances supporting break feature. */
} TIM_OC_InitTypeDef;
  1. OCMode - 输出比较模式
    功能: 指定定时器输出比较通道的工作模式
    可选值:
  • TIM_OCMODE_TIMING: 定时模式(无输出)
  • TIM_OCMODE_ACTIVE: 匹配时输出有效电平
  • TIM_OCMODE_INACTIVE: 匹配时输出无效电平
  • TIM_OCMODE_TOGGLE: 匹配时翻转输出
  • TIM_OCMODE_PWM1: PWM模式1(CNT<CCR时有效)
  • TIM_OCMODE_PWM2: PWM模式2(CNT>CCR时有效)
  • TIM_OCMODE_FORCED_ACTIVE: 强制输出有效
  • TIM_OCMODE_FORCED_INACTIVE: 强制输出无效

使用场景:

// PWM输出配置
TIM_OC_InitTypeDef sConfig = {0};
sConfig.OCMode = TIM_OCMODE_PWM1;  // PWM模式1
  1. Pulse - 脉冲宽度值
    功能: 设置装载到捕获比较寄存器(CCR)的脉冲值
    数值范围: 0x0000 - 0xFFFF
    作用:
  • PWM模式: 决定占空比 = Pulse / (ARR + 1)
  • 输出比较: 决定比较匹配的时间点

使用场景:

// 设置50%占空比,假设ARR=999
sConfig.Pulse = 500;  // 占空比 = 500/1000 = 50%
  1. OCPolarity - 输出极性
    功能: 指定输出信号的极性
    可选值:
  • TIM_OCPOLARITY_HIGH: 高电平有效
  • TIM_OCPOLARITY_LOW: 低电平有效

使用场景:

// 设置高电平有效
sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
// PWM模式下,有效时间内输出高电平
  1. OCNPolarity - 互补输出极性
    功能: 指定互补输出信号的极性
    适用范围: 仅支持刹车功能的定时器(TIM1, TIM8)
    可选值:
  • TIM_OCNPOLARITY_HIGH: 高电平有效
  • TIM_OCNPOLARITY_LOW: 低电平有效

这个触发时在根据 OC2REF 的值来触发,这个是内部的值,当从0跳变到1便会触发,CH_POLARITY的影响: 仅影响PA1的GPIO输出极性,不影响OC2REF。

使用场景:

// 电机控制中的互补PWM
sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
// 用于驱动半桥电路的上臂和下臂
  1. OCFastMode - 快速模式
    功能: 在PWM1和PWM2模式下启用快速模式
    适用条件: 仅在PWM1和PWM2模式下有效
    可选值:
  • TIM_OCFAST_DISABLE: 禁用快速模式
  • TIM_OCFAST_ENABLE: 启用快速模式

作用: 快速模式可以在触发事件后立即改变输出状态,无需等待比较匹配

使用场景:

// 需要快速响应的PWM应用
sConfig.OCFastMode = TIM_OCFAST_ENABLE;
  1. OCIdleState - 空闲状态输出
    功能: 指定在空闲状态时输出引脚的状态
    适用范围: 仅支持刹车功能的定时器(TIM1, TIM8)
    可选值:
  • TIM_OCIDLESTATE_SET: 空闲时输出高电平
  • TIM_OCIDLESTATE_RESET: 空闲时输出低电平

使用场景:

// 电机控制中,确保空闲时输出安全状态
sConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
  1. OCNIdleState - 互补输出空闲状态
    功能: 指定互补输出在空闲状态时的状态
    适用范围: 仅支持刹车功能的定时器(TIM1, TIM8)
    可选值:
  • TIM_OCNIDLESTATE_SET: 空闲时输出高电平
  • TIM_OCNIDLESTATE_RESET: 空闲时输出低电平

使用场景:

// 确保互补输出在空闲时也处于安全状态
sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;

完整应用示例

  1. 基本PWM配置
TIM_OC_InitTypeDef sConfig = {0};
sConfig.OCMode = TIM_OCMODE_PWM1;
sConfig.Pulse = 500;  // 50%占空比
sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfig.OCFastMode = TIM_OCFAST_DISABLE;

HAL_TIM_OC_ConfigChannel(&htim3, &sConfig, TIM_CHANNEL_1);
HAL_TIM_OC_Start(&htim3, TIM_CHANNEL_1);
  1. 电机控制互补PWM
TIM_OC_InitTypeDef sConfig = {0};
sConfig.OCMode = TIM_OCMODE_PWM1;
sConfig.Pulse = 800;
sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfig.OCFastMode = TIM_OCFAST_DISABLE;
sConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;

HAL_TIM_OC_ConfigChannel(&htim1, &sConfig, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);  // 启动互补输出
  1. 输出比较模式
TIM_OC_InitTypeDef sConfig = {0};
sConfig.OCMode = TIM_OCMODE_TOGGLE;  // 翻转输出
sConfig.Pulse = 1000;  // 比较值
sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;

HAL_TIM_OC_ConfigChannel(&htim2, &sConfig, TIM_CHANNEL_1);
HAL_TIM_OC_Start_IT(&htim2, TIM_CHANNEL_1);  // 启动中断

与硬件寄存器的对应关系

结构体成员对应的硬件寄存器位说明
OCModeCCMR1/CCMR2中的OCxM位输出比较模式设置
PulseCCRx寄存器比较值
OCPolarityCCER中的CCxP位输出极性
OCNPolarityCCER中的CCxNP位互补输出极性
OCFastModeCCMR1/CCMR2中的OCxFE位快速模式使能
OCIdleStateBDTR中的OISx位空闲状态输出
OCNIdleStateBDTR中的OISxN位互补输出空闲状态

开启定时器(代码)

MX_TIM2_Init();  // 在main.c中由CubeMX生成

// 假设使用的是 TIM2(选一)
HAL_TIM_Base_Start_IT(&htim2);  // 启动中断模式
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);  // 启动PWM通道1
HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);  // 启动输入捕获中断
HAL_TIM_Base_Start(&htim2);  // 仅启动定时器,不启用中断


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM2)
    {
        // 定时器2中断处理逻辑
    }
}
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐