STM32之所以能夠實現定時,是單片機內部在計數脈衝(來自晶振)
T=1/F (F為頻率)
例如:我們以51單片機舉例,假設單片機搭配12MHz的晶振,由於51單片機是12分頻(即1個機器周期有12個時鐘周期),則單片機的最小定時時間為
1 2 MHz / 2 = 1 MHz
Tt = 1 / 1 MHz = 1 us
最小定時時間T=1/1MHz=1us
51單片機定時器:
方式0 13位最大定時時間間隔2^13=8.192ms
方式1 16位最大定時時間間隔2^16=65.536ms
方式2 8位最大定時時間間隔2^8=256us
由此我們知道對於一個定時器而言要做到精確定時需要關注2個內容
1、分頻器(分頻比)
2、定時計數器的值
CK_CNT表示定時器工作頻率
TIMX_PSC表示分頻係數
則定時器的工作頻率計算公式為
CK_CNT=定時器時鐘/( TIMx_PSC+1)
由此我們可得到STM32單片機1個時鐘周期
為:T=1/ CK_CNT
例如普通定時器模塊的時鐘為72MH2,分頻比位7199,那麼我們想要得到一個1秒鐘的定時,定時計數器的值需要設定為 》 timx arr = 1 0 0 0 0
因為72000000/7200=10KHz時鐘周期T=1/10KHz=100us100us×10000=1S
結論:分頻比7199定時計數器的值10000
注意兩點:
(1)TIMx(1-8),在庫設置默認的情況下,都是72M的時鐘;
(2)TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
是重複計數,就是重複溢出多少次才給你來一個溢出中斷,
它對應的寄存器叫TIM1 RCR.
如果這個值不配置,上電的時候寄存器值可能隨機的,本來1秒中斷一次,可能變成N 秒中斷一次,讓計算量變大。
系統時鐘是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由 PCLK1 得到
關鍵是設定 時鐘預分頻數,自動重裝載寄存器周期的值
/*每1秒發生一次更新事件(進入中斷服務程序)。RCC_Configuration()的SystemInit()的
RCC-》CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK為72MHz。因此,每次進入中
斷服務程序間隔時間為
((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒 */
1、 TIM_TimeBaseStructure.TIM_Prescaler = 7199;//時鐘預分頻數 例如 :時鐘頻率=72/(時鐘預分頻+1)
2、TIM_TimeBaseStructure.TIM_Period = 9999; // 自動重裝載寄存器周期的值(定時時間) 累計 0xFFFF個頻率後產生個更新或者中斷(也是說定時時間到)
3、 TIM_TimeBaseStructure.TIM_CounterMode = TIM1_CounterMode_Up; //定時器模式 向上計數
4、 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //時間分割值
5、 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化定時器2
6、 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打開中斷 溢出中斷
7、 TIM_Cmd(TIM2, ENABLE);//打開定時器
或者:
TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分頻35999 72M/
(35999+1)/2=1Hz 1秒中斷溢出一次
TIM_TimeBaseStructure.TIM_Period = 2000; //計數值2000
((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1秒 */
打開APP閱讀更多精彩內容聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴