对6713boot_loader的理解

对6713boot_loader的理解

对于dsp6713的bootloader的主要作用:

Ø       在dsp复位上电后能够自行启动,并且将用户的应用程序从FLASH中拷贝到RAM中执行;

Ø       能够跳转到应用程序的入口函数处。

1 对于boot_loader文件夹的主要文件组成

文件夹dsp_refresh_v1_bootload1中有c语言程序也有汇编程序:

boot_c671x_2.s62和c6713_emif.s62:这部分程序为汇编代码,主要定义和配置emif,实现将FLASH中的数据(地址为:0x90000000)拷贝到RAM中执行,并跳转到_c_int00处,启动DSP。一般是硬件自动从外部FLASH的E1块中拿出的起始1KB数据拷贝到内部程序的0地址。

main.c:c语言代码,_c_int00入口代码,判断GSE开关是否有效,有效则通过RS232串口通信完成用户程序写入到FLASH中(地址为:0x90010000),并且调用加载用户程序函数usercode_loader()。

uer_code_loader.asm:汇编代码,主要将FLASH中的用户程序搬运到DSP的RAM中执行,并跳转到执行入口地址。

vecs.asm:汇编代码,中断向量表,实现DSP中断时跳转到正确的对应地址位置去执行中断处理函数,默认的,中断服务表在0地址处。

2 boot_loader和用户程序的加载

Ø       在线加载自启动程序

Ø       自启动程序加载上层用户程序

在线加载自启动程序:在ccs3.3中打开dsp_refresh_v1_bootload1文件夹中的工程文件,编译生成.out文件,用.bat工具将其转换成.hex文件和.map文件。

连接仿真器与测试设备,上电后,在ccs3.3中打开dsp_refresh_0115_success1文件夹下的RS232_peizhi_0811.pjt工程文件,编译执行,在PC机上运行python程序,实现PC与测试设备的RS232数据传输,将bootloader生成的.hex文件固化到FLASH中。

自启动程序加载上层用户程序:在ccs3.3中打开用户程序的工程文件,编译生成.out文件,用.bat文件将其转换成.hex文件和.map文件(注意:FLASH版的用户程序与在线调试版本的用户程序中的vectors.asm和lnk.cmd文件不同,需替换)。

将设备GSE开关拨至有效,上电后,在PC机上运行python程序,实现PC与测试设备的RS232数据传输,将用户程序生成的.hex文件固化到FLASH中,并且bootloader程序在上电后会启动dsp并且加载用户程序到ram中执行。

3 图解6713的程序加载与执行


图1 6713加载bootloader图解

 

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
/********************************************************************************\ \* DEC6713_FLASH.c V2.00 *\ \* Copyright 2004 by SEED Electronic Technology LTD. *\ \* All rights reserved. SEED Electronic Technology LTD. *\ \* Restricted rights to use, duplicate or disclose this code are *\ \* granted through contract. *\ \* Designed by: Hongshuai.Li \* Discription: Erase, write and read the whole chip. \* Date: Modified 05.10.2005 *\ \********************************************************************************/ #include #include #include #include #include #include #include "DEC6713_FLASH.h" #include /********************************************************************************/ Uint32 i; Uint16 TempData; Uint32 Src_StartAdd; Uint32 Dst_StartAdd; extern far void vectors(); /********************************************************************************/ /********************************************************************************/ void main() { Src_StartAdd = 0x90000000; /* Initialize CSL, must when using. */ CSL_init(); /* Initialize DEC6713 board. */ DEC6713_init(); /* Configure interrupt. */ IRQ_setVecs(vectors); IRQ_nmiEnable(); IRQ_globalEnable(); /* Erase flash memory. */ Flash_Erase(0x90000000,0x10); printf("\nErase flash ok."); /* Write flash memory. */ for(i=0;i<0x40000;i++) { Flash_Writes(Src_StartAdd+2*i,fmod(i,0x10000)); } printf("\nWrite flash ok."); /* Read flash memory. */ for(i=0;i<0x40000;i++) { TempData = Flash_Reads(Src_StartAdd+2*i); if(TempData != fmod(i,0x10000)) { printf("\n Testing is Failure!"); printf("\nAddress 0x%x is error!",i); exit(0); } } printf("\nOpereation is success."); } /********************************************************************************\ \* Flash function difine. *\ \********************************************************************************/ /********************************************************************************\ \* Flash erase function. *\ \********************************************************************************/ Uint32 Flash_Erase(Uint32 addr,Uint16 type) { Uint32 i,j; *FLASH_5555 = FLASH_UL1; //first *FLASH_2AAA = FLASH_UL2; //second *FLASH_5555 = FLASH_UL3; //third *FLASH_5555 = FLASH_UL4; *FLASH_2AAA = FLASH_UL5; switch(type) { case 0x50: //block erase *(Uint16 *)addr = type; while((*(Uint16 *)addr & 0x80) != 0x80); for(i = 0; i < BLOCK_SIZE; i++) { if(*(Uint16 *)(addr + i) != 0xffff) { j = 0; break; } } j = 1; break; case 0x30: //sector erase *(Uint16 *)addr = type; while((*(Uint16 *)addr & 0x80) != 0x80); for(i = 0; i < SECTOR_SIZE; i++) { if(*(Uint16 *)(addr + i) != 0xffff) { j = 0; break; } } j = 1; break; case 0x10: //chip erase // for(;;) // { *FLASH_5555 = type; // } while((*FLASH_5555 & 0x80) != 0x80); for(i = 0; i < CHIP_SIZE; i++) { if(*(Uint16 *)(addr + i) != 0xffff) { j = 0; break; } } j = 1; break; default: break; } return (j); } /********************************************************************************\ \* Write a single data. *\ \********************************************************************************/ void Flash_Writes(Uint32 addr,Uint16 data) { //Uint16 TempData=0; *FLASH_5555 = FLASH_UL1; *FLASH_2AAA = FLASH_UL2; *FLASH_5555 = FLASH_PROGRAM; //for(;;) //{ *(Uint16 *)addr = data; //TempData = *(Uint16 *)(addr); //} //TempData = *(Uint16 *)(addr); while(*(Uint16 *)addr != data); } /********************************************************************************\ \* Write the certain length data. *\ \********************************************************************************/ void Flash_Writem(Uint32 addr,Uint16 *ptr,Uint32 length) { Uint32 i; for(i = 0; i < length; i++) { // for(;;) // { Flash_Writes(addr+2*i,*(ptr+i)); // } } } /********************************************************************************\ \* Read a single data. *\ \********************************************************************************/ Uint32 Flash_Reads(Uint32 addr) { return (*(Uint16 *)addr); } /********************************************************************************\ \* Read the certain length data. *\ \********************************************************************************/ void Flash_Readm(Uint32 addr,Uint16 *ptr,Uint32 length) { Uint32 i; for(i = 0; i < length; i++) { *(ptr + i) = Flash_Reads(addr+2*i); } } /********************************************************************************\ \* End of DEC6713_FLASH.C *\ \********************************************************************************/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值