嗨对话人员
我在14580基础sdk5.0.3上开发我的应用程序,我的代码大小大约是32.4K,比otp 32K限制大。
所以我修改了散射图来支持它(使用UM-B-011),
并添加一个“coderLoader”调用时sysinit,我烧fw到flash,发现它工作得很好!
#####我添加的代码
system_ARMCM0.c中的“coderLoader”,并在systemInit fun之后调用它
/ / #定义BOOT_FROM_FLASH
# ifdef BOOT_FROM_FLASH
#定义x20008000l SYSRAM_CODE_START_ADDR 0
#define sysram_code_stop_addr 0x20009200L.
#定义x8008 SYSRAM_CODE_SPI_ADDR 0
空白CodeLoader(空白)
{
unsigned char * p_code;
if (GetWord16(SYS_STAT_REG) & DBG_IS_UP) == DBG_IS_UP)
返回;
SetWord16 (P0_SET_DATA_REG 1 < < 3);// set P0_3 to high
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 (master mode, output)
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 (data in)
SetWord16 (P0_SET_DATA_REG 1 < < 3);/ /禁用,
p_code = (unsigned char *)(SYSRAM_CODE_START_ADDR);
// init SPI for master, mode 3
SetWord16 (SPI_CTRL_REG 0);
SetWord16 (SPI_CTRL_REG SPI_POL + SPI_PHA);
SetWord16 (SPI_CTRL_REG SPI_POL + SPI_PHA + SPI_ON + 0 x0100);
setword16(p0_reset_data_reg,1 << 3);//启用高转换的闪光灯
SetWord16 (SPI_RX_TX_REG1 0 x0300);/ / x50001204 SPI_RX_TX_REG1 0
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 0 x01);//清除挂起标志
SetWord16 (SPI_CTRL_REG SPI_POL + SPI_PHA + SPI_ON);/ / x50001200 SPI_CTRL_REG 0
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 0 x01);//清除挂起标志
}
SetWord16 (P0_SET_DATA_REG 1 < < 3);/ /禁用,
SetWord16 (SPI_CTRL_REG 0);/ /重置SPI
}
但是当我尝试通过UART启动580时,我发现它不起作用,所以我猜是FirstBootloader限制代码大小小于32K?
然后做一个确认:
1.smartSnippets下载secondaryBootloader通过uart和它工作
2. SmartSnippets在580运行SecondaryBootloader时通过UART下载我的FW,这次工作!!!!
你能解释一下吗?
嗨,东方,
看看如果我得到了正确的思考,你设法有一个大于32K的fw,当你把它放在flash中,你的程序工作正确,但当你通过UART下载代码
使用智能片段,它不会。
1)所以为了调试这个,你试着从智能片段通过UART运行二级引导加载程序,二级引导加载程序工作(它应该是)。
2)然后你尝试下载你的fw,而二级引导加载程序已经通过智能片段运行?我看不出这是怎么可能的,我的意思是,当一台fw正在运行时,你试图通过UART的智能代码片段下载代码,工具请求按下重置按钮,以便主引导加载程序运行和下载fw。所以据我们所知,fw是被主引导加载程序在580中下载的,因为重置后的二级引导加载程序实际上并没有运行。
关于主引导加载程序的32k限制,没有这样的限制,SPI和UART的Bootaloder是相同的,并且没有限制它们,主引导加载程序检查的唯一是CRC每个下载结束。
由于MT_dialog
嗨对话人员,谢谢你的答案!
我通过UART从智能片段运行二级引导加载程序,二级引导加载程序工作。然后下载我的fw,而二级引导加载程序已经通过智能片段运行。我点击了下载按钮,但没有点击重置按钮,我认为智能片段超过UART工具请求点击重置按钮,因为它需要从设备接收开始字节。
因此,实际上,我的fw是通过二级引导加载程序而不是主引导加载程序下载的。
从Flash启动时,主引导加载程序的32K限制存在,因此我必须添加Codeloader()以完成FW加载。
嗨,东方,
我没有意识到这个限制,但确实在bootrom中有这种限制,似乎不是bootrom代码本身有限制而是bootrom代码如何在内存中运行,如果你开始提供超过32K的数据,你会覆盖引导代码本身的变量,所以你将需要二级引导加载程序来加载一个大于32K的图像。如果你不想使用辅助引导加载程序,而你想使用这个自定义代码加载程序方案,你将不得不调整生成的二进制文件。您必须提供一个等于32K的长度,以便bootrom下载到syram中开始执行,然后运行代码,以便CodeLoader将映像的其余部分复制到syram中。
由于MT_dialog
谢谢你!