優秀文章
https://blog.csdn.net/qq_38351824/article/details/82619734
一、STM32通用定時器(TIM2、TIM3、TIM4和TIM5共四個通用定時器,它們之間完全獨立,不共享任何資源)
STM32F1系列的通用定時器是一個通過可編程預分頻器(PSC)驅動的16位自動重裝載計數器(CNT)構成,
STM32的通用計時器可用于:
測量輸入信號的脈沖長度(輸入捕獲)
產生輸出波形(輸出比較和PWM)
使用定時器預分頻器和RCC時鐘控制器預分頻器,脈沖長度和波形周期可以在幾個微秒到幾個毫秒間調整,
通用定時器TIMx功能:
1、16位向上、向下、向上/向下自動裝載計數器(TIMx_CNT),
2、16位可編程(可以實時修改)預分頻器(TIMx_PSC),計數器時鐘的分頻系數為1~65535之間的任意值(2^16=65535),
3、每個通用定時器有4個獨立通道(TIMx_CH1~4),可以用作
A、輸入捕獲
B、輸出比較
C、PWM生成(邊緣或中間對齊模式)
D、單脈沖模式輸出
4、可使用外部信號(TIMx_ETR)控制定時器和定時器互連(用一個定時器控制另外一個定時器)的同步電路,
5、產生中斷/DMA的觸發來源:
A、更新:計數器向上溢位/向下溢位,計數器初始化(通過軟體或者外部/內部觸發)
B、觸發事件(計數器啟動、停止、初始化或者由內部/外部觸發)
C、輸入捕獲
D、輸出比較
E、支持針對定位的增量(正交)編碼器和霍爾傳感器電路
F、觸發輸入作為外部時鐘或者按周期的電流管理
二、定時器的計數模式
1、向上計數模式:計數器從0計數到自動重裝載值(TIMx_ARR),然后重新從0開始計數并且產生一個計數器溢位事件,
2、向下計數模式:計數器從自動裝入的值(TIMx_ARR)開始向下計數到0,然后從自動裝入的值重新開始,并產生一個計數器向下溢位事件,
3、中央對齊模式(向上/向下計數):計數器從0開始計數到重裝載值-1,產生一個計數器溢位事件,然后向下計數到1并產生一個計數器溢位事件,然后再從0開始重新計數,
三、定時器溢位時間
Tout(溢位時間)= (ARR+1)(PSC+1)/Tclk
ARR:自動重裝值
PSC:預分頻系數
Tclk:APB1倍頻得到的(APB1的分頻系數為1,Tclk等于APB1,不等于1時,則Tclk等于APB1的兩倍)
四、軟體設計
使用定時器中斷3控制LED1和LED2閃爍
子函式
1 #include "timer.h" 2 #include "led.h" 3 4 void TIM3_Int_Init(u16 arr, u16 psc) //定時器3初始化, 5 { 6 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; // 7 NVIC_InitTypeDef NVIC_Init_Structure; // 8 9 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定時器3時鐘10 11 TIM_TimeBaseInitStructure.TIM_Period = arr; //自動重裝載值12 TIM_TimeBaseInitStructure.TIM_Prescaler = psc; //預分頻系數13 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數14 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //15 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); //16 17 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //開啟定時器中斷,更新中斷18 19 20 //中斷優先級21 NVIC_Init_Structure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中斷22 NVIC_Init_Structure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能23 NVIC_Init_Structure.NVIC_IRQChannelPreemptionPriority = 0; //先占優先級0級24 NVIC_Init_Structure.NVIC_IRQChannelSubPriority = 3; //從優先級3級25 NVIC_Init(&NVIC_Init_Structure); //初始化NVIC暫存器NVIC26 27 TIM_Cmd(TIM3, ENABLE); //使能定時器28 }29 30 void TIM3_IRQHandler(void)31 {32 if(TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET) //狀態標志位獲取33 {34 LED1 = !LED1;35 TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //狀態標志位清除36 }37 }
主函式
1 #include "stm32f10x.h" 2 #include "led.h" 3 #include "delay.h" 4 #include "wdg.h" 5 #include "key.h" 6 #include "beep.h" 7 #include "timer.h" 8 9 int main(void)10 {11 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中斷優先級分組,載misc檔案中12 delay_init(); //延時初始化13 LED_Init(); //LED初始化14 15 TIM3_Int_Init(4999, 7199); //定時器中斷初始化16 17 while(1)18 {19 LED2 = !LED2;20 delay_ms(200);21 }22 23 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/36225.html
標籤:嵌入式
上一篇:IAR8.X安裝教程
