的定時器由2個基本定時器(TIM6、TIM7)、4個通用定時器(TIM2-TIM5)和2個高級定時器(TIM1、TIM8)組成。每個通用定時器都是完全獨立的,沒有 互相共享的任何資源。
有的朋友就會問,這個定時 500ms 是怎么計算的? 很簡單,我們知道 TIM4 是掛接在 APB1 總線上的,而 APB1 的時鐘是 36MHz, 前面介紹定時器就說過,如果 APB1 時鐘分頻系數為 1,TIM2-7 的時鐘即為 APB1 總線的時鐘什么是定時器中斷函數,否則就是 APB1 總線時鐘的 2 倍什么是定時器中斷函數,即 72MHz。
再根據剛才設計的自 動重裝載值和預分頻系數就可以計算出定時時間,計算公式如下: Tout= ((per)(psc+1))/Tclk; Tclk 是定時器的時鐘頻率值,72M,per(定時周期即重加載數) 和 psc(預分配系數) 是我們傳遞的參數值,Tout 是定時器產生中斷的時間,單位是 us。將數據代入即可得到產生定時更新中斷 時間是 500ms。
()/72 = 500,000us = 500ms
開啟定時器時鐘定時器初始化設置定時器中斷類型并使能清除定時器中斷標志位設置NVIC優先級開啟定時器定時器中斷服務函數
現象:led1間隔200ms閃爍,led2間隔500ms閃爍
*time.c
#include "time.h"
#include "led.h"
void TIM4_Init(u16 per,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //定時器初始化結構體(2*)
NVIC_InitTypeDef NVIC_InitStructure;
//1*開啟TIM4定時器時鐘

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
//2*定時器初始化,在time.c的stm32f10x_tim.h中
TIM_TimeBaseInitStructure.TIM_Period = per; //定時周期即重加載數
TIM_TimeBaseInitStructure.TIM_Prescaler = psc; //預分配系數
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //計數模式配置:向上計數
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //分頻因子,用于信號捕捉,不捕捉就用1
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
//3*設置定時器中斷類型并使能
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
//4*清除定時器中斷標志位,防止一開始就進入中斷
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);

//5*設置NVIC的中斷優先級
NVIC_InitStructure.NVIC_IRQChannel =TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//6*開啟定時器
TIM_Cmd(TIM4,ENABLE);
}
//7*定時器中斷服務函數,函數名固定,在開啟文件里找
void TIM4_IRQHandler()

{
if(TIM_GetITStatus(TIM4,TIM_IT_Update)==1)
{
led2=!led2;
}
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
}
time.h
#ifndef _time_H
#define _time_H
#include "system.h"

void TIM4_Init(u16 pre,u16 psc);
#endif
main.c
#include "systick.h"
#include "led.h"
#include "system.h"
#include "time.h"
int main()
{
u8 i;
SysTick_Init(72); //系統時鐘初始

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//在misc.c里的misc.h中尋找
LED_INIT();
TIM4_Init(1000,36000-1); //500ms,定時時間計算公式:((per)*(psc+1))/Tclk,
//預分頻系數為 36000-1,這里減 1 是因為定時器預分頻器內部會自動加 1, 所以如果要進行 36000 分頻的話,就傳遞 35999。
while(1)
{
i++; //每加20就變led狀態,每次延時10ms,200ms變換一次
if(i%20==0)
{
led1=!led1;
}
delay_ms(10);
}
}