優秀文章 https://blog.csdn.net/qq_38351824/article/details/82619734 一、STM32通用定時器(TIM2、TIM3、TIM4和TIM5共四個通用定時器,它們之間完全獨立,不共用任何資源) STM32F1系列的通用定時器是一個通過可編程預分頻器 ...
優秀文章
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寄存器NVIC 26 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 }