靈動微MM32定時器操作指南
1、定時器同步
在MM32L073一個定時器有4 通道 PWM 輸出,有客戶在應(yīng)用中需要使用兩個定時器控制6路PWM輸出,為了使兩個定時器的PWM輸出相同的波形,所以需要兩個定時器實(shí)現(xiàn)同步功能。
所有 TIMx 定時器在內(nèi)部相連,用于定時器同步或鏈接。當(dāng)一個定時器處于主模式時,它可以對另一個處于從模式的定時器的計數(shù)器進(jìn)行復(fù)位、啟動、停止或提供時鐘等操作。
MM32L073的每個定時器都可以由另一個定時器觸發(fā)啟動定時器一般是通過軟件設(shè)置而啟動,MM32L073的每個定時器也可以通過外部信號觸發(fā)而啟動,還可以通過另外一個定時器的某一個條件被觸發(fā)而啟動。這里所謂某一個條件可以是定時到時、定時器超時、比較成功等許多條件。這種通過一個定時器觸發(fā)另一個定時器的工作方式稱為定時器的同步,發(fā)出觸發(fā)信號的定時器工作于主模式,接受觸發(fā)信號而啟動的定時器工作于從模式。
主/從定時器的例子
為了實(shí)現(xiàn)兩個定時器完全同步,使用一個定時器作為另一個定時器的預(yù)分頻器?梢耘渲枚〞r器 1 作為定時器 3 的預(yù)分頻器。
參考上圖,進(jìn)行下述操作:
˜配置定時器 1 為主模式,它可以在每一個更新事件 UEV 時輸出一個周期性的觸發(fā)信號。在TIM1_CR2寄存器的MMS = ‗010時,每當(dāng)產(chǎn)生一個更新事件時在 TRGO1上輸出一個上升沿信號。
˜連接定時器 1 的 TRGO1 輸出至定時器 3,設(shè)置 TIM3_SMCR 寄存器的 TS = ‗000 ,配置定時器 3為使用 ITR1 作為內(nèi)部觸發(fā)的從模式。
˜然后把從模式控制器置于外部時鐘模式 1(TIM3_SMCR 寄存器的 SMS = 111);這樣定時器 3即可由定時器 1 周期性的上升沿(即定時器 1 的計數(shù)器溢出)信號驅(qū)動。
˜最后,必須設(shè)置相應(yīng)(TIMx_CR1 寄存器)的 CEN 位分別啟動兩個定時器。
注:如果 OCx 已被選中為定時器 1 的觸發(fā)輸出(MMS = 1xx),它的上升沿用于驅(qū)動定時器 3 的計數(shù)器。
void Tim1_Init(u16 Prescaler,u16Period)
{
TIM_TimeBaseInitTypeDefTIM_StructInit;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
TIM_StructInit.TIM_Period=Period;
TIM_StructInit.TIM_Prescaler=Prescaler;
TIM_StructInit.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_StructInit.TIM_CounterMode=TIM_CounterMode_Up;
TIM_StructInit.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM1,&TIM_StructInit);
TIM_ClearFlag(TIM1,TIM_FLAG_Update);
}
void TIM3_Init(u16 psc,u16 arr)
{
TIM_TimeBaseInitTypeDefTIM_StructInit;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_StructInit.TIM_Period=arr;
TIM_StructInit.TIM_Prescaler=psc;
TIM_StructInit.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_StructInit.TIM_CounterMode=TIM_CounterMode_Up;
TIM_StructInit.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM3,&TIM_StructInit);
TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_Enable);
TIM_SelectInputTrigger(TIM1,TIM_TS_ITR2);
TIM_SelectSlaveMode(TIM1,TIM_SlaveMode_Gated);
TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable);
TIM3->CNT=0;
TIM1->CNT=0;
TIM_Cmd(TIM1, ENABLE);
delay_ms(300);
TIM_Cmd(TIM3, ENABLE);
delay_ms(300);
}
2、定時器精準(zhǔn)延時
在應(yīng)用中,有的需要精準(zhǔn)的定時功能,在客戶支持過程中,發(fā)現(xiàn)有的客戶對定時器的基本定時功能的理解有些偏差,今天將與大家一起使用定時器的基本定時功能。
我們把定時器設(shè)置自動重裝載寄存器 ARR 的值為1000,設(shè)置時鐘預(yù)分頻器為47,則驅(qū)動計數(shù)器的時鐘: CK_CNT = CK_INT / (47+1)=1M,則計數(shù)器計數(shù)一次的時間等于:1/CK_CNT=1us,當(dāng)計數(shù)器計數(shù)到 ARR 的值1000 時,產(chǎn)生一次中斷,則中斷一次的時間為:1/CK_CNT*ARR=1ms。
void Tim2_UPCount_test(void){
TIM_TimeBaseInitTypeDefTIM_StructInit;
NVIC_InitTypeDef NVIC_StructInit;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_StructInit.TIM_Period=1000;
TIM_StructInit.TIM_Prescaler=47;
TIM_StructInit.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_StructInit.TIM_CounterMode=TIM_CounterMode_Up;
TIM_StructInit.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM2,&TIM_StructInit);
NVIC_StructInit.NVIC_IRQChannel=TIM2_IRQn;
NVIC_StructInit.NVIC_IRQChannelPriority=1;
NVIC_StructInit.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_StructInit);
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
定時器中斷一次的時間是 1ms,我們定義一個全局變量ucTim2Flag,每當(dāng)進(jìn)一次中斷的時候,讓 ucTim2Flag來記錄進(jìn)入中斷的次數(shù)。如果我們想實(shí)現(xiàn)一個 1s 的定時,我們只需要判斷time 是否等于1000 即可,1000 個 1ms 就是1s。然后把ucTim2Flag清 0,重新計數(shù),以此循環(huán)往復(fù)。
void TIM2_IRQHandler(void)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
ucTim2Flag++;
}
編輯:ls 最后修改時間:2022-06-07