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) 牛! 收藏 学习 很好! 有创意!这个对于调试映像还是很有帮助的!
对bin文件有什么附加的限制吗,比如是不是一定要使用位置无关代码? 好东西,mark一下! 标记
有空再玩 mark! 回【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文件。 接上跳线的截图:
http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_496593.jpg
(原文件名:接上跳线的截图.jpg)
AT91IAP(H:)是boot虚拟出来的U盘 很棒,回头试试 以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 这个好 打开虚拟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)
//------------------------------------------------------------------------------------------------------- 板子下电,取消跳线,重新上电运行,安装驱动程序
http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_496635.jpg
(原文件名:USB虚拟串口效果图.jpg) 不错 mark mark 这个U盘功能相当的好!
有个问题请教shaoshunda大侠:
如果用户代码是有操作系统(比如uCOS-II)的话是不是还需要修改一下代码?
只修改__ICFEDIT_region_ROM_start__好像不行 关注! 没有人研究这个问题么?
改了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 记号!以前也看过LPC的。不错 mark 顶起!
有没有高人来研究这个问题咧? mark MARK 好东西,那天搞到9261上就爽了~~~~~~ mark 真不赖。 太强了 {:victory:} Mark 像往U盘拷文件一样更新应用程序。
现场升级的话,这个方式貌似没有直接使用U盘来的方便哦 好东东,赶紧收起来。 以后用得着! 呵呵。还要用跳线啊。不用跳线不行么??? 啊牛逼啊
页:
[1]