嵌入式系统实验指导书.docx
《嵌入式系统实验指导书.docx》由会员分享,可在线阅读,更多相关《嵌入式系统实验指导书.docx(19页珍藏版)》请在冰豆网上搜索。
嵌入式系统实验指导书
嵌入式系统实验指导书
EFLAG–ARM-S3C44B0
北京工业大学电控学院
DSP与嵌入式系统研究室
二零零四年十月
嵌入式系统实验指导书
实验一ARM处理器指令系统实验
实验目的熟悉ARM指令系统,
熟悉ARMSDT编辑,编译,连接ARMProjectManager和ARMDebugger的设置和使用。
实验条件Windows平台的ARMSDT2.51软件:
ARMProjectManager和ARMDebugger。
实验内容学习使用ARMProjectManager建立项目文件,编辑汇编文件,并加入项目。
学习ARM编译器和汇编器的设置。
通过编程熟悉ARM指令,包括跳转指令,数据处理指令,状态寄存器传送指令,load/store指令,中断异常产生指令。
学习ARM调试起的使用方法,包括程序的导入,单步执行,断点设置等。
实验要点工程文件的建立,在ARMProjectManager中点击File->New
选择Project,点击确定。
项目如上图设置。
连接器的设定,需要设置代码和数据段的起始地址,如下图
点击
图标,选择不进行远程调试,即可打开调试器。
按下Ctrl+F,即可显示源代码,使用工具栏提供的工具即可进行单步调试。
一段最简单的ARM程序:
AREAtest,CODE,READONLY
ENTRY
Start
BStart
END
实验二JTAG调试器的使用
实验目的熟悉JTAG调试器的原理。
熟悉ARMSDTARMDebuggerJTAG调试的设置和使用。
实验条件Windows平台的ARMSDT2.51软件:
ARMProjectManager和ARMDebugger;jtag.exe;EFLAG-ARM-S3C44.B0实验箱。
实验内容学习使用JTAG调试器的设置。
PC机同实验箱的连接。
启动调试器服务程序DebugServer.exe。
配置ARM调试器参数,完成同实验箱的连接。
通过调试器配置实现箱上的ARM处理器SDRAM参数。
实验要点在调试软件目录中启动DebugServer.exe,调试起服务程序。
启动SDT调试软件ARMDebugger。
首先打开DebugServer.exe调试器服务程序
首次使用SDT调试软件时,要对SDT进行配置,如下图。
点击菜单中Options选项,点击ConfigureDebugger选项。
点击Configure选项,选择Ethernet,输入IP地址为:
127.0.0.1即本机缺省IP回环地址。
打开SDT菜单中的File选项中的Loadimage菜单,调入编译好的要调试的映像文件,可按照单步、全速、设置断点等方式进行调试。
选择Remote_A
在Windows2000和WindowsXP下使用并行口需要驱动程序,在本实验系统中使GiveIOInstaller来安装并口驱动程序。
在GiveIO目录下点击GiveIOInstaller.exe即可。
将下面代码使用文本文件编辑器(如notepad等)保存为sdram.ini,并copy到ARM251/bin/目录下。
|***SDRAM_CONFIG***
let$vector_catch=0x00
letpsr=%IF_SVC32
let0x1d80000=((0x34<<12)+(0x3<<4)+0x1)
let0x1c80000=0x11111190
let0x1c80004=((3<<13)+(3<<11)+(7<<8)+(3<<6)+(3<<4)+(3<<2)+0)
let0x1c80008=((3<<13)+(3<<11)+(7<<8)+(3<<6)+(3<<4)+(3<<2)+0)
let0x1c8000c=((3<<13)+(3<<11)+(7<<8)+(3<<6)+(3<<4)+(3<<2)+0)
let0x1c80010=((3<<13)+(3<<11)+(7<<8)+(3<<6)+(3<<4)+(3<<2)+0)
let0x1c80014=((3<<13)+(3<<11)+(7<<8)+(3<<6)+(3<<4)+(3<<2)+0)
let0x1c80018=((3<<13)+(3<<11)+(7<<8)+(3<<6)+(3<<4)+(3<<2)+0)
let0x1c8001c=((3<<15)+(0<<2)+0)
let0x1c80020=((3<<15)+(0<<2)+0)
let0x1c80024=((1<<23)+(0<<22)+(1<<20)+(1<<18)+(2<<16)+1019)
let0x1c80028=0x0
let0x1c8002c=0x20
let0x1c80030=0x20
打开ARM调试器ARMDebuggerforWindows,在View中选择Command,在Command窗口键入obeysdram.ini
注:
以上步骤是为了配置SDRAM控制寄存器,使得SDRAM能够作为系统的主存,能够被调试器读写。
实验三S3C44B0GPIO的使用
实验目的熟悉JTAG调试器的原理。
熟悉ARMSDTARMDebuggerJTAG调试的设置和使用。
掌握S3C44B0GPIO的配置和使用。
实验条件Windows平台的ARMSDT2.51软件:
ARMProjectManager和ARMDebugger;jtag.exe;EFLAG-ARM-S3C44B0实验箱
实验内容复习实验二的内容。
编写代码,将GPIO配置成为所需要的输出模式。
在调试器上仿真软件的执行。
在实验箱上,调试软件,并观察软件的执行结果。
实验要点在调试软件目录中启动DebugServer.exe,调试器服务程序。
启动SDT调试软件ARMDebugger。
首次使用SDT调试软件时,要对SDT进行配置,如下图。
点击菜单中Options选项,点击ConfigureDebugger选项。
点击Configure选项,选择Ethernet,输入IP地址为:
127.0.0.1即本机缺省IP回环地址。
打开SDT菜单中的File选项中的Loadimage菜单,调入编译好的要调试的映像文件,可按照单步、全速、设置断点等方式进行调试。
实验箱上GPG3,GPE5,GPE6,GPE7上分别连接了LED,通过学习S3C44B0通用IO的使用方法。
以GPG3为例,如果想要使用output功能的话,就需要首先将PCONG的对应的[7:
6]比特字段设为01,如果需要点亮GPG3对应的LED的话,可以直接控制PDATG的比特[3]。
程序示例:
AREAGPIO,CODE,READONLY
ENTRY
BStart
B.
B.
B.
B.
B.
B.
B.
Start
Blgpg_init
1
Blled_on
Bldelay
Blled_off
Bldelay
B%B1
Gpg_init
Ldrr0,=0x1d20040;PCONG
Ldrr1,=0x40
Strr1,[r0]
MovPc,lr
Led_off
Ldrr0,=0x1d20044;PDATG
Ldrr1,=0x00
Strr1,[r0]
MovPc,lr
Led_on
Ldrr0,=0x1d20044;PDATG
Ldrr1,=0x08
Strr1,[r0]
MovPc,lr
Delay
Movr3,=100000
1
subsr3,r3,1
beq%B1
movpc,lr
END
编译链接的设定:
输出文件格式设为elf,文件名为*.axf
调试时,首先启动arm调试器,选择远程调试(remotedebugging),调试器设置如“JTAG调试器的使用”实验。
在File中选择LoadImage,找到所需的*.axf文件,双击,即可。
实验四汇编语言编程练习
实验目的熟悉ARMSDT软件开发方法和技能;
学习和巩固ARM指令集;
学习和巩固汇编语言程序设计
实验条件Windows平台的ARMSDT2.51软件:
ARMProjectManager和ARM
Debugger;DebugServer.exe;EFLAG-ARM-S3C44B0实验箱
实验内容目录ARM251\EXAMPLES\ASM下的汇编程序,
学习和调试代码,分析所得结果。
在调试器上仿真软件的执行。
在实验箱上,调试软件,并观察软件的执行结果。
实验要点在调试软件目录中启动DebugServer.exe,调试器服务程序。
启动SDT调试软件ARMDebugger。
实验报告要求给出adrlabel.apj,blocks.apj,ldrlabel.apj,strcopy.apj,tblock.apj五个项
目的源代码分析和调试记录(存储器和寄存器的内容变化)。
实验五S3C44B0键盘驱动实验
实验目的学习键盘驱动的原理。
掌握通过CPU的I/O扩展键盘的方法。
实验条件Windows平台的ARMSDT2.51软件:
ARMProjectManager和ARMDebugger;jtag.exe;EFLAG-ARM-S3C44B0实验箱。
实验内容
通过ARM的rPDATC(低四位)和rPDATE(4—7位)扩展4*4键盘,编写实现键盘的驱动,通过按键可以在超级终端和液晶屏上显示相应的键值(若无操作系统只要求在超级终端上显示)。
实现键盘扫描一般有两种方法:
用现有的一些I/O扩展芯片实现键盘的硬扫描。
用软件实现键盘的扫描。
使用硬件的办法实现键盘扫描,在程序的编写上固然比较方便,但多用一个芯片无疑会增加成本。
软件扫描键盘有助于成本的降低,并且只需要级很少的程序开销,其性能是和硬件扫描的办法完全相同的。
嵌入式控制器的功能强大,可以充分利用嵌入式控制器的强大功能,下面就介绍一下软件键盘扫描的实现方法。
简单的键盘是接在处理器I/O口上的一个瞬时接触开关,处理器通过I/O口上的电平高低来确定当前按键的状态。
当开关打开时,处理器通过上拉电阻接到电源上的I/O口将得到高逻辑电平;开关一旦关闭,该I/O口将被被拉成逻辑低电平。
但这只是原理上的分析。
事实上,瞬时开关的接触并不是原理中分析的那样,在运行速度很快的处理器看来,瞬时开关的一次按下和抬起的动作是一连串的脉宽不等的脉冲序列,这个脉冲序列大概要持续5ms—30ms左右。
我们称之为键盘抖动。
可以想象,如果对这样的抖动不做任何处理,那么当开关完成一次开启和闭合的动作后,处理器则会认为这个键进行了多次开启和闭合的操作,我们得到的结果肯定不会正确。
我们可以在软件中解决这个问题,使一次按键只获得一次按键的结果。
这叫做键盘消抖。
具体办法将在程序中做详细的描述。
当我们需要很多的按键时,如果还利用上面的办法,那么处理器为我们提供的I/O口资源将很快被用完。
我们在设计系统时,尤其是较复杂的系统时,经常会感觉薪片的I/O资源不够用,让键盘占用了过多的I/O资源是很不经济的。
解决这个问题最有效的办法是使用键盘阵列。
键盘阵列实际上是一个由瞬时开关组成的二维矩阵。
当行数和列数一样多时,也就是方阵时,将获得最优的补阵方式。
瞬时开关位于每一行和每一列的交叉点上。
每一行由一个I/O口做输出驱动,而每一列则又一个上拉电阻接到一个做输入的I/O口。
实验要点
键盘的扫描是由以下的方法实现的。
在每一个相等的时间间隔后,做行扫描的输出端口发出一个逻辑低的行扫描信号,此时其他行扫描线保持逻辑高。
接着,从处理器读列扫描线,如果有键被按下,则会在该键所在的列上读到一个逻辑低电平,结合当前的行扫描值,就可以确定是哪个键被按下,这里需要注意的是,回读时一定要在程序中进行消抖,原理已经在上面介绍过了。
显然,处在键盘阵列中的每一个瞬时开关都唯一对应一个确定的键值,因为矩阵中每一个元素都有其唯一对应的行号和列号。
而这里所说的键值就是我们通过扫描得到的扫描码。
在我们通常使用PC机时,有时会同时按下多个键来完成一个功能(如Ctrl+Alt+Del)。
这种在有n-1个键已被按下同时能正确判断第n个键被按下的情况叫键盘转滚。
在实验时我们不要求键盘具有这种n键转滚能力。
本系统使用一个4*4键盘阵列,GPG7—GPG4输出扫描信号,GPF8—GPF5回读扫描值。
在键盘扫描时,分别将GPG7—GPG5置为逻辑低,如果有键按下,则可从所对应GPF8—GPF5读到一个逻辑低电平。
键盘的消抖由软件实现,在处理器发现有键按下后,延迟一段时间在读一次键值,如果两次得到的键值相同则认为该键被按下一次,若不同,则认为得到的键值是由于抖动引起的。
键盘允许键值的自动重复,即按住一个键不放会多次得到相同的键值并多次进行相应的操作。
程序示例:
void__irqkeyboard(void)
{
charx,y,xrecord,yrecord,temp,key_val;
rI_ISPC=BIT_EINT0;//clearpending_bit
Delay(400);
if((rPDATF&0x1E0)==0x1E0)
{
return;
}
else
{
x=1;
y=1;
xrecord=(~((rPDATF&0x1E0)>>1));
xrecord=xrecord>>4;
while(xrecord!
=0x1)
{
x=x+1;
xrecord=xrecord>>1;
if(xrecord==0)
{
rPDATG=0X0F;
return;
}
}
rPDATG=0XEF;
while((rPDATF&0x1E0)==0x1E0)
{
rPDATG=rPDATG<<1;
temp=rPDATG;
if((temp&0xf0)==0XF0)
{
rPDATG=0X0F;
return;
}
}
yrecord=~((rPDATG&0xF0)>>4)&0x0F;
while(yrecord!
=0x1)
{
y=y+1;
yrecord=yrecord>>1;
if(yrecord==0)
{
rPDATG=0X0F;
return;
}
}
key_val=x+(y-1)*4-1;
Uart_Printf("\nKeyPressed!
Value:
%d\n",x+(y-1)*4-1);
switch(key_val){
case10:
{if(lcd_updown<120)lcd_updown+=10;break;}
case11:
{if(lcd_updown>-120)lcd_updown-=10;break;}
case15:
{if(lcd_leftright<160)lcd_leftright+=10;break;}
case7:
{if(lcd_leftright>-160)lcd_leftright-=10;break;}
}
Lcd_MoveViewPort(160+lcd_leftright,120+lcd_updown,MODE_COLOR);
Delay(200);
rPDATG=0X0F;
}
}
实验六S3C44B0PLL的使用
实验目的熟悉锁相环的工作原理。
学习使用S3C44B0锁相环的控制的方法。
实验条件Windows平台的ARMSDT2.51软件:
ARMProjectManager和ARMDebugger;jtag.exe;EFLAG-ARM-S3C44.B0实验箱。
实验内容锁相环控制寄存器的设定,并在不同的时钟频率条件下测试程序代码对于时钟频率的依赖性。
分别在不同的时钟频率下进行LED闪烁和串行通信实验。
实验要点
Fpllo=(m*Fin)/(p*2s)
m=M(thevaluefordividerM)+8,p=P(thevaluefordividerP)+2
voidChangePllValue(intmdiv,intpdiv,intsdiv)
{
rPLLCON=(mdiv<<12)|(pdiv<<4)|sdiv;
}