www.z-linear.com
STM32H743有17个定时器——基本定时器、通用定时器、高级定时器。D223用了其中14个。TIM1~TIM14各自干什么?时钟频率多少?中断优先级怎么设?本文是D223定时器系统的完整分配表。
一、STM32H743定时器概览
1.1 定时器分类
| 类型 | 定时器 | 数量 | 特点 |
|---|---|---|---|
| 高级定时器 | TIM1, TIM8 | 2 | 互补PWM、死区、刹车 |
| 通用定时器(32位) | TIM2, TIM5 | 2 | 32位计数器 |
| 通用定时器(16位) | TIM3, TIM4 | 2 | 16位计数器 |
| 通用定时器(16位) | TIM9~14 | 6 | 基本通用 |
| 基本定时器 | TIM6, TIM7 | 2 | 仅定时(DAC触发) |
1.2 定时器时钟
STM32H743的定时器挂在不同APB总线上,时钟频率不同。
| APB总线 | 定时器 | APB时钟 | 定时器时钟(×2) |
|---|---|---|---|
| APB1(120MHz) | TIM2~7, TIM12~14 | 120MHz | 240MHz |
| APB2(120MHz) | TIM1, TIM8~11 | 120MHz | 240MHz |
当APB预分频≠1时,定时器时钟=APB时钟×2。D223中APB1和APB2都是120MHz,定时器时钟为240MHz。
二、D223定时器分配全表
| 定时器 | APB | 时钟频率 | 用途 | ARR | PSC | 中断优先级 |
|---|---|---|---|---|---|---|
| TIM1 | APB2 | 240MHz | PWM CH1 | 动态 | 动态 | — |
| TIM2 | APB1 | 240MHz | PWM CH2 | 动态 | 动态 | — |
| TIM3 | APB1 | 240MHz | PWM CH3 | 动态 | 动态 | — |
| TIM4 | APB1 | 240MHz | PWM CH4 | 动态 | 动态 | — |
| TIM5 | APB1 | 240MHz | PWM CH5 | 动态 | 动态 | — |
| TIM8 | APB2 | 240MHz | PWM CH6 | 动态 | 动态 | — |
| TIM12 | APB1 | 240MHz | 1ms系统节拍 | 239 | 999 | 6 |
| TIM13 | APB1 | 240MHz | ADC采样触发 | 动态 | 动态 | 5 |
| TIM14 | APB1 | 240MHz | DAC输出触发 | 动态 | 动态 | 5 |
| TIM6 | APB1 | 240MHz | 备用(DAC触发) | — | — | — |
| TIM7 | APB1 | 240MHz | 备用 | — | — | — |
| TIM9 | APB2 | 240MHz | 备用 | — | — | — |
| TIM10 | APB2 | 240MHz | 备用 | — | — | — |
| TIM11 | APB2 | 240MHz | 备用 | — | — | — |
三、功能定时器详解
3.1 TIM12:1ms系统节拍
// TIM12配置: 240MHz / (999+1) / (239+1) = 1000Hz = 1mshtim12.Init.Prescaler=999;htim12.Init.Period=239;// 中断优先级: 6voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htim==&htim12){dio_tim_task();// DIO刷新+PWM加减速(每100ms)}}TIM12每1ms触发一次中断,执行DIO刷新和PWM加减速计算(加减速每100ms一次,通过motorAccDiv分频)。
3.2 TIM13:ADC采样触发
// TIM13配置: 根据采样率动态计算// 500KSPS: ARR = 240MHz/500K - 1 = 479// 10KSPS: ARR = 240MHz/10K - 1 = 23999// 1KSPS: ARR = 240MHz/1K - 1 = 239999// 中断优先级: 5voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htim==&htim13){qspiAdcTimTask();// QSPI DMA读取FPGA FIFO}}TIM13的ARR/PSC在main线程的adc_dac_paramCalcThread()中根据采样率动态更新。
3.3 TIM14:DAC输出触发
// TIM14配置: 根据DDS输出频率动态计算// 中断频率 = DDS频率 × 查找表点数// 中断优先级: 5voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htim==&htim14){ddsDacTimTask();// DDS查表+DAC写入}}3.4 TIM1~TIM8(非TIM12/13/14):PWM输出
| PWM通道 | 定时器 | 定时器通道 | 引脚 | 功能 |
|---|---|---|---|---|
| PWM1 | TIM1 | CH1 | PA8 | 步进电机轴1 |
| PWM2 | TIM4 | CH3 | PB8 | 步进电机轴2 |
| PWM3 | TIM3 | CH2 | PA7 | 步进电机轴3 |
| PWM4 | TIM8 | CH4 | PC9 | 步进电机轴4 |
| PWM5 | TIM5 | CH3 | PA2 | 步进电机轴5 |
| PWM6 | TIM2 | CH2 | PB3 | 步进电机轴6 |
PWM定时器不使用中断(PWM硬件输出),但在TIM12中断中动态更新ARR/PSC实现加减速。
四、ARR/PSC动态计算
4.1 PWM频率计算
voidfun_calcPwmParam(u8 ch,TIM_HandleTypeDef*_pTim){// 定时器时钟240MHz_dioParam.arr[ch]=240000000/_dioParam.presentFreq[ch];// ARR最大65535,超出时增加PSC分频_dioParam.psc[ch]=_dioParam.arr[ch]/0x10000;_dioParam.arr[ch]=_dioParam.arr[ch]/(_dioParam.psc[ch]+1);// 占空比(千分比)_dioParam.duty[ch]=(_framDatas._pwmDatas[ch].pwmDuty*_dioParam.arr[ch])/1000;// 直接写寄存器(中断中不能调用HAL函数)_pTim->Instance->PSC=_dioParam.psc[ch];_pTim->Instance->ARR=_dioParam.arr[ch];_pTim->Instance->CCR1=_dioParam.duty[ch];}4.2 频率与ARR/PSC对照
| 目标频率 | ARR | PSC | 实际频率 | 误差 |
|---|---|---|---|---|
| 1Hz | 24000 | 9999 | 1.0Hz | 0% |
| 10Hz | 24000 | 999 | 10.0Hz | 0% |
| 100Hz | 24000 | 99 | 100.0Hz | 0% |
| 1kHz | 24000 | 9 | 1000.0Hz | 0% |
| 5kHz | 48000 | 0 | 5000.0Hz | 0% |
| 10kHz | 24000 | 0 | 10000.0Hz | 0% |
| 50kHz | 4800 | 0 | 50000.0Hz | 0% |
| 100kHz | 2400 | 0 | 100000.0Hz | 0% |
4.3 ADC采样率计算
// TIM13 ARR计算voidadc_dac_paramCalcThread(){u32 samplingRate=_framDatas._adcParam.samplingRate;// TIM13 ARR = 240MHz / samplingRate - 1u32 arr=240000000/samplingRate-1;// ARR最大65535,超出时需要PSCu16 psc=arr/65536;arr=arr/(psc+1);// 更新TIM13htim13.Instance->PSC=psc;htim13.Instance->ARR=arr;}| 采样率 | ARR | PSC | 中断间隔 |
|---|---|---|---|
| 500K | 479 | 0 | 2μs |
| 100K | 2399 | 0 | 10μs |
| 10K | 23999 | 0 | 100μs |
| 1K | 59999 | 3 | 1ms |
| 100 | 59999 | 39 | 10ms |
五、中断优先级与嵌套
5.1 定时器中断优先级
| 定时器 | 优先级 | 功能 | 嵌套关系 |
|---|---|---|---|
| TIM13 | 5 | ADC采样 | 可被TIM14(同级)、DMA(4)打断 |
| TIM14 | 5 | DAC输出 | 与TIM13同级,不互相嵌套 |
| TIM12 | 6 | DIO/PWM加减速 | 可被TIM13(5)打断 |
5.2 为什么TIM13和TIM14同级?
TIM13和TIM14优先级相同(5),不会互相嵌套。但它们的任务很短(2~5μs),即使串行执行也不会错过采样窗口。
5.3 为什么TIM12优先级最低(6)?
TIM12执行DIO刷新和PWM加减速,不需要实时性。降低优先级让ADC和DAC优先执行。
六、定时器资源冲突
6.1 PWM与DO引脚复用
PWM定时器使用GPIO的复用功能,与DO输出共享引脚:
PA8: TIM1_CH1(PWM1) 或 GPIO_DO1 PB8: TIM4_CH3(PWM2) 或 GPIO_DO2 PA7: TIM3_CH2(PWM3) 或 GPIO_DO3 PC9: TIM8_CH4(PWM4) 或 GPIO_DO4 PA2: TIM5_CH3(PWM5) 或 GPIO_DO5 PB3: TIM2_CH2(PWM6) 或 GPIO_DO6同一引脚不能同时做PWM和DO。固件根据用户选择配置GPIO模式。
6.2 TIM6/TIM7的特殊用途
TIM6和TIM7是基本定时器,主要用于触发DAC和ADC。D223中DAC由TIM14触发而非TIM6,TIM6/TIM7保持备用。
6.3 SysTick vs TIM12
| 定时器 | 频率 | 用途 | RTOS关系 |
|---|---|---|---|
| SysTick | 1KHz | RT-Thread节拍 | RTOS管理 |
| TIM12 | 1KHz | DIO/PWM加减速 | 用户管理 |
SysTick和TIM12都是1ms,但用途不同。SysTick用于RTOS调度,TIM12用于业务逻辑。
七、定时器初始化代码
7.1 CubeMX配置
// TIM12 (1ms系统节拍)htim12.Instance=TIM12;htim12.Init.Prescaler=999;htim12.Init.Period=239;htim12.Init.CounterMode=TIM_COUNTERMODE_UP;htim12.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;HAL_TIM_Base_Init(&htim12);HAL_TIM_Base_Start_IT(&htim12);// TIM13 (ADC采样触发)htim13.Instance=TIM13;htim13.Init.Prescaler=0;htim13.Init.Period=479;// 初始500KSPSHAL_TIM_Base_Init(&htim13);HAL_TIM_Base_Start_IT(&htim13);// TIM14 (DAC输出触发)htim14.Instance=TIM14;htim14.Init.Prescaler=0;htim14.Init.Period=2399;// 初始100KHAL_TIM_Base_Init(&htim14);HAL_TIM_Base_Start_IT(&htim14);// PWM定时器 (TIM1/2/3/4/5/8)// 使用PWM输出模式,非中断htim1.Init.Prescaler=0;htim1.Init.Period=24000;// 初始10kHzHAL_TIM_PWM_Init(&htim1);HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);7.2 NVIC配置
HAL_NVIC_SetPriority(TIM8_BR_TIM12_IRQn,6,0);HAL_NVIC_EnableIRQ(TIM8_BR_TIM12_IRQn);HAL_NVIC_SetPriority(TIM8_UP_TIM13_IRQn,5,0);HAL_NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn);HAL_NVIC_SetPriority(TIM8_TRG_COM_TIM14_IRQn,5,0);HAL_NVIC_EnableIRQ(TIM8_TRG_COM_TIM14_IRQn);TIM12/13/14共用TIM8的IRQn(STM32H743中断向量表中TIM12~14与TIM8共用部分向量)。
八、定时器使用率统计
| 类别 | 使用数 | 总数 | 使用率 |
|---|---|---|---|
| 高级定时器 | 2(TIM1,TIM8) | 2 | 100% |
| 通用定时器(32位) | 2(TIM2,TIM5) | 2 | 100% |
| 通用定时器(16位) | 2(TIM3,TIM4) | 2 | 100% |
| 通用定时器(其他) | 3(TIM12,13,14) | 6 | 50% |
| 基本定时器 | 0(TIM6,7备用) | 2 | 0% |
| 合计 | 9 | 14 | 64% |
九、定时器扩展能力
| 扩展场景 | 可用定时器 | 方案 |
|---|---|---|
| 增加编码器接口 | TIM6或TIM7 | 配置为编码器模式 |
| 增加PWM通道 | TIM9或TIM10 | 配置为PWM输出 |
| 增加外部脉冲计数 | TIM11 | 配置为外部时钟输入 |
| 增加定时记录 | TIM6 | 配置为周期定时 |
D223有5个备用定时器(TIM6/7/9/10/11),扩展能力充足。
十、总结
D223定时器系统分配实现了:
| 定时器 | 时钟 | 用途 | 频率/优先级 |
|---|---|---|---|
| TIM1 | 240MHz | PWM1 | 1~10kHz |
| TIM2 | 240MHz | PWM2 | 1~10kHz |
| TIM3 | 240MHz | PWM3 | 1~10kHz |
| TIM4 | 240MHz | PWM4 | 1~10kHz |
| TIM5 | 240MHz | PWM5 | 1~10kHz |
| TIM8 | 240MHz | PWM6 | 1~10kHz |
| TIM12 | 240MHz | 1ms节拍 | 1kHz/优先级6 |
| TIM13 | 240MHz | ADC采样 | 1~500kHz/优先级5 |
| TIM14 | 240MHz | DAC输出 | 可变/优先级5 |
从6路PWM到3个功能定时器,从240MHz时钟到动态ARR/PSC计算,D223的定时器系统为500KSPS高速采样、DDS波形输出和PWM电机控制提供了精确的时序基础。5个备用定时器为功能扩展预留了充足空间。
下篇预告:《D223 vs 国产竞品对比分析》