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

編輯:ls 最后修改時(shí)間:2022-06-07