嗨对话人员
我在14580 Base SDK5.0.3中开发我的申请,我的代码大小约为32.4k,比OTP 32K限制更大。
所以我修改了分散来支持它(使用UM-B-011),
并在SysInit时添加“Coderloader”调用,我将FW刻录到闪存中,发现它很好!
#####代码我添加
“coderloader”在system_armcm0.c中,并在systeminit乐趣后调用它
//#define boot_from_flash
#ifdef boot_from_flash.
#define sysram_code_start_addr 0x20008000L.
#define sysram_code_stop_addr 0x20009200L.
#define sysram_code_spi_addr 0x8008.
void codeloader(空白)
{
unsigned char * p_code;
if((getword16(sys_stat_reg)&dbg_is_up)== dbg_is_up)
返回;
setword16(p0_set_data_reg,1 << 3);//将p0_3设置为高
SetBits16(Sys_ctrl_reg,pad_latch_en,1);//打开垫闩锁
setBits16(PMU_CTRL_REG,PERIPH_SLEEP,0);//退出外围设备
setword16(clk_per_reg,spi_enable);
setword16(p03_mode_reg,pid_spi_en +输出);//设置P0_3 SPI CS(主模式,输出)
setword16(p00_mode_reg,pid_spi_clk +输出);//设置P0_0 SPI CLK(主模式,输出)
setword16(p06_mode_reg,pid_spi_do);//设置P0_6 SPI MOSI(数据出版)
setword16(p05_mode_reg,pid_spi_di + input_pullup);//设置p0_5 spi miso(数据)
setword16(p0_set_data_reg,1 << 3);//停用,
p_code =(unsigned char *)(sysram_code_start_addr);
// Master,Mode 3的Init Spi
setword16(spi_ctrl_reg,0);
setword16(spi_ctrl_reg,spi_pol + spi_pha);
setword16(spi_ctrl_reg,spi_pol + spi_pha + spi_on + 0x0100);
setword16(p0_reset_data_reg,1 << 3);//启用高转换的闪光灯
setword16(spi_rx_tx_reg1,0x0300);// SPI_RX_TX_REG1 0x50001204
setword16(spi_rx_tx_reg0,sysram_code_spi_addr);// spi_rx_tx_reg0 0x50001202 // sysram_code_spi_addr 0x8008
而(getBits16(SPI_CTRL_REG,SPI_INT_BIT)== 0);//轮询等待SPI有数据
setword16(spi_clear_int_reg,0x01);//清洁待定标志
setword16(spi_ctrl_reg,spi_pol + spi_pha + spi_on);// spi_ctrl_reg 0x50001200.
while(p_code <(unsigned char *)sysram_code_stop_addr)// sysram_code_stop_addr 0x20009800L
{
setword16(spi_rx_tx_reg0,0x00);// spi_rx_tx_reg0(0x50001202)/ * spi rx / tx register0 * /
而(getBits16(SPI_CTRL_REG,SPI_INT_BIT)== 0);//轮询等待SPI有数据
* p_code ++ = getword16(spi_rx_tx_reg0);//从spi读取字节
setword16(spi_clear_int_reg,0x01);//清洁待定标志
}
setword16(p0_set_data_reg,1 << 3);//停用,
setword16(spi_ctrl_reg,0);//重置SPI.
}
但是当我尝试通过UART启动580时,我发现它不起作用,所以我猜是FirstBootloader限制代码大小小于32k?
并确认:
1. SmartSnippets按UART下载SecondaryBootLooder,它工作
2. SmartSnippets在580运行SecondaryBootloader时通过UART下载我的FW,这次工作!!!!
你能解释一下吗?
嗨东方,
要查看我是否正确考虑,您设法具有大于32k的FW,当您将其放入闪存时,您的程序正常工作,但通过UART下载代码时
使用智能片段没有。
1)因此,为了调试此操作,您可以通过智能片段使用UART运行辅助引导加载程序,并且辅助引导程序工作(如应该是)。
2)然后您尝试下载您的FW,而辅助引导加载程序已经通过智能片段运行次数运行?我不能看到这是可能的,我的意思是,当FW正在运行时,您尝试通过智能代码段下载代码,通过UART才能点击RESET按钮,以便主引导程序运行和下载FW。因此,只要可以看到FW,主引导加载程序在580中下载了,因为重置后的次级引导程序实际上并不运行。
关于主引导加载程序的32k限制,没有这样的限制,SPI和UART的Bootaloder是相同的,并且没有限制它们,主引导加载程序检查的唯一是CRC每个下载结束。
谢谢mt_dialog.
嗨对话人员,谢谢你的答案!
我通过Smart Scompets通过UART运行辅助引导加载程序,并且辅助引导程序工作。然后下载我的FW,而辅助引导加载程序已经通过智能片段运行。我点击了下载按钮,但是没有点击重置按钮,我认为智能代码段通过UART刀具请求点击重置按钮,因为需要从设备接收开始字节。
所以,INDED,我的FW通过辅助引导加载程序下载而不是主引导程序。
从Flash启动时,主引导加载程序的32K限制存在,因此我必须添加Codeloader()以完成FW加载。
嗨东方,
我没有意识到这种限制,但事实上,在Bootrom中有这种限制,似乎它不是Bootrom代码本身有限制,而是如何在内存中运行,如果您开始提供更多32K的数据您将覆盖BootCode本身的变量,以便您需要辅助引导加载程序来加载大于32K的图像。如果您不想使用辅助引导加载程序,并且您想要使用此自定义代码加载程序方案,您将必须Tweek生成的二进制文件。您必须提供等于32k的长度,以便绑定到Sysram开始执行,然后运行代码,使CodeLoader将其余部分复制到Sysram中。
谢谢mt_dialog.
谢谢!