嗨,对话框的员工
我在14580基础sdk5.0.3上开发我的应用程序,我的代码大小大约是32.4K,比otp 32K限制大。
所以我修改了散射来支持它(使用UM-B-011),
添加一个“coderLoader”调用时sysinit,我烧录fw到flash,发现它工作得很好!
#####我添加的代码
"coderLoader"在system_ARMCM0.c中,并在systemInit fun后调用它
/ / #定义BOOT_FROM_FLASH
# ifdef BOOT_FROM_FLASH
#定义x20008000l SYSRAM_CODE_START_ADDR 0
#定义x20009200l SYSRAM_CODE_STOP_ADDR 0
#定义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);//设置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 (data in)
SetWord16 (P0_SET_DATA_REG 1 < < 3);/ /禁用,
p_code = (unsigned char *)(SYSRAM_CODE_START_ADDR);
//初始化master的SPI,模式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);//启用FLASH的高低过渡
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 . //SYSRAM_CODE_STOP_ADDR
{
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 0 x01);//清除挂起标志
}
SetWord16 (P0_SET_DATA_REG 1 < < 3);/ /禁用,
SetWord16 (SPI_CTRL_REG 0);/ /重置SPI
}
但是当我尝试用uart引导580时,我发现它不工作,所以我猜是firstBootloader限制代码大小小于32k?
然后做一个确认:
1.smartSnippets通过uart下载secondaryBootloader并工作
2.smartSnippets通过uart下载我的fw时,580运行secondaryBootloader,这一次,它工作!!!!
你能解释一下吗?
嗨,东方,
看看我得到的想法是否正确,你有一个fw,是大于32K,当你把它放在flash你的程序正常工作,但当你通过UART下载代码
而使用Smart Snippets则不会。
1)所以为了调试这个,你尝试通过UART从智能片段运行辅助引导加载程序,辅助引导加载程序工作了(它应该是)。
2)然后你尝试下载你的fw,而辅助引导加载程序已经运行通过智能片段?我看不出这是怎么可能的,我的意思是,当一个fw正在运行,你试图通过UART上的Smart Snippets下载代码时,工具请求按下复位按钮,以便主引导加载程序运行和下载fw。所以就目前来看,fw在580被主引导加载程序下载了,因为在复位后的辅助引导加载程序实际上并没有运行。
关于主引导加载程序的32K限制,没有这样的限制,SPI的引导程序和UART的引导程序是一样的,它们都没有限制,主引导加载程序唯一检查的是每次下载结束时的crc。
由于MT_dialog
你好,对话人员,谢谢你的回答!
我通过UART从智能片段运行辅助引导加载程序,辅助引导加载程序工作正常。然后通过Smart Snippets下载我的fw,而辅助引导加载程序已经在运行。我按下下载按钮,但没有按下复位按钮,我认为智能片段在UART工具请求按下复位按钮,因为它需要从设备接收开始字节。
所以,inded,我的fw是通过辅助引导加载程序下载的,而不是主引导加载程序。
当从flash启动时,主引导加载器的32K限制是存在的,所以我必须添加一个codeLoader()来完成fw的加载。
嗨,东方,
我不知道这个限制,但确实在bootrom中有这种限制,似乎不是bootrom代码本身有限制,而是bootrom代码如何在内存中运行,如果您开始提供超过32K的数据,您将覆盖引导代码本身的变量,因此您将需要辅助引导加载程序来加载大于32K的映像。如果你不想使用辅助引导加载程序,而你想使用这个自定义代码加载程序方案,你将不得不tweek生成的二进制文件。您必须提供一个等于32K的长度,以便boottrom下载到sysram中开始执行,然后运行代码,以便CodeLoader将映像的其余部分复制到sysram中。
由于MT_dialog
谢谢你!