首先定義定時器頭文件,也就是定義寄存器以供操作:
本文引用地址:
http://2s4d.com/article/201611/318954.htm//*************************************************************************
//
// TIM2-Register
//
//*************************************************************************
#define TIM2_CR1(*((volatile unsigned long *)0x40000000))
#define TIM2_CR2(*((volatile unsigned long *)0x40000004))
#define TIM2_DIER(*((volatile unsigned long *)0x4000000C))
#define TIM2_SR(*((volatile unsigned long *)0x40000010))
#define TIM2_EGR(*((volatile unsigned long *)0x40000014))
#define TIM2_CNT(*((volatile unsigned long *)0x40000024))
#define TIM2_PSC(*((volatile unsigned long *)0x40000028))
#define TIM2_ARR(*((volatile unsigned long *)0x4000002C))
然后配置定時器TIM2:
void TIM2_Configuration(void)
{
RCC_APB1ENR|=0x00000001; //位0 IM2EN TIM2定時器時鐘使能
TIM2_PSC |=19999; //設置預分頻,實現(xiàn)1ms,20M ,20000/20M
TIM2_ARR = 1000;//1s產(chǎn)生一次中斷
TIM2_DIER |=0X1;//允許tim2更新中斷
SETENA0|=0x10000000;//允許T2中斷
TIM2_CR1 |=0X1;//啟動tim2相當于//TIM_Cmd(TIM2, ENABLE); //是能定時器
}
注:RCC_APB1ENR,SETENA0前面的文章已經(jīng)定義過
中斷函數(shù)處理:
void TIM2_IRQHandler(void)
{
if(TIM1_SR&0x01)
{
TIM1_SR&=0xFFFE;//清中斷標志
USART1_DR=0xAA;
while((USART1_SR)&0x80==0);
}
解釋:1S中斷來一次,向串口發(fā)送一字節(jié)數(shù)據(jù)0xAA;
接下來就在main()函數(shù)中添加配置定時器就可以了:
int main()
{
SystemInit0();//系統(tǒng)(時鐘)初始化
stm32_GpioSetup (); //GPIO初始化
stm32_UsartSetup ();//串口初始化
TIM2_Configuration();//TIM1初始化
while(1)
{
GPIO_PORTB_ODR|=(1<<5); //LED閃爍
delay(10); //延時
GPIO_PORTB_ODR&=~(1<<5);
delay(10);
}
}
當然以上TIM2的配置必須在系統(tǒng)(時鐘)初始化以后,因為這些外設的工作要有時鐘來源的,知道了時鐘來源,和頻率才能計算出定時的時間等參數(shù),本程序是基于所有時鐘都設置成20M來執(zhí)行的。前面的幾個初始化函數(shù)以及寄存器設置都是調(diào)用的前面文章中設置好的。
好了,查看串口(9600),調(diào)試成功,1S發(fā)送1個0xAA,這樣看起來是很簡單,但調(diào)試的過程是艱難的,要一次次的實驗,一個寄存器一個寄存器的進行配置,學習本來就是一個緩慢而且艱辛的過程,但是當你看到LED在閃爍,串口上收到數(shù)據(jù)時,說有的付出都是值得的,天道酬勤,一切困難都是紙老虎!
評論