很多芯片出厂的时候在开始地址处放有bootloader。比如在0x0~0x1000处。只不过经过我们烧写一次之后,就把这个位置的bootloader给擦掉了。
先简单说下步骤,然后再说程序该怎么改:
1.先下载以太网的bootloader到0x0处,当然这个bootloader中要指定应用程序的起始地址,比如我们给bootloader留下4k的空间,则应用程序的起始地址是0x1000.
2.找到要下载的应用,修改其*.sct文件,是应用的下载地址为0x1000,注意修改后别忘了编译一下。
LR_IROM 0x00001000 0x0003f000
{
;
; Specify the Execution Address of the code and the size.
;
ER_IROM 0x00001000 0x0003f000
{
*.o (RESET, +First)
* (InRoot$$Sections, +RO)
}
;
; Specify the Execution Address of the data area.
;
RW_IRAM 0x20000000 0x00010000
{
;
; Uncomment the following line in order to use IntRegister().
;
;* (vtable, +First)
* (+RW, +ZI)
}
}
3.连接网线,如果是第一次下载应用,会自动去执行bootloader,然后打开LM Flash Programer,当然如果C++够好的话,你也可以自己编写一个。
如果已经下载过,你可以指定一个引脚,这里以LM3S8962开发板为例,指定为PF1的select 按钮,在复位前,先按住这个按钮,松手复位键后会自动去执行bootloader(此时OLED上什么也没有),而不是应用程序。
按图中所示指定开发板的IP地址(不要和网内其它主机冲突并要和PC在同一个子网内)和填入开发板MAC(这个MAC地址必须事先烧写好的固定的MAC地址,而不是随便填一个)。
4.然后切换到Program选项卡,选择要下载的应用,这里你可以选在boot-demo1,boot-demo2,boot-demo-eth,或者其它任何修改过sct文件的例程的bin文件。点击Program即可。
[ 本帖最后由 academic 于 2010-11-26 10:34 编辑 ]
在boot_eth的bl_config.h里进行的相关设置。
#define ENABLE_UPDATE_CHECK
#define FORCED_UPDATE_PERIPH SYSCTL_RCGC2_GPIOF
#define FORCED_UPDATE_PORT GPIO_PORTF_BASE
#define FORCED_UPDATE_PIN 1 //使用Select按钮来把引脚拉低。
#define FORCED_UPDATE_POLARITY 0
#define FORCED_UPDATE_WPU
#define ENET_ENABLE_UPDATE
[ 本帖最后由 academic 于 2010-11-22 13:24 编辑 ]当然,我们还可以不使用拉低引脚的方法来通知应用程序把CPU的控制权交给bootloader,就是采用在应用程序中加入swupdate.c模块,这样我们通过不断地去检测是否有这样的一个Magic Packet包到来而决定是否把控制权交给bootloader。这个Magic Packet:AA AA AA AA AA +4次开发板MAC地址。
还可以通过
(*((void (*)(void))(*(unsigned long *)0x2c)))();
也直接去执行在flash开始位置的bootloader,等待升级。
[ 本帖最后由 academic 于 2010-11-24 11:04 编辑 ]