stm32f10x 定时器
·

基本模式设置
- 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;
- 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): 自动重装载预装载使能
- 使用场景: 启动/停止定时器,设置计数方向,配置单脉冲模式等
- CR2 (Control Register 2) - 控制寄存器2
地址偏移: 0x04
- 功能: 定时器的高级控制功能
- 主要位域:
- CCDS (bit 3): 捕获/比较DMA选择
- MMS (bit 4-6): 主模式选择,用于触发其他定时器
- TI1S (bit 7): TI1选择
- 使用场景: 配置定时器级联,DMA触发源选择
- 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): 外部触发极性
- 使用场景: 编码器模式,外部时钟源,定时器级联
- 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传输等
- 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): 捕获/比较溢出标志
- 使用场景: 在中断服务函数中检查和清除中断标志
- EGR (Event Generation Register) - 事件产生寄存器
地址偏移: 0x14
- 功能: 软件产生各种事件
- 主要位域:
- UG (bit 0): 更新产生
- CC1G-CC4G (bit 1-4): 捕获/比较事件产生
- TG (bit 6): 触发事件产生
- 使用场景: 软件触发定时器更新,立即装载新的比较值
- 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输出,输入捕获测量
- CCMR2 (Capture/Compare Mode Register 2) - 捕获/比较模式寄存器2
地址偏移: 0x1C
- 功能: 配置通道3和通道4的工作模式
- 位域: 与CCMR1类似,但针对通道3和4
- 使用场景: 配置更多PWM通道或输入捕获通道
- CCER (Capture/Compare Enable Register) - 捕获/比较使能寄存器
地址偏移: 0x20
- 功能: 使能和配置捕获/比较通道
- 主要位域:
- CC1E (bit 0): 捕获/比较1输出使能
- CC1P (bit 1): 捕获/比较1输出极性
- CC2E, CC3E, CC4E: 其他通道使能
- CC2P, CC3P, CC4P: 其他通道极性
- 使用场景: 使能PWM输出引脚,设置输出极性
- CNT (Counter Register) - 计数器寄存器
地址偏移: 0x24
- 功能: 当前计数值
- 特点: 可读可写,范围0-65535
- 使用场景: 读取当前计数值,设置初始计数值
- PSC (Prescaler Register) - 预分频器寄存器
地址偏移: 0x28
- 功能: 设置计数器时钟预分频系数
- 公式: 定时器频率 = 输入时钟频率 / (PSC + 1)
- 使用场景: 降低定时器工作频率,调整定时精度
- ARR (Auto-Reload Register) - 自动重装载寄存器
地址偏移: 0x2C
- 功能: 设置计数器的最大值
- 工作原理: 计数器从0计数到ARR值,然后重新开始
- 使用场景: 设置定时周期,PWM周期
- RCR (Repetition Counter Register) - 重复计数器寄存器
地址偏移: 0x30
- 功能: 设置更新事件的重复次数
- 特点: 主要用于高级定时器(TIM1, TIM8)
- 使用场景: 降低更新事件频率
- CCR1-CCR4 (Capture/Compare Register 1-4) - 捕获/比较寄存器1-4
地址偏移: 0x34, 0x38, 0x3C, 0x40
- 输出比较模式: 设置比较值,用于PWM占空比控制
- 输入捕获模式: 存储捕获的计数器值
- 使用场景: PWM占空比设置,输入信号测量
- 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): 主输出使能
- 使用场景: 电机控制,防止上下臂同时导通
- DCR (DMA Control Register) - DMA控制寄存器
地址偏移: 0x48
- 功能: 配置DMA突发传输
- 主要位域:
- DBA (bit 0-4): DMA基地址
- DBL (bit 8-12): DMA突发长度
- 使用场景: 批量更新定时器寄存器
- DMAR (DMA Address for Full Transfer Register) - DMA传输地址寄存器
地址偏移: 0x4C
- 功能: DMA突发传输的数据寄存器
- 使用场景: 与DCR配合使用,实现批量寄存器更新
- OR (Option Register) - 选项寄存器
地址偏移: 0x50
- 功能: 定时器的特殊功能配置
- 使用场景: 特定型号的特殊功能配置
常见应用场景
- 基本定时器功能
// 配置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; // 启动定时器
- 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周期
- 输入捕获
// 配置输入捕获
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;
- 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
- Pulse - 脉冲宽度值
功能: 设置装载到捕获比较寄存器(CCR)的脉冲值
数值范围: 0x0000 - 0xFFFF
作用:
- PWM模式: 决定占空比 = Pulse / (ARR + 1)
- 输出比较: 决定比较匹配的时间点
使用场景:
// 设置50%占空比,假设ARR=999
sConfig.Pulse = 500; // 占空比 = 500/1000 = 50%
- OCPolarity - 输出极性
功能: 指定输出信号的极性
可选值:
TIM_OCPOLARITY_HIGH: 高电平有效TIM_OCPOLARITY_LOW: 低电平有效
使用场景:
// 设置高电平有效
sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
// PWM模式下,有效时间内输出高电平
- OCNPolarity - 互补输出极性
功能: 指定互补输出信号的极性
适用范围: 仅支持刹车功能的定时器(TIM1, TIM8)
可选值:
TIM_OCNPOLARITY_HIGH: 高电平有效TIM_OCNPOLARITY_LOW: 低电平有效
这个触发时在根据 OC2REF 的值来触发,这个是内部的值,当从0跳变到1便会触发,CH_POLARITY的影响: 仅影响PA1的GPIO输出极性,不影响OC2REF。
使用场景:
// 电机控制中的互补PWM
sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
// 用于驱动半桥电路的上臂和下臂
- OCFastMode - 快速模式
功能: 在PWM1和PWM2模式下启用快速模式
适用条件: 仅在PWM1和PWM2模式下有效
可选值:
TIM_OCFAST_DISABLE: 禁用快速模式TIM_OCFAST_ENABLE: 启用快速模式
作用: 快速模式可以在触发事件后立即改变输出状态,无需等待比较匹配
使用场景:
// 需要快速响应的PWM应用
sConfig.OCFastMode = TIM_OCFAST_ENABLE;
- OCIdleState - 空闲状态输出
功能: 指定在空闲状态时输出引脚的状态
适用范围: 仅支持刹车功能的定时器(TIM1, TIM8)
可选值:
TIM_OCIDLESTATE_SET: 空闲时输出高电平TIM_OCIDLESTATE_RESET: 空闲时输出低电平
使用场景:
// 电机控制中,确保空闲时输出安全状态
sConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
- OCNIdleState - 互补输出空闲状态
功能: 指定互补输出在空闲状态时的状态
适用范围: 仅支持刹车功能的定时器(TIM1, TIM8)
可选值:
TIM_OCNIDLESTATE_SET: 空闲时输出高电平TIM_OCNIDLESTATE_RESET: 空闲时输出低电平
使用场景:
// 确保互补输出在空闲时也处于安全状态
sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
完整应用示例
- 基本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);
- 电机控制互补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); // 启动互补输出
- 输出比较模式
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); // 启动中断
与硬件寄存器的对应关系
| 结构体成员 | 对应的硬件寄存器位 | 说明 |
|---|---|---|
| OCMode | CCMR1/CCMR2中的OCxM位 | 输出比较模式设置 |
| Pulse | CCRx寄存器 | 比较值 |
| OCPolarity | CCER中的CCxP位 | 输出极性 |
| OCNPolarity | CCER中的CCxNP位 | 互补输出极性 |
| OCFastMode | CCMR1/CCMR2中的OCxFE位 | 快速模式使能 |
| OCIdleState | BDTR中的OISx位 | 空闲状态输出 |
| OCNIdleState | BDTR中的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中断处理逻辑
}
}
更多推荐
所有评论(0)