;
}
voidMain()
{
rGPBCON=0x15400;//GPB寄存器配置
rGPBDAT=0X1e0;
rGPBUP=0x7ff;
while
(1)
{
rGPBDAT=0X0;
Delay(10000);
rGPBDAT=0X1e0;
Delay(10000);
}
}
实验二:
S3C2440定时器中断控制
一、实验目的:
用S3C2440的定时器4来精确定时1s,让开发板的蜂鸣器每隔2s响一次,持续时间是0.5s,蜂鸣器响的同时伴随着LED亮。
2、实验原理和内容:
1.时钟源设置:
由开发板原理图可知,OM3和OM2都为低,外部晶振为12MHZ,所以该开发板的时钟源和USB时钟源都是12MHZ的晶振。
2.锁相环(PLL):
Mpll=(2*m*Fin)/(p*2s)
m=M(分频器M的值)+8,p=P(分频器P的值)+2
3.FCLK,HCLK和PCLK:
FCLK:
内和时钟。
HCLK:
AHB。
PCLK:
APB。
4.时钟发生器和电源管理特殊寄存器:
三、实验步骤:
1.首先在ADS上建立一个工程,工程名为timer_buzzer_led,然后选择一个和适的路径存放。
2.将光盘中TQ2440测试程序里面inc和src文件夹下的2440addr.h,2440lib.h,2440slib.h,def.h,Nand.h,Option.h,2440addr.inc,Mencfg.inc,Option.inc,2440init.s,2440slib.s,2440lib.c,nand.c这13个文件依次拷贝到刚才建立工程的文件夹下。
3.新建一个源文件,命名为timer_buzzer_led.c,存放到工程名为timer_buzzer_led的文件夹下。
4.在timer_buzzer_led.mcp下创建一个分组,取名为startcode,然后将前面拷贝的3个文件夹2440init.s,2440slib.s,nand.c依次添加到以startcode命名的文件夹下。
5.将timer_buzzer_led.c添加到工程里面去。
6.配置DebugrelSettings。
7.在timer_buzzer_led.c里面进行程序的书写。
8.编译所写程序。
9.将开发板,仿真器和电脑正确连接,打开Hjtag软件,调试程序。
10.观察开发板上的led亮灭情况及蜂鸣器的发声。
四、实验数据和结果:
蜂鸣器每隔2S响一次,持续时间是0.5S,蜂鸣器响的同时伴随着LED亮。
五、实验总结:
通过此次试验我掌握S3C2440I/O寄存器的配制方法,中断寄存器的配置,定时器中断控制I/O寄存器。
六、程序代码
#include"2440addr.h"
voidLed_Init(void)//led初始化
{rGPBCON&=~(3<<10);
rGPBCON|=(1<<10);
rGPBUP&=~(1<<5);
rGPBDAT|=(1<<5);
}
voidTimer4_Init(void)
{
rTCFG0&=0x0;
rTCFG0|=99;
rTCFG1&=~(0xf);
rTCFG1|=0x02;
rTCNTB04=125000;//2s中断一次
rTCON|=(1<<1);
rTCON=0x09;
}
voidBeep_Init(void)//蜂鸣器初始化
{
rGPBCON&=~(3<<0);
rGPBCON|=(1<<0);
rGPBUP&=~(1<<0);
rGPBDAT&=~(1<<0);
}
voidTimer0_Interrupt_Init(void)//中断服务函数
{
rINTMSK&=~(1<<10);
}
实验三PWM
1、实验目的:
用PWM来驱动蜂鸣器,并通过改变脉宽来改变蜂鸣器的发生频率,脉宽从低到高,再从高到低,周而复始。
并利用4个LED来指示脉宽的高低,最高时全亮,最低时全灭。
2、实验原理和内容:
S3C2440一共有5个16位的定时器,其中4个定时器具有脉宽调制功能因此用S3C2440可以很容易的实现PWM功能。
三、实验步骤:
1.首先在ADS上建立一个工程,工程名为PWM,然后选择一个和适的路径存放。
2.将光盘中TQ2440测试程序里面inc和src文件夹下的2440addr.h,2440lib.h,2440slib.h,def.h,Nand.h,Option.h,2440addr.inc,Mencfg.inc,Option.inc,2440init.s,2440slib.s,2440lib.c,nand.c这13个文件依次拷贝到刚才建立工程的文件夹下。
3.新建一个源文件,命名为PWM.c,存放到工程名为PWM的文件夹下。
4.在PWM.mcp下创建一个分组,取名为startcode,然后将前面拷贝的3个文件夹2440init.s,2440slib.s,nand.c依次添加到以startcode命名的文件夹下。
5.将PWM.c添加到工程里面去。
6.配置DebugrelSettings。
7.在PWM.c里面进行程序的书写。
8.编译所写程序。
9.将开发板,仿真器和电脑正确连接,打开Hjtag软件,调试程序。
10.观察开发板上的led亮灭情况及蜂鸣器的发声。
四、实验数据和结果:
依次亮到全亮,再依次灭,到全灭。
五、实验总结:
通过此次试验我掌握S3C2440外部中断的工作原理,熟练掌握了外部中断来控制其他资源。
六、程序代码
#include"2440addr.h"
voidclk_div()//配置时钟分频
{
rMPLLCON=(127<<12)|(2<<4)|1;
rCLKDIVN=(2<<1)|1;
}
voidDelay(unsignedintdata)//定义延时函数
{
unsignedinti,j;
for(i=0;ifor(j=0;j}
voidTimer0_Init()//定时器0初始化
{
rTCFG0&=0xffff00;
rTCFG0|=249;
rTCFG1&=0xfffff0;
rTCFG1|=2;
rTCNTB0=25000;
rTCON&=~0xf;
rTCON|=0xf;
rTCON&=~0x2;
}
voidMain()
{
intfreq;
freq=0;
clk_div();
Timer0_Init();
rGPBCON=0x15400;//LED初始化
rGPBDAT=(1<<5)|(1<<6)|(1<<7)|(1<<8);
rGPBUP=0x7ff;
rTCMPB0=freq;
while
(1)//while
(1)死循环
{
for(;freq<24000;)
{
freq=freq+1000;
rTCMPB0=freq;
Delay(500);
if(freq==3000)//依次判断,并操作LED灯
{
rGPBDAT=0x0;
//Delay(500);
}
elseif(freq==9000)
{
rGPBDAT=~((1<<5)|(1<<6)|(1<<7));
//Delay(500);
}
elseif(freq==15000)
{
rGPBDAT=~((1<<5)|(1<<6));
//Delay(500);
}
elseif(freq==20000)
{
rGPBDAT=~(1<<5);
//Delay(500);
}
elseif(freq==23000)
{
rGPBDAT=~(0x0);
//Delay(500);
}
}//曾
for(;freq>1000;)
{
freq=freq-1000;
rTCMPB0=freq;
Delay(500);
if(freq==3000)
{
rGPBDAT=0x0;
//Delay(500);
}
elseif(freq==9000)
{
rGPBDAT=~((1<<5)|(1<<6)|(1<<7));
//Delay(500);
}
elseif(freq==15000)
{
rGPBDAT=~((1<<5)|(1<<6));
//Delay(500);
}
elseif(freq==20000)
{
rGPBDAT=~(1<<5);
//Delay(500);
}
elseif(freq==23000)
{
rGPBDAT=~(0x0);
//Delay(500);
}
}//减
}
}
实验四:
S3C2440外部中断控制
2、实验目的:
用S3C2440的外部中断来控制led灯的亮灭。
开发板上共有4个按键,分别连接到了EINT0,EINT1,EINT2,EINT4。
用这四个按键控制连接到GPB5~GPB8上面的4个led灯,按一下按键,对应的led灯被点亮,再按下按键,对应的led灯灭。
3、实验原理和内容:
8个外部中断可以由多种信号触发方式所请求。
EXTINT寄存器为外部中断配置信号触发方式为电平触发方式或边沿触发,同时还需配置信号触发性。
三、实验步骤:
1.首先在ADS上建立一个工程,工程名为interrupt,然后选择一个和适的路径存放。
2.将光盘中TQ2440测试程序里面inc和src文件夹下的2440addr.h,2440lib.h,2440slib.h,def.h,Nand.h,Option.h,2440addr.inc,Mencfg.inc,Option.inc,2440init.s,2440slib.s,2440lib.c,nand.c这13个文件依次拷贝到刚才建立工程的文件夹下。
3.新建一个源文件,命名为interrupt.c,存放到工程名为interrupt的文件夹下。
4.在interrupt.mcp下创建一个分组,取名为startcode,然后将前面拷贝的3个文件夹2440init.s,2440slib.s,nand.c依次添加到以startcode命名的文件夹下。
5.将interrupt.c添加到工程里面去。
6.配置DebugrelSettings。
7.在interrupt.c里面进行程序的书写。
8.编译所写程序。
9.将开发板,仿真器和电脑正确连接,打开Hjtag软件,调试程序。
10.观察开发板上的led亮灭情况及蜂鸣器的发声。
四、实验数据和结果:
按一下按键,对应的led灯被点亮,再按下按键,对应的led灯灭。
五、实验总结:
通过此次试验我掌握S3C2440外部中断的工作原理,熟练掌握了外部中断来控制其他资源。
六、程序代码
#include"2440addr.h"
voidDelay(unsignedintdata)//延时函数
{
unsignedinti,j;
for(i=0;ifor(j=0;j}
volatileintvariable0;
voidclk_div()//配置时钟分频
{
rMPLLCON=(127<<12)|(2<<4)|1;
rCLKDIVN=(2<<1)|1;
}
voidTimer0_Init()//定时器初始换函数
{
rTCFG0&=0xffff00;
rTCFG0|=249;
rTCFG1&=0xfffff0;
rTCFG1|=2;
rTCNTB0=25000;
rTCON&=~0xf;
rTCON|=0xf;
rTCON&=~0x2;
}
void__irqTimer0_1s(void)//定时器0中断服务函数
{
rSRCPND=0x400;
rINTPND=0x400;
rGPBDAT=~rGPBDAT;
variable0++;
}
void__irqkey4_LED(void)//按键4中断函数
{
rSRCPND|=0x1;
rINTPND|=0x1;
clk_div();
Timer0_Init();
rGPBDAT=rGPBDAT|(0x1<<5);
while(variable0==0);
variable0=0;
}
void__irqkey1_LED(void)//按键1中断函数
{
rSRCPND=0x2;
rINTPND=0x2;
clk_div();
Timer0_Init();
rGPBDAT=rGPBDAT|(0x1<<6);
while(variable0==0);
variable0=0;
}
void__irqkey3_LED(void)//按键3中断服务函数
{
rSRCPND=0x4;
rINTPND=0x4;
pISR_TIMER0=(int)Timer0_1s;
clk_div();
Timer0_Init();
rGPBDAT=rGPBDAT|(0x1<<7);
while(variable0==0);
variable0=0;
}
void__irqkey2_LED(void)//按键2中断服务函数
{
rSRCPND=0x10;
rINTPND=0x10;
rEINTPEND=0x10;
pISR_TIMER0=(int)Timer0_1s;//定时中断函数
clk_div();
Timer0_Init();
rGPBDAT=rGPBDAT|(0x1<<8);
while(variable0==0);
variable0=0;
}
voidMain()
{
variable0=0;//LED初始化
rGPBCON=0x15400;
rGPBDAT=0x1e0;
rGPBUP=0x7ff;
rGPFCON=0x22a;
rINTMSK=~(0x417);//中断使能,开中断
rSRCPND=0x417;
rINTPND=0x417;
rEXTINT0=0x0;
rEINTMASK=~(1<<4);
rEINTPEND=0x10;
pISR_EINT0=(unsignedint)key4_LED;
pISR_EINT1=(unsignedint)key1_LED;
pISR_EINT2=(unsignedint)key3_LED;
pISR_EINT4_7=(unsignedint)key2_LED;
while
(1);
}
实验五:
S3C2440看门狗控制
一、实验目的:
使用看门狗定时器定时,当看门狗计数器减到0时,开发板开始复位。
二、实验原理和内容:
S3C2440的看门狗定时器是用于当其噪声和系统错误引起的故障干扰时恢复控制器的工作。
它可以被用作通用16位内部定时器来请求中断服务。
看门狗定时器产生128个PCLK周期的复位信号。
三、实验步骤:
1.首先在ADS上建立一个工程,工程名为watchdog,然后选择一个和适的路径存放。
2.将光盘中TQ2440测试程序里面inc和src文件夹下的2440addr.h,2440lib.h,2440slib.h,def.h,Nand.h,Option.h,2440addr.inc,Mencfg.inc,Option.inc,2440init.s,2440slib.s,2440lib.c,nand.c这13个文件依次拷贝到刚才建立工程的文件夹下。
3.新建一个源文件,命名为watchdog.c,存放到工程名为watchdog的文件夹下。
4.在watchdog.mcp下创建一个分组,取名为startcode,然后将前面拷贝的3个文件夹2440init.s,2440slib.s,nand.c依次添加到以startcode命名的文件夹下。
5.将watchdog.c添加到工程里面去。
6.配置DebugrelSettings。
7.在interrupt.c里面进行程序的书写。
8.编译所写程序。
9.将开发板,仿真器和电脑正确连接,打开Hjtag软件,调试程序。
10.观察开发板上的led亮灭情况及蜂鸣器的发声。
四、实验数据和结果:
当看门狗计数器减到0时,开发板开始复位。
五、实验总结:
通过此次试验我掌握S3C2440看门狗的工作原理,熟练掌握了看门狗来控制其他资源。
六、程序代码
#include"2440addr.h"
voidclk_div()
{
rMPLLCON=(127<<12)|(2<<4)|1;//FCLK=400MHz
rCLKDIVN=(2<<1)|1;//FCLK:
HCLK:
PCLK=1:
4:
8
}
voidDelay(unsignedintx)
{
inti,j;
for(i=0;ifor(j=0;j}
void__irqwtdog_ISR()
{
rSRCPND=(1<<9);
rINTPND=(1<<9);
rSUBSRCPND=(1<<13);
rGPBDAT=~(1<<8);
}
intMain()
{
inti,light;
light=0x20;
rGPBCON=0x15400;
rGPBDAT=(1<<5)|(1<<6)|(1<<7)|(1<<8);
rGPBUP=0x7ff;
clk_div();
rWTCON=(249<<8);/*|(~(3<<3));//定时器的值*/
rWTDAT=50000;//4s
rWTCNT=50000;
rWTCON|=(1<<5)|(1<<2);//使能定时器和中断
rINTMSK=~(1<<9);
rSRCPND=(1<<9);
rINTPND=(1<<9);
rINTSUBMSK=~(1<<13);//打开子中断,看门狗中断有两个子中断,INT_WDT(13bit),INT_AC97(14bit)
rSUBSRCPND=(1<<13);
pISR_WDT_AC97=(unsignedint)wtdog_ISR;
while
(1)//跑马灯
{
for(i=0;i<2;i++)
{
rGPBDAT=~light;
light=light<<1;
Delay(5000);
}
for(i=0;i<2;i++)
{
rGPBDAT=~light;
light=light>>1;
Delay(5000);
}
}
}
实验六:
S3C2440UART控制
1、实验目的:
通过查询方式,在主程序内不断的查询UART端口,当有数据来时,就接受数据,并再通过UART发送数据,然后根据接受的数据的不同,分别执行不同的内容,如点亮,熄灭led,控制蜂鸣器响或不响。
2、实验原理和内容:
SPI,IIC和UART是最常见的三种串行总线,这三种总线都在S3C2440中被集成了。
UART用于异步通讯,可以实现全双工发送和接收。
它不仅可以实现不同嵌入式系统之间的通讯,还可以实现与PC之间的通信。
S3C2440的通