通用定時器的功能非常強大,能夠測量輸入信號的脈沖長度(輸入捕獲)或者產(chǎn)生輸出波形(輸出比較和PWM),也能夠用于定時中斷任務(wù)。其實系統(tǒng)滴答和實時時鐘功能類似于定時器。51單片機也有定時器,可以使用軟件的方式實現(xiàn)實時時鐘的功能,就是斷電后會到初始狀態(tài)了。
神舟IV開發(fā)板采用的是STM32F107VCT,內(nèi)部含有多達(dá)10個定時器,其中TIM1和TIM8是高級控制定時器在APB2總線上,TIM2—TIM7是掛在APB1上的,所以使用起來要注意的是,開啟不同的時鐘。
我們就用通用定時器TIM2實現(xiàn)LED以1s速度流水燈的功能。首先我們看看時鐘,TIM2掛在APB1總線上,而APB1的最大時鐘速度為36MHZ。由于系統(tǒng)初始化將APB1的分頻比設(shè)置為2,所以TIM2的時鐘就是APB1時鐘的2倍,等于系統(tǒng)時鐘。TIM2具有16位可編程預(yù)分頻器,范圍可以從1到65536之間。這里我們設(shè)置分頻比為7200,得到10KHZ的計數(shù)時鐘。再設(shè)置自動裝載的計數(shù)值為10000,這樣就得到1s的定時器間隔,最后使能中斷,配置中斷函數(shù)。
主要代碼為:
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Set the Vector Table base address at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);
/* Enable the TIM5 gloabal Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
int main(void)
{
/* Setup STM32 system (clock, PLL and Flash configuration) */
SystemInit();
/* Add your application code here
*/
LED_Configuration();//LED時鐘和端口配置
TIM2_Configuration();//TIM2時鐘和端口配置
NVIC_Configuration();//中斷配置
/* Infinite loop */
while (1)
{
}
}
void TIM2_IRQHandler(void)//定時器中斷函數(shù)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
LED_Spark();//led流水燈
}
}