STM32F407有14個定時器,其中有12個16位的定時器,2個32位的定時器
這幾種定時器的區別
定時器的溢出時間計算:
Tout(溢出時間)=(ARR+1)(PSC+1)/Tclk
ARR:自動重裝載寄存器,用於裝載計數器
PSC:PSC預分頻器(分頻範圍1~65535)
Tclk:USART1的外設時鐘週期,可以在STM32F407的芯片手冊中找到時鐘框圖
用定時器3,做一個實驗:
目標使用定時器進行500ms的led閃爍
//聲明一個GPIO結構體變量
GPIO_InitTypeDef GPIO_InitStructure;
//聲明一個定時器結構體變量
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructrue;
//聲明一箇中斷優先分組的結構體變量
NVIC_InitTypeDef NVIC_InitStructure;
//使能GPIO外設時鐘
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
//定義一個GPIO結構體變量
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 |GPIO_Pin_10;//對應引腳分別接到Led0,led1
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; //GPIO爲輸出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; //100MHZ
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //推輓輸出
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure);
//¶設置定時器中斷的優先分組
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //搶佔優先級爲1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //響應優先級爲3
TIM_TimeBaseInitStructrue.TIM_Period=4999; //Tout=(ARR+1)(PSC+1)/Tclk (4999+1)(8399+1)/(1/84M)
TIM_TimeBaseInitStructrue.TIM_Prescaler=8399;
TIM_TimeBaseInitStructrue.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructrue.TIM_ClockDivision=TIM_CKD_DIV1;
//使能定時器3的外設時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//初始化定時器3
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructrue);
//設置優先級分組 爲組2
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//初始化優先級分組
NVIC_Init(&NVIC_InitStructure);
//配置定時器的中斷的中斷源
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
//使能定時器3
TIM_Cmd(TIM3,ENABLE);
while(1)
{
//無限循環等待中斷
}
}
//定時器3的中斷函數
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
LED0=!LED0;
LED1=!LED1;
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
}
此時就可以進行led每隔500ms翻轉