⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 本代码文件是s3c44b0x板的测试程序.txt

📁 s3c44b0 的开发板测试的所有源代码及程序!!!汇编代码主要完成系统初始化
💻 TXT
字号:
2007-06-05 10:14http://www.21dz.com.cn/article/show.asp?id=32

本代码文件是S3C44B0X板的测试程序,包括汇编初始化文件和C语言测试代码。

汇编代码主要完成系统初始化,包括:
禁止看门狗;
禁止所有中断;
初始化存储器(包括SDRAM);
设定锁相环倍频;
使能所有单元模块时钟;
初始化堆栈;
设置中断等等

C语言代码主要是应用代码,包括:
设置使用指令缓存;
修改系统主时钟为32MHz;
IO端口功能、方向设定;
初始化中断;
初始化DMF50081液晶模块;
蜂鸣器测试;
液晶显示测试;
LED输出测试;
定时器、PWM测试等;

板子上电之后,四个LED将会全亮,蜂鸣器将会鸣叫一声,两秒钟后四个LED将会出现5次来回闪烁。几秒钟后四个LED出现PWM输出,各个LED输出的占空比和频率均不同。
如果LCD接口接上DMF50081(注意:本程序只在清华蓬远公司的DMF50081ZNB-FW型液晶模块上测试,根据实验表明,不同公司出的DMF50081需要修改初始化参数才能得到同样的输出),上电之后,液晶模块会出现粗的竖条纹。
任何时刻将四个按键中任何一个按下,蜂鸣器将会一直鸣叫直到你松开按键为止。

程序开始

////////////////////////////////////////////////////////////////////////////////////////////////////

/****************************************************************************
【文   件   名   称】led_test.c
【功   能   描   述】三星S3C44B0X板测试程序
【程   序   版   本】2.3
****************************************************************************/

//***************************************************************************
#include "inc\44b.h"
#include "inc\option.h"
//***************************************************************************
#define U32 unsigned int
#define U16 unsigned short
#define S32 int
#define S16 short int
#define U8   unsigned char
#define S8   char
//***************************************************************************
//以下是液晶模块控制器初始化和运行所用到的:
#define MVAL_USED (0)
#define MVAL    (13)
#define INVCLK   (0)
#define INVFRAME   (1)
#define INVLINE   (1)
#define L248    (8)
#define CLKVAL_SL (24)   // 32Mhz, fr=100Hz (CLKVAL=38.6)
#define M5D(n) ((n) & 0x1fffff)
unsigned char Bmp[9600];
//***************************************************************************

/****************************************************************************
【功能说明】锁相环设置,修改系统主频
Fout = (8 + M_DIV) * Fin / [ (2+P_DIV) * (2^S_DIV) ]
****************************************************************************/
void ChangePllValue(int mdiv,int pdiv,int sdiv)
{
     rPLLCON = (mdiv << 12) | (pdiv << 4) | sdiv;
}
//***************************************************************************

/****************************************************************************
【功能说明】通用延时函数,延时time个100us
****************************************************************************/
static int delayLoopCount = 400;
void Delay(int time)
{
int i,adjust=0;
if(time==0)
{
   time=200;
   adjust=1;
   delayLoopCount=400;
   rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
   rWTDAT=0xffff;
   rWTCNT=0xffff;  
   rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5);
}
for(;time>0;time--)
   for(i=0;i<delayLoopCount;i++);
if(adjust==1)
{
   rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
   i=0xffff-rWTCNT;
   delayLoopCount=8000000/(i*64);
}
}
//***************************************************************************

/****************************************************************************
【功能说明】IO端口功能、方向设定
****************************************************************************/
void Port_Init(void)
{
// PORT A GROUP
/*   BIT 9   8 7 6 5 4 3 2 1 0 */
/*A24 A23 A22 A21 A20 A19 A18 A17 A16 A0 */       
/*0   1 1 1 1 1 1 1 1 1 */
rPCONA = 0x1ff; 

// PORT B GROUP
/*   BIT 10 9   8   7   6   5   4   3   2   1   0   */
/* /CS5 /CS4 /CS3 /CS2 /CS1 nWBE3 nWBE2 /SRAS /SCAS SCLK SCKE */
/* EXT   NIC   USB   IDE   SMC   NC   NC   Sdram Sdram Sdram Sdram */
/*       0,0,    0,    0,     1,     0,        0,      1,     1,     1,    1   */
rPDATB = 0x04f;
rPCONB = 0x04f;
    
//PORT C GROUP
//BUSWIDTH=16              */
/*   PC15   14   13   12   11   10   9   8 */
/* o   o   RXD1 TXD1 o   o   o   o */
/* NC   NC   Uart1 Uart1 NC   NC   NC   NC */
/*    01   01   11   11   01   01   01   01 */

/*   PC7   6   5   4   3   2   1   0 */
/*    o   o   o   o   o   o   o   o */
/*    NC   NC   NC   NC   SMCALE SMCCLE SMCCE SMCRB*/
/*    01   01   01   01   01   01   01   01 */
rPDATC = 0x0000; //All IO is low
rPCONC = 0x5f555555; 
rPUPC   = 0x3000; //PULL UP RESISTOR should be enabled to I/O

//PORT D GROUP
/*   PORT D GROUP(I/O OR LCD)           */
/*   BIT7   6   5   4   3   2   1   0 */
/*       VF   VM   VLINE VCLK VD3   VD2   VD1   VD0 */
/*     01   01   01   01   01   01   01   01 */
rPDATD= 0x55;
rPCOND= 0xaaaa; 
rPUPD = 0x00;
//These pins must be set only after CPU's internal LCD controller is enable

//PORT E GROUP 
/*   Bit 8   7   6   5   4   3   2   1   0   */
/*       LcdBL LED4 LED5 LED6 LED7 BEEP RXD0 TXD0 LcdDisp */ 
/*       01   01   01   01   01   01   10   10   01   */
rPDATE = 0x357;
rPCONE = 0x556b; 
rPUPE = 0x6;

//PORT F GROUP
/*   Bit8   7   6   5    4   3   2   1   0   */   
/*   IISCLK IISDI IISDO IISLRCK Input Input Input IICSDA IICSCL */
/* 100   010   010   001   00   01   01   10   10   */
rPDATF = 0x0;
rPCONF = 0x22445a;
rPUPF   = 0x1d3;

//PORT G GROUP
/*   BIT7   6   5   4   3   2   1   0   */
/* INT7   INT6   INT5   INT4   INT3   INT2   INT1   INT0 */
/*     S3   S4   S5   S6   NIC   EXT   IDE   USB */
/*       11       11       11       11       11       11       11       11        */
rPDATG = 0xff;
rPCONG = 0x0000;
rPUPG   = 0x00; //should be enabled  

rSPUCR=0x7;   //D15-D0 pull-up disable

/*定义非Cache区*/
rNCACHBE0 = 0x2c000; 
/*所有的外部硬件中断为低电平触发*/
rEXTINT=0x0;
}
//***************************************************************************

/****************************************************************************
【功能说明】四个LED 点亮/熄灭状态设置(LedStatus低四位电平高低对应着四个LED亮/熄)
****************************************************************************/
void Led_Display(int LedStatus)
{
if((LedStatus&0x01)==0x01)   //PE7状态设置
   rPDATE=rPDATE&0x17f;
else
   rPDATE=rPDATE|0x80;

if((LedStatus&0x02)==0x02)   //PE6状态设置
   rPDATE=rPDATE&0x1bf;
else
   rPDATE=rPDATE|0x40;

if((LedStatus&0x04)==0x04)   //PE5状态设置
   rPDATE=rPDATE&0x1df;
else
   rPDATE=rPDATE|0x20;

if((LedStatus&0x08)==0x08)   //PE4状态设置
   rPDATE=rPDATE&0x1ef;
else
   rPDATE=rPDATE|0x10;
}
//***************************************************************************

/****************************************************************************
【功能说明】LED来回闪烁显示 
****************************************************************************/
void Led_Disp(void)
{
Led_Display(0x08);   //LED点亮/熄灭状态设置
Delay(500);   //延时若干个100us
Led_Display(0x04);   //LED点亮/熄灭状态设置
Delay(500);   //延时若干个100us
Led_Display(0x02);   //LED点亮/熄灭状态设置
Delay(500);   //延时若干个100us
Led_Display(0x01);   //LED点亮/熄灭状态设置
Delay(500);   //延时若干个100us
Led_Display(0x02);   //LED点亮/熄灭状态设置
Delay(500);   //延时若干个100us
Led_Display(0x04);   //LED点亮/熄灭状态设置
Delay(500);   //延时若干个100us
Led_Display(0x08);   //LED点亮/熄灭状态设置
Delay(500);   //延时若干个100us
}
//***************************************************************************

/****************************************************************************
【功能说明】蜂鸣器鸣叫time个100us
****************************************************************************/
void Beep(unsigned int time)
{
rPDATE = (rPDATE | 0x08);
Delay(time);   //延时若干个100us
rPDATE = (rPDATE & 0x1f7);
}
//***************************************************************************

/****************************************************************************
【功能说明】检测四个按键,有任何一个按键按下就让蜂鸣器鸣叫,否则不鸣叫
****************************************************************************/
void Key_Speaker(void)
{
unsigned int m;
m = rPDATG;
if((m & 0xf8) < 0xf8) {rPDATE = (rPDATE | 0x08);}
else {rPDATE = (rPDATE & 0x1f7);}
}
//***************************************************************************

/****************************************************************************
【功能说明】中断初始化
****************************************************************************/
void Isr_Init(void)
{
rINTCON=0x5;        //Non-vectored,IRQ enable,FIQ disable //
rINTMOD=0x0;        //All=IRQ mode//
rINTMSK=~(BIT_EINT0 | BIT_GLOBAL); //Default value=0x7ffffff//
}
//***************************************************************************

/****************************************************************************
【功能说明】液晶模块控制器初始化,外接DMF50081(320×240)液晶模块
****************************************************************************/
void Lcd_Init(void)
{
rPCOND=0xaaaa;
rLCDCON1=(2)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(1<<5)|(MVAL_USED<<7)|(0x1<<8)|(0x1<<10)|(CLKVAL_SL<<12);
   //上升沿装载视频数据,禁止视频输出,LCD FIFO清空;行、帧信号取反;
   //4位单扫描模式;WDLY=8clk,WLH=8clk,CLKVAL_SL=38
rLCDCON2=(239)|(79<<10)|(10<<21);
   //LINEBLANK=10 (without any calculation) 
rLCDSADDR1= (0x0<<27) | ( ((U32)Bmp>>22)<<21 ) | M5D((U32)Bmp>>1);
   // MONO, LCDBANK, LCDBASEU
rLCDSADDR2= (1<<29) | (M5D((U32)Bmp + ((320/8)*(240)))>>1) | (MVAL<<21);
rLCDSADDR3= (320/16) | ( 0<<9 );   
rLCDCON1=(3)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_SL<<12);
   //上升沿装载视频数据,允许视频输出,LCD FIFO清空;行、帧信号取反;
   //4位单扫描模式;WDLY=8clk,WLH=8clk,CLKVAL_SL=38
}
//***************************************************************************

/****************************************************************************
【功能说明】液晶显示屏全屏填充某一个8位二进制数
****************************************************************************/
void Lcd_Fill(U8 m)
{
U16 i;
for(i = 0; i < 9600; i++)   Bmp[i] = m;
} 
//***************************************************************************

/****************************************************************************
【功能说明】定时器初始化,让PE7、6、5、4输出PWM信号
****************************************************************************/
void Timer_Pwm(void)
{
rPCONE = 0xaa6b;  
//PE8-P0的引脚功能依次为:ENDIAN TOUT4、3、2、1、0 RXD0 TXD0 FOUT
rPUPE |= 0xf0;   //TOUT4、3、2、1、0设置成不上拉,其他引脚上拉

rTCFG0 = 0x23f3f3f;   //死区长度为2;     Prescaler0/1/2=3f,3f,3f
//定时器输入时钟频率计算公式 = MCLK/{prescaler+1}/{divider value}
rTCFG1 = 0x0;   // Interrupt; Devider value = 1/2
//定时器时钟 = (MCLK/prescaler+1)/2

rTCNTB0 = 20000;   //决定TOUT 0引脚PWM输出信号的频率
rTCNTB1 = 32000;   //决定TOUT 1引脚PWM输出信号的频率
rTCNTB2 = 43000;   //决定TOUT 2引脚PWM输出信号的频率
rTCNTB3 = 53000;   //决定TOUT 3引脚PWM输出信号的频率
rTCNTB4 = 64000;   //决定TOUT 4引脚PWM输出信号的频率

rTCMPB0 = 12000;   //决定TOUT 0引脚PWM输出高电平的信号宽度(rTCMPB0<rTCNTB0)
rTCMPB1 = 18000;   //决定TOUT 1引脚PWM输出高电平的信号宽度(rTCMPB1<rTCNTB1)
rTCMPB2 = 25000;   //决定TOUT 2引脚PWM输出高电平的信号宽度(rTCMPB2<rTCNTB2)
rTCMPB3 = 28000;   //决定TOUT 3引脚PWM输出高电平的信号宽度(rTCMPB3<rTCNTB3)
rTCMPB4 = 36000;   //决定TOUT 4引脚PWM输出高电平的信号宽度(rTCMPB4<rTCNTB4)

// rTCON = 0xaaaa0a;   //自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
// rTCON = 0x999909;   //开始PWM输出(不使用死区控制器,上升沿会非常陡峭,是标准矩形波)
// rTCON = 0xeeee0e;   //自动重装,输出取反打开,更新TCNTBn、TCMPBn,死区控制器关闭
// rTCON = 0xdddd0d;   //开始PWM输出(不使用死区控制器,上升沿会非常陡峭,是标准矩形波)
// rTCON = 0xaaaa1a;   //自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器打开
// rTCON = 0x999919;   //开始PWM输出(使用死区控制器,上升沿会变得平滑,适用于功率器件控制)

//Delay(7500);   //延时若干个100us
rTCON = 0xaaaa0a;   //自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
rTCON = 0x999900;   //停止蜂鸣器的叫声
// rTCON = 0x0;   //停止定时器
rPCONE = 0xaa6b;   //
//PE8-P0的引脚功能依次为:ENDIAN TOUT4、3、2、1 OUTPUT RXD0 TXD0 FOUT
}
//***************************************************************************

/****************************************************************************
【功能说明】系统主函数
****************************************************************************/
void Main(void)
{
U16 m;

rSYSCFG=0x0e; //使用8K字节的指令缓存

Port_Init();   //IO端口功能、方向设定
Isr_Init();   //中断初始化

Lcd_Init();   //DMF50081(320×240)液晶模块初始化

Led_Disp();   //LED来回闪烁显示 
Beep(500);   //蜂鸣器鸣叫若干个100us

ChangePllValue(8,2,1);   //修改系统主频为2倍频

Beep(1000);   //蜂鸣器鸣叫若干个100us

Lcd_Fill(0x33);   //液晶显示屏全屏填充某一个8位二进制数

for(m = 2; m > 0; m--)
{
   Led_Disp();   //LED来回闪烁显示 
}

Timer_Pwm();   //定时器初始化,让PE7、6、5、4、3输出PWM信号

while(1)
{
   Key_Speaker();   //检测四个按键,有任何一个按键按下就让蜂鸣器鸣叫,否则不鸣叫
}
}
//***************************************************************************


///////////////////////////////////////////////////////////////////////////

结束

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -