14580 FirstBootloader限制代码大小小于32K?

6个帖子/ 0新
最后一篇
东方
离线
最后一次露面:4年6个月前
加入:2015-07-20 04:11
14580 FirstBootloader限制代码大小小于32K?

嗨,对话框的员工

我在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.
#定义x20009200l SYSRAM_CODE_STOP_ADDR 0
#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 (data out)
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);//启用FLASH的高低过渡

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 0 x00);// sp_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,这次工作!!!!

你能解释一下吗?

设备:
mt_dialog.
离线
最后一次露面:5个月2周前
职员
加入:2015-06-08 11:34
嗨东方,

嗨东方,

要查看我是否正确考虑,您设法具有大于32k的FW,当您将其放入闪存时,您的程序正常工作,但通过UART下载代码时
使用智能片段没有。

1)因此,为了调试此操作,您可以通过智能片段使用UART运行辅助引导加载程序,并且辅助引导程序工作(如应该是)。

2)然后您尝试下载您的FW,而辅助引导加载程序已经通过智能片段运行次数运行?我不能看到这是可能的,我的意思是,当FW正在运行时,您尝试通过智能代码段下载代码,通过UART才能点击RESET按钮,以便主引导程序运行和下载FW。因此,只要可以看到FW,主引导加载程序在580中下载了,因为重置后的次级引导程序实际上并不运行。

关于主引导加载程序的32K限制,没有这样的限制,SPI的引导程序和UART的引导程序是一样的,它们都没有限制,主引导加载程序唯一检查的是每次下载结束时的crc。

谢谢mt_dialog.

东方
离线
最后一次露面:4年6个月前
加入:2015-07-20 04:11
嗨对话人员,谢谢

你好,对话人员,谢谢你的回答!

我通过Smart Scompets通过UART运行辅助引导加载程序,并且辅助引导程序工作。然后下载我的FW,而辅助引导加载程序已经通过智能片段运行。我点击了下载按钮,但是没有点击重置按钮,我认为智能代码段通过UART刀具请求点击重置按钮,因为需要从设备接收开始字节。
所以,INDED,我的FW通过辅助引导加载程序下载而不是主引导程序。

东方
离线
最后一次露面:4年6个月前
加入:2015-07-20 04:11
32k的限制

当从flash启动时,主引导加载器的32K限制是存在的,所以我必须添加一个codeLoader()来完成fw的加载。

mt_dialog.
离线
最后一次露面:5个月2周前
职员
加入:2015-06-08 11:34
嗨东方,

嗨东方,

我没有意识到这种限制,但事实上,在Bootrom中有这种限制,似乎它不是Bootrom代码本身有限制,而是如何在内存中运行,如果您开始提供更多32K的数据您将覆盖BootCode本身的变量,以便您需要辅助引导加载程序来加载大于32K的图像。如果您不想使用辅助引导加载程序,并且您想要使用此自定义代码加载程序方案,您将必须Tweek生成的二进制文件。您必须提供等于32k的长度,以便绑定到Sysram开始执行,然后运行代码,使CodeLoader将其余部分复制到Sysram中。

谢谢mt_dialog.

东方
离线
最后一次露面:4年6个月前
加入:2015-07-20 04:11
谢谢!

谢谢!