arm9开发板实验报告1.docx
《arm9开发板实验报告1.docx》由会员分享,可在线阅读,更多相关《arm9开发板实验报告1.docx(40页珍藏版)》请在冰豆网上搜索。
![arm9开发板实验报告1.docx](https://file1.bdocx.com/fileroot1/2023-5/20/f88c09f3-5f84-4903-b1d2-c0b50a9c4e39/f88c09f3-5f84-4903-b1d2-c0b50a9c4e391.gif)
arm9开发板实验报告1
轻工业学院
实训报告
实训名称:
项目一:
编写从A/D转换器的通道x获取模拟数据,并将转换后
的数字量以波形的形式在LCD上显示的程序
项目二:
触摸屏驱动程序设计
姓名:
克歌
院(系):
计算机与通信工程学院
专业班级:
嵌入式09--01
学号:
1
指导教师:
雪琴
成绩:
时间:
2011年8月29日至2011年9月7日
一、需求说明
1.巩固和强化学生的嵌入式系统的基本概念和开发流程,掌握基本知识和基本技能。
2.掌握硬件开发平台、开发资源和软件开发环境,尤其是裸机嵌入式系统开发方法。
掌握汇编和C语言混合编程技巧,熟悉系统启动引导过程,能够成功移植嵌入式系统引导程序。
培养和训练学生综合利用所学基本知识和基本技能进行小型裸机程序开发的技能。
3.明确思路和任务,查询相关书籍、资料,综合了解ARM的AD转换器和LCD驱动器,重点分析时S3C2440的LCD驱动器的工作原理和初始化方法。
分析与AD转换相关的寄存器,编写AD转换器的初始化函数,编写获取AD转换结果的函数。
分析与LCD相关的寄存器,编写LCD驱动器的初始化函数,配置显示方式。
分析LCD绘图的API函数。
编写主函数,将AD转换结果在LCD上以波形的方式显示,同时以串口输出到PC机。
进入调试。
实现转换数据实时输出,实现串口输出数据与LCD波形显示的一致。
4.明确思路和任务,查询相关书籍、资料,重点分析S3C2440的触摸屏接口工作原理和相关寄存器。
编写触摸屏初始化函数,确定XY位置转换模式。
编写触摸屏中断初始化函数,中断服务函数。
编写屏幕校准函数。
确定坐标计算公式。
编写触点数据采集函数。
编写主函数,进入调试。
实现触摸屏坐标点x、y的正确读取。
二、功能描述
项目一:
编写从A/D转换器的通道x获取模拟数据,并将转换后的数字量以波形的形式在LCD上显示的程序。
项目二:
通过对AD转换器的配置——触摸屏自动测试x/y位置模式,选择进入到触摸屏驱动函数。
在进行触摸屏测试时,先进入函数判断是否启动A/D转换,如果不是的话就跳出此函数,如果是的话进行下面的判断,看A/D转换是否结束,如果是,跳出函数,如果不是运行程序,并输出x、y的值。
再回到触摸屏驱动函数,测试结束,清屏。
三、系统设计及实现
项目一:
一.项目一系统设计
1.编写AD转换器的初始化函数;
2.设计函数,获取AD转换的结果;
3.初始化LCD相关寄存器;
4.设计函数,使单个象素的显示数据输出,在LCD上显示。
二.项目一流程图
YN
三.项目一实现
LCD清屏及单个像素显示函数
编写TestAdc函数,期间调用了Lcd_ClearScrPutPixe两个函数
添加H-JTag
选择.axf文件,并打开
将其程序下载到开发板中
实验程序代码经过调试,没有错误,进入运行阶段
在超级终端中显示测试结果
在LCD中显示的结果,由于没有改变电阻,因此看到了在极小围变化的点
项目二:
一.项目二系统设计
1.对触摸屏相关寄存器进行初始化,确定XY位置转换模式;
2.对中断初始化,设计中断服务函数;
3.通过校正函数和坐标计算公式,得出坐标。
二.项目二流程图
N
Y
NY
三.项目二实现
对ADC相关寄存器,中断进行设置
中断服务函数
在主函数中直接调用Test_Touchpanel函数
最终测试结果,每碰触一下触摸屏,就在终端中显示一对XP,YP值
四、实训心得
两周时间转瞬即逝,在这两周里,我们潜心研究,以MINI2440开发板为实验硬件平台,采用ADS集成开发环境,是我们在课程容基础上,加强对嵌入式系统的理解和裸机应用的设计。
在此过程中,需要我们分析嵌入式CPU引导程序的功能和引导过程,学会裸机驱动程序的开发以及简单应用程序的设计。
从而深化我们的专业基本技能,加强我们的动手能力。
通过本次实训,我们了解到了团队的力量。
小组以积极认真的态度应对,遵纪守纪,发现问题,解决问题,同时也培养了自己的独立工作能力。
通过本次实训,我们基本掌握了嵌入式系统的特点,性能,掌握了开发板的硬件资源,熟悉了S3C2440的功能和接口。
通过本次实训,我们还熟练了ADS集成开发环境的使用,掌握了ADS开发和调试裸机程序的过程和方法。
同时,实训培养了我们学生一定的查阅教材,数据手册和各类相关资料的能力,进而养成自我学习的习惯,掌握底层硬件资源的驱动开发过程。
在此实训中也遇到了很多问题。
比如,在函数调用中会出现没有提前声明函数;在使用时会出现重复定义;尤其是在触摸屏程序设计中,一直对校正函数无法下手,后来才了解到在MINI2440中是直接转化的。
总之,本次实训对我们作用巨大,影响深远,不仅巩固了现阶段所学的知识,而且为以后的工作生活做足充分准备。
也对“学海无涯”有了更深一步的体会,在以后的学习中,要更加踏实,更加努力!
五、附录(代码)
/**********************项目一代码******************************************
NAME:
u2440mon.c
DESC:
u2440monentrypoint,menu,download
HISTORY:
Mar.25.2002:
purnnamu:
S3C2400Xprofile.cisportedforS3C2410X.
Mar.27.2002:
purnnamu:
DMAisenabled.
Apr.01.2002:
purnnamu:
isDownloadReadyflagisadded.
Apr.10.2002:
purnnamu:
-Selectingmenuisavailableinthewaitingloop.
So,isDownloadReadyflaggetsnotneeded
-UARTch.1canbeselectedfortheconsole.
Aug.20.2002:
purnnamu:
revisionnumberchange0.2->R1.1
Sep.03.2002:
purnnamu:
ToremovethepowernoiseintheUSBsignal,theunusedCLKOUT0,1isdisabled.
****************************************************************/
#defineGLOBAL_CLK1
#include
#include
#include"def.h"
#include"option.h"
#include"2440addr.h"
#include"2440lib.h"
#include"2440slib.h"
#include"mmu.h"
#include"profile.h"
#include"memtest.h"
externcharImage$$RO$$Limit[];
externcharImage$$RO$$Base[];
externcharImage$$RW$$Limit[];
externcharImage$$RW$$Base[];
externcharImage$$ZI$$Limit[];
externcharImage$$ZI$$Base[];
voidIsr_Init(void);
voidHaltUndef(void);
voidHaltSwi(void);
voidHaltPabort(void);
voidHaltDabort(void);
voidClearMemory(void);
voidClk0_Enable(intclock_sel);
voidClk1_Enable(intclock_sel);
voidClk0_Disable(void);
voidClk1_Disable(void);
//externvoidTFT_LCD_Init(void);
//externvoidTFT_LCD_Test(void);
externvoidTFT_LCD_Init(void);
externvoidTFT_LCD_Test(void);
externvoidTest_Touchpanel(void);
externvoidTest_Adc(void);//adctest
externvoidKeyScan_Test(void);
externvoidRTC_Display(void);
externvoidTest_IrDA_Tx(void);
externvoidPlayMusicTest(void);
externvoidRecordTest(void);
externvoidTest_Iic(void);
externvoidTest_SDI(void);
externvoidCamera_Test(void);
volatileU32downloadAddress;
void(*restart)(void)=(void(*)(void))0x0;
volatileunsignedchar*downPt;
volatileU32downloadFileSize;
volatileU16checkSum;
volatileunsignedinterr=0;
volatileU32totalDmaCount;
volatileintisUsbdSetConfiguration;
intdownload_run=0;
U32tempDownloadAddress;
intmenuUsed=0;
externcharImage$$RW$$Limit[];
U32*pMagicNum=(U32*)Image$$RW$$Limit;
intconsoleNum;
staticU32cpu_freq;
staticU32UPLL;
staticvoidcal_cpu_bus_clk(void)
{
U32val;
U8m,p,s;
val=rMPLLCON;
m=(val>>12)&0xff;
p=(val>>4)&0x3f;
s=val&3;
//(m+8)*FIN*2不要超出32位数!
FCLK=((m+8)*(FIN/100)*2)/((p+2)*(1<
val=rCLKDIVN;
m=(val>>1)&3;
p=val&1;
val=rCAMDIVN;
s=val>>8;
switch(m){
case0:
HCLK=FCLK;
break;
case1:
HCLK=FCLK>>1;
break;
case2:
if(s&2)
HCLK=FCLK>>3;
else
HCLK=FCLK>>2;
break;
case3:
if(s&1)
HCLK=FCLK/6;
else
HCLK=FCLK/3;
break;
}
if(p)
PCLK=HCLK>>1;
else
PCLK=HCLK;
if(s&0x10)
cpu_freq=HCLK;
else
cpu_freq=FCLK;
val=rUPLLCON;
m=(val>>12)&0xff;
p=(val>>4)&0x3f;
s=val&3;
UPLL=((m+8)*FIN)/((p+2)*(1<
UCLK=(rCLKDIVN&8)?
(UPLL>>1):
UPLL;
}
voidTemp_function(){Uart_Printf("\nPleaseinput1-16toselecttest!
!
!
\n");}
struct{
void(*fun)(void);
char*tip;
}CmdTip[]={
{Temp_function,"Pleaseinput1-16toselecttest"},
{BUZZER_PWM_Test,"TestPWM"},
{RTC_Display,"RTCtimedisplay"},
{Test_Adc,"TestADC"},
{KeyScan_Test,"Testinterruptandkeyscan"},
{Test_Touchpanel,"TestTouchpanel"},
{TFT_LCD_Test,"TestTFT-LCDorVGA1024x768module"},
{Test_Iic,"TestIICEEPROM,ifuseQQ2440,pleaseremovetheLCD"},
{PlayMusicTest,"UDA1341playmusic"},
{Test_SDI,"TestSDCard"},
{Camera_Test,"TestCMOSCamera"},
{0,0}
};
/**************************************************************
640×480TFTLCD单个象素的显示数据输出
**************************************************************/
voidPutPixel(U32x,U32y,U16c)
{
if(xLCD_BUFFER[(y)][(x)]=c;
}
/**************************************************************
640×480TFTLCD全屏填充特定颜色单元或清屏
**************************************************************/
voidLcd_ClearScr(U16c)
{
unsignedintx,y;
for(y=0;y{
for(x=0;x{
LCD_BUFFER[y][x]=c;
}
}
}
voidTest_Adc(void)
{
inta0=0,a1=0;//Initializevariables
U32rADCCON_save=rADCCON;
Uart_Printf("ADCINPUTTest,pressESCkeytoexit!
\n");
preScaler=ADC_FREQ;
Uart_Printf("ADCconv.freq.=%dHz\n",preScaler);
preScaler=50000000/ADC_FREQ-1;//PCLK:
50.7MHz
Uart_Printf("PCLK/ADC_FREQ-1=%d\n",preScaler);
Lcd_ClearScr((0x1f<<11)|(0x3f<<5)|(0x1f));
while(Uart_GetKey()!
=ESC_KEY)
{
a0=ReadAdc(0);//对应开发板上W1可调电阻
//a1=ReadAdc
(1);//对应开发板上W2可调电阻
a1+=1;
Uart_Printf("AIN0:
%04d,AIN1:
%04d\n",a0,a1);
PutPixel(a0-400,a1,0x0000);
Delay(500);
}
//rADCCON=(0<<14)|(19<<6)|(7<<3)|(1<<2);//standbymodetoreducepowerconsumption
rADCCON=rADCCON_save;
Uart_Printf("\nrADCCON=0x%x\n",rADCCON);
}
voidMain(void)
{
char*mode;
inti;
U8key;
U32mpll_val=0;
//U32divn_upll=0;
#ifADS10
//__rt_lib_init();//forADS1.0
#endif
Port_Init();
Isr_Init();
i=2;//don'tuse100M!
//boot_params.cpu_clk.val=3;
switch(i){
case0:
//200
key=12;
mpll_val=(92<<12)|(4<<4)|
(1);
break;
case1:
//300
key=13;
mpll_val=(67<<12)|(1<<4)|
(1);
break;
case2:
//400
key=14;
mpll_val=(92<<12)|(1<<4)|
(1);
break;
case3:
//440!
!
!
key=14;
mpll_val=(102<<12)|(1<<4)|
(1);
break;
default:
key=14;
mpll_val=(92<<12)|(1<<4)|
(1);
break;
}
//initFCLK=400M,sochangeMPLLfirst
ChangeMPllValue((mpll_val>>12)&0xff,(mpll_val>>4)&0x3f,mpll_val&3);
ChangeClockDivider(key,12);
cal_cpu_bus_clk();
consoleNum=0;//Uart1selectfordebug.
Uart_Init(0,115200);
Uart_Select(consoleNum);
Beep(2000,100);
Uart_SendByte('\n');
Uart_Printf("<***********************************************>\n");
Uart_Printf("SBC2440TestProgramVER1.0\n");
Uart_Printf("\n");
Uart_Printf("Buildtimeis:
%s%s\n",__DATE__,__TIME__);
Uart_Printf("Image$$RO$$Base=0x%x\n",Image$$RO$$Base);
Uart_Printf("Image$$RO$$Limit=0x%x\n",Image$$RO$$Limit);
Uart_Printf("Image$$RW$$Base=0x%x\n",Image$$RW$$Base);
Uart_Printf("Image$$RW$$Limit=0x%x\n",Image$$RW$$Limit);
Uart_Printf("Image$$ZI$$Base=0x%x\n",Image$$ZI$$Base);
Uart_Printf("Image$$ZI$$Limit=0x%x\n",Image$$ZI$$Limit);
Uart_Printf("<***********************************************>\n");
rMISCCR=rMISCCR&~(1<<3);//USBDisselectedinsteadofUSBH1
rMISCCR=rMISCCR&~(1<<13);//USBport1isenabled.
//
//USBDshouldbeinitializedfirstofall.
//
//isUsbdSetConfiguration=0;
//rd_dm9000_id();//
//rGPBCON&=~(3<<20);//CF_CARDPower
//rGPBCON|=1<<20;
//rGPBDAT|=1<<10;
//rDSC0=0x155;
//rDSC1=0x15555555;
rDSC0=0x2aa;
rDSC1=0x2aaaaaaa;
//EnableNAND,USBD,PWMTImer,UART0,1andGPIOclock,
//theothersmustbeenabledinOS!
!
!
rCLKCON=0xfffff0;
//MMU_EnableICache();
MMU_Init();//
//Uart_Printf("NORFlashIDis0x%08x\n",GetFlashID());
pISR_SWI=(_ISR_STARTADDRESS+0xf0);//forpSOS
Led_Display(0x66);
#ifUSBDMA
mode="DMA";
#else
mode="Int";
#endif
//CLKOUT0/1select.
//Uart_Printf("CLKOUT0:
MPLLin,CLKOUT1:
RTCclock.\n");
//Clk0_Enable(0);//0:
MPLLin,1:
UPLL,2:
FCLK,3:
HCLK,4:
PCLK,5:
D