STM學(xué)習(xí)筆記——用定時(shí)器實(shí)現(xiàn)熒火蟲(chóng)燈
在第6篇筆記中,我用軟件延時(shí)的方法實(shí)現(xiàn)了熒火蟲(chóng),學(xué)了定時(shí)器,當(dāng)然就要用一用定時(shí)器了,這里仍是用熒火蟲(chóng)燈為例。
用ST庫(kù)所帶的例子Tim中的TimBase為例來(lái)修改,這個(gè)例子的位置以及如何建立工程請(qǐng)參考第7篇筆記,這里就不再重復(fù)了,下面簡(jiǎn)述一下修改的過(guò)程。
(1) 由于我的板子上的燈是由PD8~PD11來(lái)控制的,因此,要將
void RCC_Configuration(void)
中的:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //打開(kāi)GPIOC的時(shí)鐘
改為
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //打開(kāi)GPIOD的時(shí)鐘
?。?) 將四個(gè)通道全部設(shè)置為T(mén)IM_OCMode_Toggle模式,即將
/* Output Compare Timing Mode configuration: Channel1 *
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
改為:
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
?。?)例子中原來(lái)中斷產(chǎn)生的頻率很低,是不適合于做這種熒火蟲(chóng)燈的,但為了比較,我只改了最后一個(gè)值:
__IO uint16_t CCR4_Val = 8192;改為
__IO uint16_t CCR4_Val = 2048;
這樣,這個(gè)通道的中斷頻率變?yōu)?/p>
CC4 update rate = TIM2 counter clock / CCR4_Val = 3515.6 Hz
(4) 到stm32f10x_it.c中作修改中斷處理函數(shù)如下:
uint8_t allCount=16;
uint8_t upDown1,upDown2,upDown3,upDown4;
void TIM2_IRQHandler(void)
{ static uint8_t Count1,Count2,Count3,Count4;
static uint8_t hCnt1,hCnt2,hCnt3,hCnt4;
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
if(Count1《hCnt1)
{ GPIO_SetBits(GPIOD, GPIO_Pin_8); //點(diǎn)亮燈
}
else
{ GPIO_ResetBits(GPIOD, GPIO_Pin_8); //熄滅燈
}
Count1++;
if(Count1》=allCount)
{ Count1=0;
if(upDown1)
{ hCnt1++;
if(hCnt1》=(allCount-1))
upDown1=!upDown1;
}
else
{ hCnt1--;
if(hCnt1《2)
upDown1=!upDown1;
}
}
電子發(fā)燒友App











評(píng)論