日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

stm32 定时器初步

發布時間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stm32 定时器初步 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天學習STM32 的通用定時器:TIMx (TIM2、TIM3、TIM4 和 TIM5)。

定時器比較復雜,功能繁多,這里我們就說最基本的計數功能。

1.定時器的時鐘從哪里來?

定時器的時鐘來源有 4 個:?
1)內部時鐘(CK_INT)
2)外部時鐘模式 1:外部輸入腳(TIx)?
3)外部時鐘模式 2:外部觸發輸入(ETR)?
4)內部觸發輸入(ITRx):使用 A 定時器作為 B 定時器的預分頻器(A 為 B 提供時鐘)?
這些時鐘,具體選擇哪個可以通過 TIMx_SMCR 寄存器的相關位來設置。我們的實驗選擇內部時鐘。

注意:這里的 CK_INT時鐘是從 APB1 倍頻(*1或者*2)的來的:

如果 APB1 的時鐘分頻數設置為 1,那么就等于PCLK1;

如果 APB1 的時鐘分頻數設置不等于1,那么就等于PCLK1*2。

本實驗中,APB1的預分頻=2,所以TIMxCLK = PCLK1 * 2 = 36MHz * 2 = 72MHz.


看圖就明白了。



2.兩個關鍵的參數

1) ?PSC[15:0]:預分頻器的值 (Prescaler value)?

計數器的時鐘頻率CK_CNT等于F_CK_PSC /(PSC[15:0]+1)。?

假設我們的PSC[15:0]取值是7199,那么F_timx = 72MHz / 7200 = 10KHz,T = 1/10000 s?

2) ? ??ARR[15:0]: 自動重裝載的值 (Auto reload value)?

假設我們令其等于4999,如果設置了更新中斷,那么中斷的周期是 (4999+1)* 1/10000 s = 0.5s


3.代碼怎么寫?

//TIM3的初始化 //時鐘是72M //arr : 自動重裝載值 //psc: 預分頻值void TIM3_Int_Init(u16 arr,u16 psc) {TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //外設時鐘使能//TIM3初始化TIM_TimeBaseStructure.TIM_Period = arr; //自動重裝載值TIM_TimeBaseStructure.TIM_Prescaler =psc; //預分頻值TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //使能更新中斷//中斷優先級配置NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM3, ENABLE); //開啟時鐘 }中斷程序如下

//定時器3的中斷服務程序 void TIM3_IRQHandler(void) {if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //發生了更新中斷{TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除中斷標志LED1=!LED1; //LED翻轉} }主函數如下

int main(void) { delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置中斷分組LED_Init(); //LED初始化TIM3_Int_Init(4999,7199);//定時器3初始化// T = 1/[72MHz/(7199+1)] * (4999+1) s = 0.5swhile(1){LED0=!LED0;delay_ms(200); } }
實驗結果:LED0每隔200ms 翻轉一次,LED1 每隔500ms翻轉一次。

仿真結果:




總結

以上是生活随笔為你收集整理的stm32 定时器初步的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。