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

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

Hi dialog staff

我在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); // set 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); // Enable FLASH with High low transition

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.
}

but when i try to boot 580 by uart, i found it doesn’t work, so i guess is firstBootloader restrict code size smaller than 32k?
并确认:
1. SmartSnippets按UART下载SecondaryBootLooder,它工作
2.smartSnippets下载我的弗兰克-威廉姆斯uart 580 run secondaryBootloader, and this time, it work !!!!

你能解释一下吗?

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

嗨东方,

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

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

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

Regarding the 32K limitation of the primary bootloader, there isn't such kind of limitation, the bootaloder for the SPI and UART is the same and there is no limitation to none of them, the only thing that the primary bootloader checks is the crc at the end of each download.

谢谢mt_dialog.

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

嗨对话人员,谢谢your answer!

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

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

32k的限制primary bootloader is exist when booting from flash, so i have to add a codeLoader() to finish the fw loading.

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

嗨东方,

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

谢谢mt_dialog.

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

谢谢!