天天看點

一起學mini2440裸機開發(十一)--mini2440定時器0中斷實驗

   在前邊講解系統時鐘和定時器時,曾給出一個實驗,實作的功能是:使用定時器0的功能,使LED每秒鐘閃爍一次,當時是使用查詢方式實作的,現在使用中斷方式實作上述功能。

   下圖為我的工程檔案布局:

一起學mini2440裸機開發(十一)--mini2440定時器0中斷實驗

   下面貼出我的代碼,你也可以去這裡下載下傳,

   http://download.csdn.net/detail/mybelief321/5457371  下載下傳下來之後,直接編譯,點選Flash/Download ,下載下傳到nor flash中運作。

   main.c檔案

#include"led.h"

#include"timer.h"

#include"isrservice.h"

#include"interrupt.h"

unsigned int flag=0;

int main()

{   

 Led_Init();             //初始化LED

 Timer0_Init();       //定時器0初始化

 Timer0_Interrupt_Init();     //定時器0中斷初始化

 while(1)            //循環,等待中斷發生

 {  

  if(flag)

  {

   Led2_On();

  }

  else

  {       

   Led2_Off();

  }

 }

}

     led.c檔案

#include<s3c2440.h>

void Led_Init(void)

{

  GPBCON&=~((3<<10)|(3<<12)|(3<<14)|(3<<16));

  GPBCON|=((1<<10)|(1<<12)|(1<<14)|(1<<16));  //設定GPB5-8口為輸出功能

  GPBUP&=~((1<<5)|(1<<6)|(1<<7)|(1<<8)); //上拉電阻使能

  GPBDAT|=(1<<5)|(1<<6)|(1<<7)|(1<<8); //令GPBDAT5-8均為高電平,即令4個led燈全滅

}

    led.h檔案

#ifndef __LED_H__

#define __LED_H__

#include<s3c2440.h>

#define Led1_On()  {GPBDAT&=(~(1<<5));}

#define Led1_Off()  {GPBDAT|=(1<<5);}

#define Led2_On()  {GPBDAT&=(~(1<<6));}

#define Led2_Off()  {GPBDAT|=(1<<6);}

#define Led3_On()  {GPBDAT&=(~(1<<7));}

#define Led3_Off()  {GPBDAT|=(1<<7);}

#define Led4_On()  {GPBDAT&=(~(1<<8));}

#define Led4_Off()  {GPBDAT|=(1<<8);}

void Led_Init(void);

#endif

    timer.c檔案

#include<s3c2440.h>   //s3c2440.h對S3C2440晶片的一些位址的宏定義

#include"timer.h"

void Timer0_Init(void)

{

 TCFG0&=~(0xff);    //設定第1級分頻系數,分頻系數為99

 TCFG0|=99;

 TCFG1&=~(0xf);      //設定第2級分頻系數,分頻系數為8

 TCFG1|=0x02;  //62.5KHz=50MHz/(99+1)/8

 TCNTB0=62500;       //1s中斷一次。經過上述分頻器得到定時器0的輸入時鐘頻率為62.5kHz,即定時器

                     //每秒鐘計數62500次。是以,初始化時,定時器0計數值初始值為62500

      //在這裡我們可以看出TCMPBn沒有設定,因為咱們用它的預設值0,是以就不需要設定

 TCON|=(1<<1); //開啟手動更新位,即當定時器開啟後,TCMPB0和TCNTB0中的值會加載到寄存器TCMP0和TCNT0中

 TCON=0x09;     //關閉手動更新位,設定自動加載位,同時開啟定時器,這樣,TCNT0進行減1計數,當TCNT0中的計

                 //數值減到0時,TCNTB0、TCMPB0中的資料分别會自動加載到TCNT0、TCMP0中并進行新一輪的減1計數

}

     timer.h檔案

#ifndef __TIMER_H__

#define __TIMER_H__

void Timer0_Init(void);

#endif

    interrupt.c檔案

#include<s3c2440.h>

#include"interrupt.h"

void Timer0_Interrupt_Init(void)

 INTMSK&=~(1<<10);   //将定時器0中斷屏蔽位設為無效,這樣當

                                     //定時器0發生中斷時,中斷請求信号可以

}                                    //順利到達CPU

    interrupt.h檔案

#ifndef __INTERRUPT_H__

#define __INTERRUPT_H__

void Timer0_Interrupt_Init(void);

#endif

     isrservice.c檔案

#include<s3c2440.h>

#include"isrservice.h"

extern unsigned int flag; //聲明外部變量flag,該變量是在main.c檔案中定義的

                                      //當1s到來時,中斷響應函數将該變量值取反,在主

                                     //程式中通過檢測該變量的值來實作不同的操作

void __irq IRQ_Handler(void) //注意這個函數名字要和S3C2440.s處的跳轉标号相同   

{

 flag=!flag;   //1s時間到,flag值取反

 SRCPND|=1<<10; //清除中斷标志位

 INTPND|=1<<10;

}

       isrservice.h檔案

#ifndef __ISRSERVICE_H__

#define __ISRSERVICE_H__

void __irq IRQ_Handler(void);

#endif

   千萬要記得下載下傳到nor flash中啊,如果不會,請看部落格:

    http://blog.csdn.net/mybelief321/article/details/8954788

繼續閱讀