STM32共有8個定時計數器,
高級定時器: TIME1 TIME8
是通用定時器:TIME2~TIME5
基本定時器: TIME6和TIME7
以TIME3通用定時器為例總結定時計數器的基本用法
一:TIM3時鍾使能
APB1外設時鍾使能寄存器(RCC_APB1ENR)
Eg:RCC->APB1ENR|=1<<1; //使能TIM3時鍾
二:設置TIM3_ARR和TIM3_PSC的值
通過這兩個寄存器來設置自動重裝的值以及分頻系數
自動重裝載寄存器(TIMx_ARR)
預分頻器(TIMx_PSC)
三:設置TIM3_DIER允許更新中斷
中斷使能寄存器(TIMx_DIER)
Eg: TIM3->DIER|=1<<0; //允許更新中斷
四:允許TIM3工作
控制寄存器1(TIMx_CR1)
CEN:使能計數器 位0 0:禁止計數器; 1:使能計數器
Eg: TIM3->CR1|=0x01; //使能定時器3
或 TIM3->CR1|=1<<0;
五:TIM3中斷分組設置
直接調用MY_NVIC_Init()函數
Eg:MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//搶占1,子優先級3,組2
六:編寫中斷服務函數
狀態寄存器(TIMx_SR)
Eg: if(TIM3->SR&0X0001)//溢出中斷
Eg: //定時器3中斷服務程序
void TIM3_IRQHandler(void) //TIM3_Int_Init(5000,7199); //10Khz的計數頻率,計數到5000為500ms//500ms中斷一次
{
if(TIM3->SR&0X0001) //溢出中斷
{
//add your code
}
TIM3->SR&=~(1<<0); //清除中斷標志位
}
六:關於溢出事件的計算
因為Stm32_Clock_Init函數里面已經初始化APB1的時鍾為2分頻,所以APB1的時鍾是32MHz(系統時鍾72MHz)。
從STM32內部時鍾樹圖可知:
當APB1的時鍾分頻數為1時,TIM2~7的時鍾為APB1的時鍾;
而如果APB1的時鍾分頻數不為1,那么TIM2~7的時鍾頻率是APB1時鍾的兩倍。
因此TIM3的時鍾為72MHz,再根據arr和psc即可計算中斷時間
Tout = ( (arr+1) * (psc+1) ) / Tclk
其中,Tclk為TIM3的輸入時鍾頻率(單位:MHz)。
Tout為TIM3的溢出時間(單位:us)。
Eg:void TIM3_Int_Init(u16 arr,u16 psc)----->TIM3_Int_Init(5000,7199);//10Khz的計數頻率,計數到5000為500ms
Tout = (5000 * 7200)/72 = 500,000us = 500ms
示例程序
//定時器3中斷服務程序
void TIM3_IRQHandler(void) //TIM3_Int_Init(5000,7199);//10Khz的計數頻率,計數到5000為500ms
//500ms中斷一次
{
if(TIM3->SR&0X0001)//溢出中斷
{
LED1=!LED1; 9 }
TIM3->SR&=~(1<<0);//清除中斷標志位
}
//通用定時器中斷初始化
//這里時鍾選擇為APB1的2倍,而APB1為36M
//arr:自動重裝值。
//psc:時鍾預分頻數
//這里使用的是定時器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1; //TIM3時鍾使能
TIM3->ARR=arr; //設定計數器自動重裝值
TIM3->PSC=psc; //預分頻器設置
TIM3->DIER|=1<<0; //允許更新中斷
TIM3->CR1|=0x01; //使能定時器3
MY_NVIC_Init(1,3,TIM3_IRQn,2);//搶占1,子優先級3,組2
}
int main(void)
{
Stm32_Clock_Init(9); //系統時鍾設置
delay_init(72); //延時初始化
uart_init(72,9600); //串口初始化
LED_Init(); //初始化與LED連接的硬件接口
TIM3_Int_Init(5000,7199);//10Khz的計數頻率,計數到5000為500ms
while(1)
{
LED0=!LED0;
delay_ms(200);
}
}