Bootloader下实现Flash的读写_第1页
Bootloader下实现Flash的读写_第2页
Bootloader下实现Flash的读写_第3页
Bootloader下实现Flash的读写_第4页
Bootloader下实现Flash的读写_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目 录课题要求21.本课题的目的22.运行环境2正文2一.课题分析2二系统设计3三技术实现问题5四编译及调试13五.总结与体会16设计性实验报告成绩: 指导教师签名:16课题要求1.本课题的目的在bootloader启动后,提供一个可以读写Flash的程序,可以提供用户保存一些数据,如系统的IP地址。2.运行环境硬件:ARM嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC机Pentium100 以上。软件:PC 机操作系统win98、Win2000 或WinXP 、ARM SDT 2.51 或ADS1.2 集成开发环境、仿真器驱动程序、超级终端通讯程序。正文一. 课题分析本次课题是基于嵌入式系统BootLoader的Flash的读写,因此必须首先了解嵌入式系统BootLoader 的框架和编写过程。BootLoader 和BIOS 在功能上是没有差别的。其功能包括上电后对系统进行自检,主要包括SDRAM,CACHE,FLASH 等硬件;提供Shell Menu 检测设置菜单和相应的检测程序;引导操作系统及应用程序。BootLoader 所谓的引导功能指的是:BootLoader程序首先获得系统的控制权之后,对关键硬件自检,在没有发现故障并且控制台没有发出启用Shell Menu 检测菜单的情况下,依据文件系统的管理和支持,从电子硬盘即16M NAND FLASH 中读取操作系统或应用程序的代码到SDRAM 的指定位置,然后把程序指针转移到该位置,从而使操作系统获得控制权,完成引导过程。在Shell Menu 检测菜单中也可以设置实现引导功能的命令。执行BootLoader时,首先作了必要的硬件初始化,仅给出了NAND FLASH 自检例程(没有给出芯片操作细节),然后输出提示信息。接下来会等待查询是否有键按下,如果没有则直接引导系统;否则显示Shell Menu。 综上,要实现嵌入式系统BootLoader下Flash的读写,需要在基本BootLoader程序的基础上,在Shell Menu上添加擦除扇区、把数据写入Flash、从Flash中读取数据三个菜单,并编写相关功能菜单的代码。 二 系统设计本次设计性试验的在基本的bootloader的基础上添加了三个模块:扇区擦除模块、把数据写入Flash模块、从Flash中读取数据模块。整个实验的的主体部分包含bootloader引导过程流程图、进入Shell Menu后的流程图以及新添加的三个模块的流程图。图 1 图 2 图 3 图 4 图 5三 技术实现问题1、在Shell Menu上添加菜单首先在Shell Menu上添加擦除扇区、把数据写入Flash、从Flash中读取数据三个菜单。每个菜单项都对应一个类型为Bios_function 的结构体变量,其中包括该菜单项的功能函数指针,快捷键,菜单中的提示信息等内容。所有这些结构体变量都在一个数组中,以方便检索。在显示菜单后程序等待按键并根据键值查找对应的功能函数。ios_function 的结构体变量的定义如下:typedef struct Bios_func_t func; char *pShellMenu; /shell 模式下显示的菜单字符串char MenuAcc; /shell 模式下菜单快捷键char *pCommand; /命令行模式下的命令char *pHelp; /命令行模式下的帮助Bios_function;(1)在Shell Menu上添加擦除扇区菜单:Bios_function SectorErase_func=SectorErase,erase the flash,/shell 模式下显示的菜单字符串s, /shell 模式下菜单快捷键eraseflsh, /命令行模式下的命令NULL /命令行模式下的帮助;(2)在Shell Menu上添加把数据写入Flash菜单Bios_function Flashwrite_func=Flashwrite, write the flash,/shell 模式下显示的菜单字符串w, /shell 模式下菜单快捷键writeflash, /命令行模式下的命令NULL /命令行模式下的帮助;(3)在Shell Menu上添加从Flash中读取数据菜单Bios_function Flashread_func=Flashread,read the flash,/shell 模式下显示的菜单字符串r, /shell 模式下菜单快捷键readflsh, /命令行模式下的命令NULL /命令行模式下的帮助;2、编写SectorErase_func函数(1)编写菜单SectorErase_func的源码实现把数据写入Flash的功能static void SWPIDExit(void)CMD_ADDR0 = 0xf0f0;state &= 0xfc;static void CFIQueryExit(void)CMD_ADDR0 = 0xaaaa;CMD_ADDR1 = 0x5555;CMD_ADDR0 = 0xf0f0;state &= 0xfc;void SectorErase(void) /擦除扇区函数U32 sector;if(state&1)if(state&2)SWPIDExit();elseCFIQueryExit();sector = 0x10000;/要擦除扇区的起始地址CMD_ADDR0 = 0xaaaa; /向地址0x5555写入0xaaaaCMD_ADDR1 = 0x5555; /向地址0x2aaa写入0x55555CMD_ADDR0 = 0x8080; /向地址0x5555写入0x8080CMD_ADDR0 = 0xaaaa; /向地址0x5555写入0xaaaaCMD_ADDR1 = 0x5555; /向指定地址写入0x3030*(volatile U16 *)sector = 0x3030; /要擦除扇区的结束地址while(1)/一直循环,直到擦除完成才退出U16 i;i = *(volatile U16 *)sector)&0x40;if(i!=*(volatile U16 *)sector)&0x40)/D6 = D6continue;if(*(volatile U16 *)sector)&0x80)break;/D7 = 1printf(Erase sector 0x%xokn, sector-ROM_BASE);(2)编写Flashwrite_func函数编写菜单Flashwrite_func的源码,实现读取Flash数据的功能void FlashProg(U32 ProgStart, U16 *DataPtr, U32 WordCnt)U16 i, j;ProgStart += ROM_BASE; /写flash的起始地址为0x10000for( ; WordCnt; ProgStart+=2, DataPtr+, WordCnt-) /一直循环,直到写Flash完成才退出j = *DataPtr;CMD_ADDR0 = 0xaaaa; /向0x5555地址处写0xaaaaCMD_ADDR1 = 0x5555; /向地址0x2aaa处写0x5555CMD_ADDR0 = 0xa0a0; /向地址0x5555处写0xa0a0*(volatile U16 *)ProgStart = j;/向指定地址写入数据while(1)i = *(volatile U16 *)ProgStart&0x40;if(i!=*(volatile U16 *)ProgStart&0x40)/D6 = D6continue;if(*(volatile U16 *)ProgStart&0x80)=(j&0x80)break;/D7 = D7void Flashwrite(void)int dataaddress=123;/定义IP的最后一位 U32 begin=0x10000;/把数据写入的起始地址U32 size=2; /定义规定存放数据的大小为2个字节,即以2/个字节为单位进行存放U8 tmprINTCON;U32 tmprINTMSK;tmprINTCON = rINTCON;tmprINTMSK = rINTMSK; /与前一句一起实现将原有中断保存rINTCON = 0x7;rINTMSK = 0x07ffffff; /与前面一句合起来的作用是关闭中断/调用写函数:FlashProg(begin, (unsigned short *)&dataaddress, size);rINTCON = tmprINTCON;rINTMSK = tmprINTMSK;printf(Program ok n);在对flash进行写操作时,应注意要先对flash进行擦除操作,以免受flash的原有的内容的干扰。(3)编写实现菜单Flashread_func功能的源码void readFlash(unsigned int *dataaddr1) datadata=*dataaddr1;/读出0x10000地址的数据给datadatavoid Flashread(void) char str60; int i,num; char *str0,*str1; unsigned short data; readFlash(unsigned int *)dataaddr); Uart_Printf(Read data address : %u.%u.%u.%un, (datadata24)&0xff, (datadata16)&0xff, (datadata8)&0xff, datadata&0xff);/把数据输出到超级终端上(4)镜像文件的烧写UP-NETARM3000平台UCLINUX系统烧写方法:A、将并口简易Jtag连接到实验箱14针JTAG接口,然后开机。B、在PC端运行UarmJtag2.0软件,点击“初始化配置”,导入文件C:/ProgramFiles/UArmJtag/44b0x-init;C、点击“打开”,找到要烧写的二进制文件“system.bin”;D、点击“FLASH编程”,弹出FLASH编程对话框,“烧录起始地址”为“0X0”,“ARM外部总线”为16位,选上“使用RAM”,点击“选择FLASH”,型号选“Am29LV160B”(16位,2048KB);E、配置好后,点击“扇区擦除”,大约经过4秒左右,擦除扇区完毕;也可以点击“整片擦除”,大约20秒左右,整片FLASH被擦除;F、整片FLASH被擦除后,等5秒钟后,点击“编程”,大概3秒编程完毕。复位3000平台,从超级终端即可看到启动信息,按任意键可进入Shell Menu菜单。需要说明,平台的BIOS 烧写到一片2M BOOT FLASH 芯片中,相当于BOOT ROM,该芯片挂在系统总线上,占用0Bank 地址空间;当系统上电或硬件复位后首先从0Bank 的0x00000000 地址执行指令,也就是从BIOS 开始执行程序。BIOS首先获得系统的控制权。 而操作系统以及应用程序等则是拷贝到另外一片16M NAND FLASH 芯片中的,而且是用文件系统进行管理的,这相当于一个海量存储器或电子硬盘,同时当平台激活USB 时, 该芯片构成U 盘使用。(5)超级终端的使用打开超级终端,输入超级终端的名称,选择ARM 开发平台实际连接的PC 机串口(如COM1),按确定后出现如图4-1 所示的属性对话框,设置通信的格式和协议。这里波特率为115200,数据位8,无奇偶校验,停止位1,无数据流控制。按确定完成设置。图6四编译及调试1、实验步骤:(1)在编译环境下新建工程,设置Release版本的环境,选择保存路径。需要注意的是,由于BootLoader 映象文件最终运行的地址空间是0Bank,所以该工程的连接地址不同于其他运行于SDRAM 的工程。Release版本的RO Base 是0x0,RW Base 是0xc600000;另外, 也可以把工程最后产生的二进制文件名改为bootloader.bin。ADS 环境下,该工程无需其他工程才具有的init 目录,而ARMLinker 配置中的Output 选项中LinkerType 也要选择Simple, 然后输入上述地址即可。 (2)把本实验目录下的源文件加入工程。在这里没有给出文件系统的源码,所以把文件系统的库文件也加入到工程中。SRC目录下包括系统启动的必须初始化配置文件和部分用到的硬件驱动,以实现检测功能。 (3)对工程进行编译,如有错误,则改正错误,直至没有错误。(4)将Jtag的仿真器一端与PC机相连,另一端连到Jtag接口上。串口线接到串口0上。打开电源。具体链接如图7图7(5)镜像文件的烧写:使用合适的烧写工具,比如博创科技的硬件仿真器,把Release 版本的bootloader.bin 烧写到BOOT FLASH 中。注意:在本实验中请用户确保有可靠的烧写工具后再尝试把本实验的结果烧写到BOOT FLASH 中。否则可能无法正确恢复原有BIOS 将会导致系统不能正常使用!(6)打开超级终端,设置相关参数,进入通信界面 (7)进入Shell Menu菜单:将试验箱复位,同时在试验箱上键盘上按下任意键。 (8)擦除扇区:在PC机键盘上按下s键,等一小段时间后将试验箱复位。(9)把数据写入Flash:在PC机键盘上按下w键,等一小段时间后将试验箱复位。(10)把数据从Flash读出,并在超级终端上显示:在PC机键盘上按下r键。实验结果:2、超级终端显示结果重启实验箱,在启动过程中按住实验箱上的小键盘,即在超级终端界面上出现Auto Boot之前长按小键盘。出现如下菜单项。如图8图8按RESET,重启实验箱后,按PC机上的S键,即可擦除flash指定地址

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论