分配全表:14個定時器的完整分工)
www.z-linear.comSTM32H743有17個定時器——基本定時器、通用定時器、高級定時器。D223用了其中14個。TIM1~TIM14各自干什么時鐘頻率多少中斷優(yōu)先級怎么設(shè)本文是D223定時器系統(tǒng)的完整分配表。一、STM32H743定時器概覽1.1 定時器分類類型定時器數(shù)量特點高級定時器TIM1, TIM82互補PWM、死區(qū)、剎車通用定時器(32位)TIM2, TIM5232位計數(shù)器通用定時器(16位)TIM3, TIM4216位計數(shù)器通用定時器(16位)TIM9~146基本通用基本定時器TIM6, TIM72僅定時DAC觸發(fā)1.2 定時器時鐘STM32H743的定時器掛在不同APB總線上時鐘頻率不同。APB總線定時器APB時鐘定時器時鐘(×2)APB1(120MHz)TIM2~7, TIM12~14120MHz240MHzAPB2(120MHz)TIM1, TIM8~11120MHz240MHz當(dāng)APB預(yù)分頻≠1時定時器時鐘APB時鐘×2。D223中APB1和APB2都是120MHz定時器時鐘為240MHz。二、D223定時器分配全表定時器APB時鐘頻率用途ARRPSC中斷優(yōu)先級TIM1APB2240MHzPWM CH1動態(tài)動態(tài)—TIM2APB1240MHzPWM CH2動態(tài)動態(tài)—TIM3APB1240MHzPWM CH3動態(tài)動態(tài)—TIM4APB1240MHzPWM CH4動態(tài)動態(tài)—TIM5APB1240MHzPWM CH5動態(tài)動態(tài)—TIM8APB2240MHzPWM CH6動態(tài)動態(tài)—TIM12APB1240MHz1ms系統(tǒng)節(jié)拍2399996TIM13APB1240MHzADC采樣觸發(fā)動態(tài)動態(tài)5TIM14APB1240MHzDAC輸出觸發(fā)動態(tài)動態(tài)5TIM6APB1240MHz備用(DAC觸發(fā))———TIM7APB1240MHz備用———TIM9APB2240MHz備用———TIM10APB2240MHz備用———TIM11APB2240MHz備用———三、功能定時器詳解3.1 TIM121ms系統(tǒng)節(jié)拍// TIM12配置: 240MHz / (9991) / (2391) 1000Hz 1mshtim12.Init.Prescaler999;htim12.Init.Period239;// 中斷優(yōu)先級: 6voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htimhtim12){dio_tim_task();// DIO刷新PWM加減速(每100ms)}}TIM12每1ms觸發(fā)一次中斷執(zhí)行DIO刷新和PWM加減速計算加減速每100ms一次通過motorAccDiv分頻。3.2 TIM13ADC采樣觸發(fā)// TIM13配置: 根據(jù)采樣率動態(tài)計算// 500KSPS: ARR 240MHz/500K - 1 479// 10KSPS: ARR 240MHz/10K - 1 23999// 1KSPS: ARR 240MHz/1K - 1 239999// 中斷優(yōu)先級: 5voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htimhtim13){qspiAdcTimTask();// QSPI DMA讀取FPGA FIFO}}TIM13的ARR/PSC在main線程的adc_dac_paramCalcThread()中根據(jù)采樣率動態(tài)更新。3.3 TIM14DAC輸出觸發(fā)// TIM14配置: 根據(jù)DDS輸出頻率動態(tài)計算// 中斷頻率 DDS頻率 × 查找表點數(shù)// 中斷優(yōu)先級: 5voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htimhtim14){ddsDacTimTask();// DDS查表DAC寫入}}3.4 TIM1~TIM8(非TIM12/13/14)PWM輸出PWM通道定時器定時器通道引腳功能PWM1TIM1CH1PA8步進(jìn)電機(jī)軸1PWM2TIM4CH3PB8步進(jìn)電機(jī)軸2PWM3TIM3CH2PA7步進(jìn)電機(jī)軸3PWM4TIM8CH4PC9步進(jìn)電機(jī)軸4PWM5TIM5CH3PA2步進(jìn)電機(jī)軸5PWM6TIM2CH2PB3步進(jìn)電機(jī)軸6PWM定時器不使用中斷PWM硬件輸出但在TIM12中斷中動態(tài)更新ARR/PSC實現(xiàn)加減速。四、ARR/PSC動態(tài)計算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;// 直接寫寄存器中斷中不能調(diào)用HAL函數(shù)_pTim-Instance-PSC_dioParam.psc[ch];_pTim-Instance-ARR_dioParam.arr[ch];_pTim-Instance-CCR1_dioParam.duty[ch];}4.2 頻率與ARR/PSC對照目標(biāo)頻率ARRPSC實際頻率誤差1Hz2400099991.0Hz0%10Hz2400099910.0Hz0%100Hz2400099100.0Hz0%1kHz2400091000.0Hz0%5kHz4800005000.0Hz0%10kHz24000010000.0Hz0%50kHz4800050000.0Hz0%100kHz24000100000.0Hz0%4.3 ADC采樣率計算// TIM13 ARR計算voidadc_dac_paramCalcThread(){u32 samplingRate_framDatas._adcParam.samplingRate;// TIM13 ARR 240MHz / samplingRate - 1u32 arr240000000/samplingRate-1;// ARR最大65535超出時需要PSCu16 pscarr/65536;arrarr/(psc1);// 更新TIM13htim13.Instance-PSCpsc;htim13.Instance-ARRarr;}采樣率ARRPSC中斷間隔500K47902μs100K2399010μs10K239990100μs1K5999931ms100599993910ms五、中斷優(yōu)先級與嵌套5.1 定時器中斷優(yōu)先級定時器優(yōu)先級功能嵌套關(guān)系TIM135ADC采樣可被TIM14(同級)、DMA(4)打斷TIM145DAC輸出與TIM13同級不互相嵌套TIM126DIO/PWM加減速可被TIM13(5)打斷5.2 為什么TIM13和TIM14同級TIM13和TIM14優(yōu)先級相同5不會互相嵌套。但它們的任務(wù)很短2~5μs即使串行執(zhí)行也不會錯過采樣窗口。5.3 為什么TIM12優(yōu)先級最低6TIM12執(zhí)行DIO刷新和PWM加減速不需要實時性。降低優(yōu)先級讓ADC和DAC優(yōu)先執(zhí)行。六、定時器資源沖突6.1 PWM與DO引腳復(fù)用PWM定時器使用GPIO的復(fù)用功能與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。固件根據(jù)用戶選擇配置GPIO模式。6.2 TIM6/TIM7的特殊用途TIM6和TIM7是基本定時器主要用于觸發(fā)DAC和ADC。D223中DAC由TIM14觸發(fā)而非TIM6TIM6/TIM7保持備用。6.3 SysTick vs TIM12定時器頻率用途RTOS關(guān)系SysTick1KHzRT-Thread節(jié)拍RTOS管理TIM121KHzDIO/PWM加減速用戶管理SysTick和TIM12都是1ms但用途不同。SysTick用于RTOS調(diào)度TIM12用于業(yè)務(wù)邏輯。七、定時器初始化代碼7.1 CubeMX配置// TIM12 (1ms系統(tǒng)節(jié)拍)htim12.InstanceTIM12;htim12.Init.Prescaler999;htim12.Init.Period239;htim12.Init.CounterModeTIM_COUNTERMODE_UP;htim12.Init.ClockDivisionTIM_CLOCKDIVISION_DIV1;HAL_TIM_Base_Init(htim12);HAL_TIM_Base_Start_IT(htim12);// TIM13 (ADC采樣觸發(fā))htim13.InstanceTIM13;htim13.Init.Prescaler0;htim13.Init.Period479;// 初始500KSPSHAL_TIM_Base_Init(htim13);HAL_TIM_Base_Start_IT(htim13);// TIM14 (DAC輸出觸發(fā))htim14.InstanceTIM14;htim14.Init.Prescaler0;htim14.Init.Period2399;// 初始100KHAL_TIM_Base_Init(htim14);HAL_TIM_Base_Start_IT(htim14);// PWM定時器 (TIM1/2/3/4/5/8)// 使用PWM輸出模式非中斷htim1.Init.Prescaler0;htim1.Init.Period24000;// 初始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的IRQnSTM32H743中斷向量表中TIM12~14與TIM8共用部分向量。八、定時器使用率統(tǒng)計類別使用數(shù)總數(shù)使用率高級定時器2(TIM1,TIM8)2100%通用定時器(32位)2(TIM2,TIM5)2100%通用定時器(16位)2(TIM3,TIM4)2100%通用定時器(其他)3(TIM12,13,14)650%基本定時器0(TIM6,7備用)20%合計91464%九、定時器擴(kuò)展能力擴(kuò)展場景可用定時器方案增加編碼器接口TIM6或TIM7配置為編碼器模式增加PWM通道TIM9或TIM10配置為PWM輸出增加外部脈沖計數(shù)TIM11配置為外部時鐘輸入增加定時記錄TIM6配置為周期定時D223有5個備用定時器TIM6/7/9/10/11擴(kuò)展能力充足。十、總結(jié)D223定時器系統(tǒng)分配實現(xiàn)了定時器時鐘用途頻率/優(yōu)先級TIM1240MHzPWM11~10kHzTIM2240MHzPWM21~10kHzTIM3240MHzPWM31~10kHzTIM4240MHzPWM41~10kHzTIM5240MHzPWM51~10kHzTIM8240MHzPWM61~10kHzTIM12240MHz1ms節(jié)拍1kHz/優(yōu)先級6TIM13240MHzADC采樣1~500kHz/優(yōu)先級5TIM14240MHzDAC輸出可變/優(yōu)先級5從6路PWM到3個功能定時器從240MHz時鐘到動態(tài)ARR/PSC計算D223的定時器系統(tǒng)為500KSPS高速采樣、DDS波形輸出和PWM電機(jī)控制提供了精確的時序基礎(chǔ)。5個備用定時器為功能擴(kuò)展預(yù)留了充足空間。下篇預(yù)告《D223 vs 國產(chǎn)競品對比分析》