




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第?次实验实验名称 学号姓名 华东师范大学计算机科学技术系实验报告 第1页共14页计算机科学技术系上机实践报告课程名称:嵌入式系统实践年级:上机实践成绩:指导教师:姓名:创新实践成绩:上机实践名称:存储器学号:上机实践日期:上机实践编号:组号:上机实践时间:实验目的通过实验熟悉ARM的内部存储空间分配。熟悉使用寄存器配置存储空间的方法。掌握对存储区进行访问的方法。实验设备硬件:EmbestEduKit-III实验平台,EmbestARM标准/增强型仿真器套件,PC机。软件:EmbestIDEProARM集成开发环境,Windows98/2000/NT/XP。实验内容掌握S3C44B0X处理器对存储空间的配置和读写访问的方法:熟练使用命令脚本文件对ARM存储控制寄存器进行正确配置;使用汇编编程,对RAM按字、半字和字节读写;C语言编程,对RAM按字、半字和字节读写。实验原理S3C44B0X处理器的存储控制器可以为片外存储器访问提供必要的控制信号,它主要包括以下特点:支持大、小端模式(通过外部引脚来选择)地址空间:包含8个地址空间,每个地址空间的大小为32M字节,总共有256M字节的地址空间。所有地址空间都可以通过编程设置为8位、16位或32位对准访问。8个地址空间中,6个地址空间可以用于ROM、SRAM等存储器,2个用于ROM、SRAM、FP/EDO/SDRAM等存储器。7个地址空间的起始地址及空间大小是固定的。1个地址空间的起始地址和空间大小是可变的。所有存储器空间的访问周期都可以通过编程配置。提供外部扩展总线的等待周期。支持DRAM/SDARM自动刷新。支持地址对称或非地址对称的DRAM。S3C44B0X复位后的存储器地址分配图4-1为S3C44B0X复位后的存储器地址分配图。从图中可以看出,特殊功能寄存器位于0X01C00000到0X02000000的4M空间内。Bank0-Bank5的起始地址和空间大小都是固定的,Bank6的起始地址是固定的,但是空间大小和Bank7一样是可变的,可以配置为2/4/8/16/32M。Bank6和Bank7的详细的地址和空间大小的关系可以参考表4-1表4-1Bank6/Bank7地址大/小ENDIAN模式选择处理器复位时(nRESET为低),通过ENDIAN引脚选择所使用的ENDIAN模式。ENDIAN引脚通过下拉电阻与Vss连接,定义为Littleendian模式;ENDIAN引脚通过上拉电阻和Vdd连接,则定义为Bigendian模式.如下表所示。BANK0总线宽度BANK0(nGCS0)的数据总线宽度可以配置为8位、16位或32位。因为BANK0为启动ROM(映射地址为0X00000000)所在的空间,所以必须在第一次访问ROM前设置BANK0数据宽度,该数据宽度是由复位后OM[1:0]的逻辑电平决定的,如下表所示。存储器控制专用寄存器总线宽度/等待控制寄存器(BWSCON)寄存器各位功能:[ENDIAN]:只读,指示系统选定的大/小端模式,0表示小端模式,1表示大端模式。[DWi]:i=0~7,其中DW0为只读,因为bank0数据总线宽度在复位后已经由OM[1:0]的电平决定。DW1~DW7可写,用于配置bank1~bank7的数据总线宽度,00表示8位数据总线宽度,01表示16位数据总线宽度,10表示32位数据总线宽度。[SWi]:i=1~7,写入0则对应的banki等待状态不使用,写入1则对应的banki等待状态使能。[STi]:i=1~7,决定SRAM是否使用UB/LB。0表示不使用UB/LB,引脚[14:11]定义为nWBE[3:0];1表示使用UB/LB,引脚[14:11]定义为nBE[3:0]。Bank控制寄存器(BANKCONn:nGCS0-nGCS5)Bank控制寄存器(BANKCONn:nGCS6-nGCS7)刷新控制寄存器(REFRESH)BANK大小寄存器(BANKSIZE)模式设置寄存器(MRSR)下面列举了13个存储控制寄存器的配置示例:观察上面寄存器介绍中的寄存器地址可以发现,13个寄存器分布在从0x01c80000开始的连续地址空间,所以上面的程序可以利用指令“stmiar0,{r1-r13}”实现将配置好的寄存器的值依次写入到相应的寄存器中。存储器(SROM/DRAM/SDRAM)地址线连接如表4-4所示,数据宽度不同,连接方式也不同。表4-4存储器地址线连接使用命令脚本文件配置存储空间在使用仿真器对目标系统进行硬件仿真调试前,需要把代码下载到目标系统的RAM空间中,所以调试前首先应该配置CPU的存储控制寄存器,初始化可读写空间。EmbestIDEProARM集成环境下可以使用一系列存储写命令来完成存储控制寄存器的配置,称为命令脚本文件(*.cs,有关命令脚本文件请参考EmbestIDE在线用户手册),通过命令脚本文件(*.cs)还可以配置目标系统的其他CPU控制寄存器,如中断控制寄存器。EmbestEduKit-III的调试配置使用的命令脚本文件如下:片选信号设置EmbestEduKit-III实验板的片选信号设置如表4-5所示:表4-5片选信号设置 外围地址空间分配板上外围地址空间分配如表4-6所列:表4-6外围地址空间分配 电路设计EmbestEduKit-III实验板上的存储系统包括一片1M×16bit的Flash(SST39VF160)和一片4M×16bit的SDRAM(HY57V65160B)。如图4-2Flash连接电路所示,处理器是通过片选nGCS0与片外Flash芯片连接。由于是16bit的Flash,所以用CPU的地址线A1-A20来分别和Flash的地址线A0-A19连接。Flash的地址空间是从0x00000000~0x00200000。Flash连接电路如图SDRAM连接电路所示,SDRAM分成4个BANK,每个BANK的容量为1M×16bit。BANK的地址由BA1、BA0决定,00对应BANK0,01对应BANK1,10对应BANK2,11对应BANK3。在每个BANK中,分别用行地址脉冲选通RAS和列地址脉冲选通CAS进行寻址。本实验板还设置跳线,可以为用户升级内存容量至4×2M×16bit。具体方法为使SDRAM的BA0、BA1分别接至CPU的A21、A22,A23脚。SDRAM由MCU专用SDRAM片选信号nSCS0选通,地址空间从0x0C000000~0x0C7FFFFF。SDRAM连接电路实验步骤1.准备实验环境:使用Embest仿真器连接目标板,使用EmbestEduKit-III实验板附带的串口线,连接实验板上的UART0和PC机的串口。2.串口接收设置在PC机上运行windows自带的超级终端串口通信程序(波特率115200、1位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序。3.打开实验例程1)拷贝光盘CD1\Software\EduKit44b0文件夹到EmbestIDE\Examples\Samsung\目录下;2)使用EmbestIDE通过EmbestJTAG仿真器连接实验板,打开实验例程目录4.2_led_test子目录下的led_test.pjf例程,编译链接工程;ARM7基础实验教程-166-3)点击IDE的Debug菜单,选择RemoteConnect项或F8键,远程连接目标板;4)点击IDE的Debug菜单,选择Download下载调试代码到目标系统RAM中;5)在工程管理窗口中双击led.c就会打开该文件,在“leds_off();”设置断点后,点击Debug菜单Go或F5键运行程序;6)当程序停留到断点后,观察当前led1206、led1207的状态,点击Debug菜单下的Stepover或F10键执行程序,观察led1206、led1207的变化;7)结合实验内容和实验原理部分,掌握ARM芯片中复用I/O口的使用。4.观察实验结果:在PC机上观察超级终端程序主窗口,可以看到如下界面:bootsuccess...LedTestExample程序正确运行后,可以看到实验系统上LED1206和LED1207进行以下循环:LED1206亮->LED1206关闭->LED1207亮->LED1206和LED1207全亮->LED1207关闭->LED1206关闭5.完成实验练习题理解和掌握实验后,完成实验练习题。六、调试过程、结果和分析1.实验时先运行了原来的函数,改变memory变量。2.这次实验首先是要从光盘里打开源文件,观察实例程序是如何实现word,halfword以及byte的调用,然后再通过打开源文件而进行下面的实验。3.在程序调试的过程中始终报r5(我在程序中使用的一个寄存器)未被指定,后来在老师的帮助下,发现是我的一个汇编代码写的有点问题,ldrbr3,=r5应该改为ldrbr3,【r5】七、总结1.本次上机第一次用到EmbestARM标准/增强型仿真器套件,并且本次题目题目比较难,尽管老师给了我们充足的时间去完成所有的练习题,但结果差强人意。本次实验题目的主要内容是从内存中按word,halfword以及byte读写,同时也复习了之前的内容,如各种c程序和汇编程序的相互调用,通过这次试验对于存储器有了更加直观的认识。2.关于代码部分,基本根据示例程序可以完成基本架构,但是有些细节还是无法完成,导致调试不成功,当然代码不是个人的劳动结晶,最终跟同学共同完成了试验任务。八、附件编写C语言函数Main()定义变量src_addr,dst_addr,num,其值可变,理论上可定义为任意整数调用函数s_init(...)实现从src_addr起始的连续num个字节的内存各字节依次写为0x1~num调用函数c_move(...)实现从src_addr读取连续num个字节的内存,并逆序依次写入dst_addr起始的连续内存地址通过超级终端反馈操作信息Main.cvoid__gccmain(){}; intMain(){ intsrc_addr,dst_addr,num;src_addr=0x1000; dst_addr=0x2000; num=9; s_init(src_addr,1,num); c_move(src_addr,dst_addr,num);while(1); return;}2.编写汇编语言函数s_init(start_addr,start_num,num)实现从start_addr起始的num字节初始化为start_num~(start_num+num-1),即:递增数列,步长1要求字初始化部分调用函数c_init_word(start_addr,start_num,num_word)实现要求字节初始化部分调用函数s_init_byte(start_addr,start_num,num_byte)实现s_init.s.globals_init.text.externc_init_word.externs_init_bytes_init: mov ip,sp stmdb sp!,{fp,ip,lr,pc} sub fp,ip,#4 and v1,a3,#3 bic v2,a3,#3 init_word: movs a3,a3,lsr#3 beq init_byte bl c_init_wordinit_byte: cmp v1,#0 beq over add a1,a1,v2 add a2,a2,v2 mov a3,v1 bl s_init_byteover: ldmdb fp,{fp,sp,pc}3.编写C语言函数c_init_word(start_addr,start_num,num_word)c_init_word.cvoidc_init_word(intstart_addr,intstart_num,intnum_word){ if(start_addr%4) { uart_printf("字未对齐\n"); return; } int*p=(int*)start_addr; inti=0; for(i=0;i<num_word;i++) { *p=start_num+i; p++; }}4.编写汇编语言函数s_init_byte(start_addr,start_num,num)s_init_byte.s.globals_init_byte.texts_init_byte: mov ip,sp stmdb sp!,{fp,ip,lr,pc} sub fp,ip,#4loop: strb a2,[a1] add a1,a1,#1 add a2,a1,#1 subs a3,a3,#1 bne loop ldmdb fp,{fp,sp,pc}5.编写C语言函数c_move(src_addr,dst_addr,num)c_move.c#defineSWAP(a,b){chart;t=a;a=b;b=t;}externintc_move_read(intsrc_addr,intnum);externvoids_move_write(intdst_addr,intdata,intnum);voidc_move(intsrc_addr,intdst_addr,intnum){ unionbit32_1{ intwhole; charc[4]; }temp; inti=num%4; if(i!=0) { temp.whole=c_move_read(src_addr,i); if(i==3) SWAP(temp.c[0],temp.c[2]) elseif(i==2) SWAP(temp.c[0],temp.c[1]) s_move_write(dst_addr+num-i,temp.whole,i); } i=num/4; if(i==0)return; src_addr+=i; while(i!=0) { temp.whole=c_move_read(src_addr,4); SWAP(temp.c[0],temp.c[3]); SWAP(temp.c[1],temp.c[2]); s_move_write(dst_addr+4*(i-1),temp.whole,4); i--; src_addr+=4; }}6.编写C语言函数c_move_read(src_addr,num)num<=4从src_addr起的num字节读取if(num==4)按字读取;elseif(num==3)先按半字读取,后按字节读取;elseif(num==2)按半字读取;elseif(num==1)按字节读取;else反馈错误信息。c_move_read.cintc_move_read(intsrc_addr,intnum){ unionbit32_2{ intwhole; shorthalf[2]; charc[4]; }ret; if(num==4) ret.whole=(*(int*)src_addr); else if(num==3){ ret.half[0]=(*(short*)src_addr); ret.c[2]=(*(char*)(src_addr+2)); } elseif(num==2) ret.half[0]=(*(short*)src_addr); elseif(num==1) ret.c[0]=(*(char*)(src_addr+2)); else uart_printf("wrongnum!!\n"); } returnret.whole;}7.编写汇编语言函数s_move_write(dst_addr,data,num)s_move_write.s.globals_move_write.texts_move_write: mov ip,sp stmdb sp!,{fp,ip,lr,pc} sub fp,ip,#4 cmp a3,#4 beq write_by_4bits cmp a3,#3 beq write_by_3bits cmp a3,#2 beq write_by_2bits cmp a3,#1 beq write_by_1bit bne overwrite_by_4bits: ldr v1,[a2] str v1,[a1] b overwrite_by_3bits: ldrh v1,[a2] str v1,[a1] ldrb v1,[a2,#2] strb v1,[a1,#2] b overwrite_by_2bits: ldrh v1,[a2] str v1,[a1] b overwrite_by_1bit: ldrb v1,[a2,#2] strb v1,[a1,#2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论