shaoshunda 发表于 2009-10-27 12:00:07

AT91SAM7S256像往U盘拷贝文件一样更新用户程序(包含源代码)

源码:
点击此处下载 ourdev_496409.rar(文件大小:404K) (原文件名:AT91SAM7S256(0.1).rar)
编译好的bin文件:
点击此处下载 ourdev_496411.rar(文件大小:5K) (原文件名:usbmemboot(256).rar)

占用资源:flash 0x100000~0x101FFF, io PA10,PA28
USB上的1.5K电阻上拉到PA28

使用方法:
首先用HJTAG,JLINK之类的工具将usbmemboot.bin文件下载到AT91SAM7S256的内部flash,下载完毕后关闭板子的电源。
接着用跳线将PA10短接到地(GND),重新上电后在PC端将出现一个U盘。更新应用程序时只需将U盘内bin文件删除,
将编译好的应用程序的bin文件拷贝到U盘,即完成了应用程序的更新。关闭板子电源,取消跳线(PA10悬空),重新
上电应用程序开始运行。
注意:
应用程序的起始地址为0x102000,编译应用程序的时候在编译器上要配置为0x102000

如果要在AT91SAM7S64上使用,只需将代码中的#include <AT91SAM7S256.H>改为#include <AT91SAM7S64.H>重新编译即可


boot的工程配置截图:

http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_496647.jpg
(原文件名:boot工程配置.jpg)

ForNever 发表于 2009-10-27 13:04:14

牛!

yangsen 发表于 2009-10-27 13:13:47

收藏

spy2008 发表于 2009-10-27 13:31:05

学习

WOTASOM 发表于 2009-10-27 15:01:20

很好!

bluelucky 发表于 2009-10-27 16:24:06

有创意!这个对于调试映像还是很有帮助的!
对bin文件有什么附加的限制吗,比如是不是一定要使用位置无关代码?

yinjinzhong 发表于 2009-10-27 16:47:35

好东西,mark一下!

eaglelpx 发表于 2009-10-27 16:53:26

标记
有空再玩

wchp314 发表于 2009-10-27 16:55:09

mark!

shaoshunda 发表于 2009-10-27 21:51:02

回【5楼】 bluelucky
以AT91SAM7S-EK的Blinky为例,C:\Keil\ARM\Boards\Atmel\AT91SAM7S-EK\Blinky

修改后的工程设置截图:

http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_496590.jpg
(原文件名:修改后截图.jpg)

只修改了IROM1 的Start 和 Size的参数,其它设置无需修改。
boot占用的是0x100000~0x101FFF,用户代码可使用的空间是从0x102000开始到flash的结束。
AT91SAM7S256的flash大小为0x40000,所以Start=0x102000,Size=0x40000-0x2000=0x3E000

关键点:就是要将编译出来的HEX文件转换成BIN文件。

shaoshunda 发表于 2009-10-27 22:05:34

接上跳线的截图:
http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_496593.jpg
(原文件名:接上跳线的截图.jpg)
AT91IAP(H:)是boot虚拟出来的U盘

ba1731 发表于 2009-10-27 22:05:59

很棒,回头试试

shaoshunda 发表于 2009-10-27 22:41:31

以C:\Program Files\IAR Systems\Embedded Workbench 5.4\arm\examples\Atmel\at91sam7s-ek\usb-device-cdc-serial-project为例

修改at91sam7s256对应的flash.icf,只修改__ICFEDIT_region_ROM_start__,修改后的内容如下:

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__   = 0x102000;
define symbol __ICFEDIT_region_ROM_end__   = 0x13FFFF;
define symbol __ICFEDIT_region_RAM_start__   = 0x200000;
define symbol __ICFEDIT_region_RAM_end__   = 0x20FFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_startup__= 0x100;
define symbol __ICFEDIT_size_vectors__= 0x100;
define symbol __ICFEDIT_size_cstack__   = 0x1000;
define symbol __ICFEDIT_size_sysstack__ = 0x60;
define symbol __ICFEDIT_size_irqstack__ = 0x60;
define symbol __ICFEDIT_size_heap__   = 0x0;
/*-Exports-*/
export symbol __ICFEDIT_region_ROM_start__;
export symbol __ICFEDIT_region_ROM_end__;
export symbol __ICFEDIT_region_RAM_start__;
export symbol __ICFEDIT_region_RAM_end__;
export symbol __ICFEDIT_size_startup__;
export symbol __ICFEDIT_size_vectors__;
export symbol __ICFEDIT_size_cstack__;
export symbol __ICFEDIT_size_sysstack__;
export symbol __ICFEDIT_size_irqstack__;
export symbol __ICFEDIT_size_heap__;
/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region STA_region = mem:;
define region ROM_region = mem:;
define region VEC_region = mem:;
define region RAM_region = mem:;

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block SYS_STACK with alignment = 8, size = __ICFEDIT_size_sysstack__ { };
define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__   { };

initialize by copy { readwrite };
initialize by copy { section .vectors };
do not initialize{ section .noinit };

place in STA_region { section .cstartup };
place in ROM_region { readonly };
place in VEC_region { section .vectors };
place in RAM_region { readwrite, block IRQ_STACK, block SYS_STACK, block CSTACK, block HEAP };

http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_496625.jpg
(原文件名:flash.icf截图.jpg)
//------------------------------------------------------------------------------------------------------
http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_496627.jpg
(原文件名:board.h截图.jpg)
board.h只修改 PIN_USB_PULLUP 改为PA28根据实际硬件修改。
编译生成at91sam7s256_flash.bin

helloshi 发表于 2009-10-27 22:50:38

这个好

shaoshunda 发表于 2009-10-27 22:52:52

打开虚拟U盘AT91IAP(H:)

http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_496631.jpg
(原文件名:打开的虚拟U盘.jpg)
//------------------------------------------------------------------------------------------------------
先将盘中的usbtools.bin文件删除,再将at91sam7s256_flash.bin拷贝到盘中。
http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_496633.jpg
(原文件名:拷贝后截图.jpg)
//-------------------------------------------------------------------------------------------------------

shaoshunda 发表于 2009-10-27 23:00:11

板子下电,取消跳线,重新上电运行,安装驱动程序

http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_496635.jpg
(原文件名:USB虚拟串口效果图.jpg)

xk2yx 发表于 2009-10-27 23:08:06

不错

lijinsong 发表于 2010-3-9 20:24:42

mark

zzwuyu 发表于 2010-3-9 20:36:37

mark

Jerry2010 发表于 2010-5-25 18:13:57

这个U盘功能相当的好!


有个问题请教shaoshunda大侠:

如果用户代码是有操作系统(比如uCOS-II)的话是不是还需要修改一下代码?

只修改__ICFEDIT_region_ROM_start__好像不行

flyingcys 发表于 2010-5-25 18:19:29

关注!

Jerry2010 发表于 2010-12-10 18:10:04

没有人研究这个问题么?

改了icf文件:
define symbol __ICFEDIT_intvec_start__      = 0x00104000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__= 0x00104100;
define symbol __ICFEDIT_region_ROM_end__    = 0x0013FFFF;
define symbol __ICFEDIT_region_RAM_start__= 0x00200040;
define symbol __ICFEDIT_region_RAM_end__    = 0x0020FF00;

然后改启动代码,将中断向量表复制到SRAM开始处,再REMAP将SRAM重定位到0地址处.
原以为这样应该可以跑起来,结果还是不行......


OSStatInit...

CPU_ARM_EXCEPTION #3 trapped.
Prio: 3
R0: 0x00000001
R1: 0x0020a6d4
R2: 0x0020a4d0
R3: 0x00000000
R4: 0x20000010
R5: 0x05050505
R6: 0x06060606
R7: 0x07070707
R8: 0x08080808
R9: 0x09090909
R10 : 0x10101010
R11 : 0x11111111
R12 : 0x0020a6e4
SP: 0x00206c20
LR: 0x0011450c
PC: 0x0011450c
CPSR: 0x00000010

-----Task Statk info-----
TaskPrio_3 : Total=8192, Used=380
TaskPrio_30 : Total=512, Used=88
TaskPrio_31 : Total=512, Used=64

-----Halt---------

查看MAP文件,0x0011450c附近的:
OS_MemClr               0x00114444    0x28CodeGbos_core.o
OS_Sched                0x0011446c    0xb0CodeGbos_core.o
OS_SchedNew             0x0011451c    0x3cCodeLcos_core.o
OS_TCBInit            0x001146c0   0x1c4CodeGbos_core.o

应该是在OS_Sched中产生了异常: OS_CPU_ARM_EXCEPT_PREFETCH_ABORT

zbjzxc 发表于 2010-12-10 18:31:28

记号!以前也看过LPC的。不错

haigerl 发表于 2010-12-10 18:36:19

mark

Jerry2010 发表于 2010-12-10 18:52:06

顶起!

    有没有高人来研究这个问题咧?

loqin 发表于 2011-1-12 13:43:55

mark

strongtang 发表于 2011-1-13 22:34:54

MARK

dzyong 发表于 2011-1-14 22:47:20

好东西,那天搞到9261上就爽了~~~~~~

sjhjz 发表于 2011-3-3 11:53:30

mark

szyax 发表于 2011-3-3 13:12:22

真不赖。

lqdjdy 发表于 2011-3-3 13:25:43

太强了

wumei3354 发表于 2014-3-4 20:26:13

{:victory:}

eehong 发表于 2014-3-4 22:16:02

Mark 像往U盘拷文件一样更新应用程序。
现场升级的话,这个方式貌似没有直接使用U盘来的方便哦

tarchen 发表于 2014-3-14 17:34:56

好东东,赶紧收起来。

sunliezhi 发表于 2014-3-14 18:22:13

以后用得着!

sddzycnq 发表于 2014-3-18 12:59:10

呵呵。还要用跳线啊。不用跳线不行么???

w503367930 发表于 2014-3-30 07:58:58

啊牛逼啊
页: [1]
查看完整版本: AT91SAM7S256像往U盘拷贝文件一样更新用户程序(包含源代码)