在前邊講解系統時鐘和定時器時,曾給出一個實驗,實作的功能是:使用定時器0的功能,使LED每秒鐘閃爍一次,當時是使用查詢方式實作的,現在使用中斷方式實作上述功能。
下圖為我的工程檔案布局:
下面貼出我的代碼,你也可以去這裡下載下傳,
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