1. 定时器模式选择
TIM3 是一个通用定时器,支持多种功能,比如定时中断、PWM 输出、输入捕获和编码器模式等。根据你的需求,选择合适的模式:
-
基本定时模式:适用于定时中断。
-
PWM 输出模式:用于生成 PWM 信号。
-
输入捕获模式:用于测量输入信号的频率或脉宽。
-
编码器模式:适用于处理旋转编码器信号。
2. 配置步骤
(1)Slave Mode(从模式)
-
如果你需要 TIM3 作为其他定时器的从设备(比如用于触发同步),可以启用从模式。
-
常见选项:
-
Disabled:默认禁用从模式。
-
**EncoderEncoder Mode:适用于编码器输入。
-
Reset Mode:从触发信号复位计数器。
-
Gated Mode:从触发信号启停计数器。
-
Trigger Mode:从触发信号启动计数器。
-
(2)Trigger Source(触发源)
-
如果 TIM3 需要外部触发信号(比如来自另一个定时器或外部引脚),则需要配置触发源。
-
常见选项:
-
Internal Trigger:选择其他定时器的输出作为触发源。
-
External Trigger:使用外部引脚(如 TI1FP1)作为触发源。
-
(3)Clock Source(时钟源)
-
定时器的时钟源可以选择:
-
Internal Clock:使用内部时钟。
-
External Clock Mode 1:从外部输入引脚获取时钟。
-
External Clock Mode 2:从触发输入获取时钟。
-
(4)Channel1-Channel4(通道配置)
-
TIM3 有 4 个通道,每个通道可以独立配置为输入或输出模式:
-
PWM Generation:用于生成 PWM 信号。
-
Input Capture:用于捕获输入信号。
-
Output Compare:用于比较输出。
-
-
如果某个通道未使用,可以保持
Disabled
。
(5)Combined Channels(组合通道)
-
如果需要组合多个通道(比如用于高级 PWM 功能),可以在这里进行配置。
(6)其他选项
-
Use ETR as Clearing Source:使用外部触发输入(ETR)作为计数器清零信号。
-
XOR Activation:启用 XOR 功能,用于输入捕获时将多个输入信号组合。
-
One Pulse Mode:启用单脉冲模式,计数器只运行一次。
3. 常见配置示例
(1)定时中断模式
-
Slave Mode:Disabled
-
Trigger Source:Disabled
-
Clock Source:Internal Clock
-
Channel1-Channel4:Disabled
-
配置预分频器(Prescaler)和自动重装载值(ARR),以生成所需的中断频率。
(2)PWM 输出模式
-
Slave Mode:Disabled
-
Trigger Source:Disabled
-
Clock Source:Internal Clock
-
Channel1-Channel4:配置为 PWM Generation
-
设置 PWM 的占空比和频率。
(3)输入捕获模式
-
Slave Mode:Disabled
-
Trigger Source:Disabled
-
Clock Source:Internal Clock
-
Channel1-Channel4:配置为 Input Capture
-
设置捕获边沿(上升沿、下降沿或双边沿)。
(1)设置定时器参数
在 Parameter Settings 中,配置以下参数:
-
Prescaler (PSC):
-
预分频器,用于减小定时器输入时钟频率。
-
定时器时钟频率 = APB 总线时钟 / (PSC + 1)。
-
例如,如果 APB 时钟为 72 MHz,PSC 设置为 71,则定时器时钟频率为 1 MHz。
-
-
Counter Mode:
-
设置计数模式:
-
Up:向上计数。
-
Down:向下计数。
-
Center-Aligned:中心对齐模式(用于 PWM)。
-
-
-
Counter Period (ARR):
-
自动重装载值,决定定时器的计数周期。
-
定时器周期 = (ARR + 1) / 定时器时钟频率。
-
例如,ARR 设置为 999,定时器时钟为 1 MHz,则周期为 1 ms。
-
-
Internal Clock Division (CKD):
-
时钟分频,用于调整定时器的采样频率。
-
一般选择 No Division。
-
-
Auto-Reload Preload:
-
选择是否启用自动重装载缓冲区。如果启用,则需要在更新事件(Update Event)后才会加载 ARR 值。
-
(2)触发输出(TRGO)
-
如果需要将定时器的事件输出到其他外设(如 ADC),可以配置 Trigger Output (TRGO):
-
Reset:在更新事件时触发。
-
Enable:在计数器启用时触发。
-
Update:在更新事件时触发。
-
(3)中断或 DMA 设置
-
如果需要使用定时器中断:
-
切换到 NVIC Settings,启用对应定时器的中断(如 TIM3 global interrupt)。
-
-
如果需要使用 DMA:
-
切换到 DMA Settings,添加对应的 DMA 通道。
-
2. 定时中断配置示例
假设你需要配置 TIM3 以产生 1 ms 的定时中断,以下是具体配置步骤:
-
Enable TIM3:
-
在 Timers 中启用 TIM3。
-
-
设置参数:
-
Prescaler (PSC):71(假设 APB 时钟为 72 MHz,则定时器时钟为 1 MHz)。
-
Counter Period (ARR):999(1 MHz / 1000 = 1 ms)。
-
Counter Mode:Up。
-
Auto-Reload Preload:Enable。
-
-
启用中断:
-
切换到 NVIC Settings,启用 TIM3 的全局中断。
-
-
生成代码:
-
点击 Project -> Generate Code,在生成的代码中找到
MX_TIM3_Init()
函数,确认初始化参数正确。
-
-
编写中断处理函数:
在stm32fxxx_it.c
文件中,找到TIM3_IRQHandler()
,添加你的中断处理逻辑。
3. PWM 输出配置示例
如果你需要配置 TIM3 的 PWM 输出,以下是配置步骤:
-
Enable TIM3:
-
在 Timers 中启用 TIM3。
-
-
设置参数:
-
Prescaler (PSC):71(假设 APB 时钟为 72 MHz,则定时器时钟为 1 MHz)。
-
Counter Period (ARR):999(PWM 周期为 1 ms)。
-
Counter Mode:Up。
-
-
配置通道:
-
切换到 Mode and Configuration,将 Channel1 设置为 PWM Generation。
-
设置占空比(通过 Pulse 值调整,占空比 = Pulse / ARR)。
-
-
生成代码并初始化:
-
点击 Generate Code,在 HAL 库中调用
HAL_TIM_PWM_Start()
启动 PWM。
-
4. 注意事项
-
时钟源:确保定时器的时钟源配置正确,例如 APB 时钟频率是否满足需求。
-
分频器和周期值的计算:根据实际需求调整 PSC 和 ARR,以满足定时或 PWM 的频率要求。
-
中断优先级:如果启用了中断,确保优先级设置合理,避免与其他中断冲突。
1. Enabled(启用)
-
勾选了 Enabled,表示启用了 TIM3 的全局中断功能。
-
这意味着,当 TIM3 产生中断事件(例如计数溢出、更新事件等)时,NVIC(嵌套向量中断控制器)会处理该中断,并调用对应的中断服务函数(ISR)。
-
启用中断后,需要在代码中实现相应的中断处理逻辑,例如在
stm32fxxx_it.c
文件中编写TIM3_IRQHandler()
函数。
2. Preemption Priority(抢占优先级)
-
设置为 0,表示该中断的抢占优先级为最高(优先级值越小,优先级越高)。
-
如果系统中有其他中断,NVIC 会根据抢占优先级决定哪个中断先被处理。
-
抢占优先级的典型应用:
-
如果有多个中断源,优先级高的中断可以打断优先级低的中断。
-
例如,假设 TIM3 的抢占优先级为 0,而另一个外设(如 USART)的抢占优先级为 1,则当 TIM3 中断发生时,即使 USART 中断正在执行,TIM3 中断也会立即抢占并优先处理。
-
3. 注意事项
-
抢占优先级与子优先级:
-
STM32 的中断优先级分为抢占优先级和子优先级。抢占优先级用于决定中断是否可以打断其他中断,而子优先级用于处理相同抢占优先级的中断顺序。
-
在 CubeMX 中,抢占优先级和子优先级的位数可以通过 NVIC 优先级分组 进行配置。
-
-
中断响应时间:
-
抢占优先级设置为最高(0)时,TIM3 中断的响应速度最快,但可能会影响其他低优先级中断的实时性。因此,需要根据实际应用场景合理分配优先级。
-
-
中断嵌套:
-
如果启用了抢占优先级,高优先级中断可以打断低优先级中断,形成中断嵌套。需要确保中断服务函数的执行时间尽可能短,以避免影响系统性能。
-
——————————————————————————————————————
1. CubeMX 配置生成代码
-
在 CubeMX 中配置 TIM3 的中断后,生成的代码会自动完成以下工作:
-
初始化 TIM3 的中断优先级。
-
启用 TIM3 的中断功能。
-
-
你可以在生成的
main.c
文件中找到MX_TIM3_Init()
函数,其中包含了 TIM3 的中断配置。
2. 中断服务函数
-
在生成的代码文件
stm32fxxx_it.c
中,会包含TIM3_IRQHandler()
函数,这是 TIM3 的中断服务函数(ISR)。 -
你需要在该函数中编写具体的中断处理逻辑。以下是一个示例代码:
void TIM3_IRQHandler(void)
{
// 检查中断标志位
if (__HAL_TIM_GET_FLAG(&htim3, TIM_FLAG_UPDATE) != RESET)
{
if (__HAL_TIM_GET_IT_SOURCE(&htim3, TIM_IT_UPDATE) != RESET)
{
// 清除中断标志位
__HAL_TIM_CLEAR_IT(&htim3, TIM_IT_UPDATE);
// 在这里添加中断处理逻辑
// 例如:翻转 LED 状态、更新计数器、触发任务等
}
}
}
-
3. 启用定时器中断:
- 在主程序中,确保调用了
HAL_TIM_Base_Start_IT(&htim3)
,以启动 TIM3 的中断功能。
- 在主程序中,确保调用了
代码说明:
-
检查中断标志位:
-
使用
__HAL_TIM_GET_FLAG()
函数检查是否发生了更新事件(TIM_FLAG_UPDATE)。 -
使用
__HAL_TIM_GET_IT_SOURCE()
函数确认更新事件中断是否已启用。
-
-
清除中断标志位:
-
使用
__HAL_TIM_CLEAR_IT()
函数清除更新事件的中断标志位,以避免重复进入中断。
-
-
添加中断处理逻辑:
-
在中断服务函数中编写具体的处理逻辑,例如翻转 LED 状态、更新计数器、触发任务等。
-
———————————————————————————————————————————
HAL_TIM_IRQHandler
是 HAL 库中定时器中断处理的核心函数,它会根据定时器的中断标志位和中断源来调用对应的回调函数。以下是我对 HAL_TIM_IRQHandler
中包含的所有回调函数及其作用的详细说明:
1. 输入捕获回调
-
函数:
HAL_TIM_IC_CaptureCallback(htim)
-
作用:
-
当定时器的输入捕获通道(Capture Compare Channel)检测到输入信号时触发。
-
一般用于测量输入信号的频率或占空比。
-
2. 输出比较回调
-
函数:
HAL_TIM_OC_DelayElapsedCallback(htim)
-
作用:
-
当输出比较事件发生时触发。
-
一般用于定时器的输出比较模式,产生精确的定时事件。
-
3. PWM 脉冲完成回调
-
函数:
HAL_TIM_PWM_PulseFinishedCallback(htim)
-
作用:
-
当 PWM 输出产生一个完整的脉冲周期时触发。
-
一般用于监控 PWM 信号的输出状态。
-
4. 定时器周期溢出回调
-
函数:
HAL_TIM_PeriodElapsedCallback(htim)
-
作用:
-
当定时器计数器溢出(更新事件,Update Event)时触发。
-
一般用于定时中断。
-
5. 断点事件回调
-
函数:
HAL_TIMEx_BreakCallback(htim)
-
作用:
-
当发生断点事件(Break Event)时触发。
-
一般用于紧急停止 PWM 输出,保护电机或其他设备。
-
6. 触发检测回调
-
函数:
HAL_TIM_TriggerCallback(htim)
-
作用:
-
当触发事件(Trigger Event)发生时触发。
-
一般用于同步多个定时器或外设。
-
7. 换向事件回调
-
函数:
HAL_TIMEx_CommutCallback(htim)
-
作用:
-
当换向事件(Commutation Event)发生时触发。
-
一般用于控制三相电机的换向。
-
8. 用户注册回调(可选)
-
如果启用了 HAL 的回调注册功能(
USE_HAL_TIM_REGISTER_CALLBACKS == 1
),用户可以注册自定义回调函数:-
htim->IC_CaptureCallback
:代替HAL_TIM_IC_CaptureCallback
。 -
htim->OC_DelayElapsedCallback
:代替HAL_TIM_OC_DelayElapsedCallback
。 -
htim->PWM_PulseFinishedCallback
:代替HAL_TIM_PWM_PulseFinishedCallback
。 -
htim->PeriodElapsedCallback
:代替HAL_TIM_PeriodElapsedCallback
。 -
htim->BreakCallback
:代替HAL_TIMEx_BreakCallback
。 -
htim->TriggerCallback
:代替HAL_TIM_TriggerCallback
。 -
htim->CommutationCallback
:代替HAL_TIMEx_CommutCallback
。
-
总结:包含的回调函数
以下是 HAL_TIM_IRQHandler
中可能调用的所有回调函数:
-
输入捕获回调:
HAL_TIM_IC_CaptureCallback
-
输出比较回调:
HAL_TIM_OC_DelayElapsedCallback
-
PWM 脉冲完成回调:
HAL_TIM_PWM_PulseFinishedCallback
-
定时器周期溢出回调:
HAL_TIM_PeriodElapsedCallback
-
断点事件回调:
HAL_TIMEx_BreakCallback
-
触发检测回调:
HAL_TIM_TriggerCallback
-
换向事件回调:
HAL_TIMEx_CommutCallback
如何使用这些回调函数?
-
你需要在相应的回调函数中实现具体的功能逻辑。
-
例如,如果你使用定时中断,可以在
HAL_TIM_PeriodElapsedCallback
中处理定时器溢出的逻辑:void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM3) { // TIM3 溢出事件的处理逻辑 } }