IAP问题

发布于 2014-09-25 09:41:30
各位,
我参考stm32f4_iap_using_usart把FLASH擦写的代码移植到自己的产品里面,希望能够开机自动把TF卡的bin文件烧录到SPI-FLASH里面。
boot---0x8000000~0x8004000
APP---0x8004000~0x080FFFFF
测试发现:
1)FLASH_If_Erase(APPLICATION_ADDRESS);会卡死
2)使用FLASH_If_Write(&flashdestination, (uint32_t*) ramsource, (uint16_t) packet_length/4) 升级和烧录到SPI-FLASH里面一样的rtthread.bin没有问题,但是升级不一样的rtthread.bin则直接出错。

请问是什么原因?如何解决呢?我们需要做TF卡升级APP,希望开机自动检测TF卡上是否有升级文件,有则自动擦写升级。
补充:rtthread.bin采用的是romfs。

查看更多

关注者
0
被浏览
2.7k
5 个回答
aozima
aozima 2014-09-25
拒绝白嫖,拒绝键盘侠!
没听明白楼主到底说的啥。
建议单步调试并多分析。
bjhdtv
bjhdtv 2014-09-25
感谢回复,我的意思就是说目前STM32F4板子上面的SPI-FLASH有Boot区域+APP区域,然后希望板子启动之到APP之后,能够mount TF卡,检测是否有升级文件rtthread.bin,有的话,则循环读取该文件,每次读256bytes,擦写到APP区域,全部擦写完毕,则跳转重启。
目前碰到的问题是:循环读取该文件,擦写到APP区域,FLASH_If_Write就挂掉了。
APP启动之后,能否自己擦写自己?
补充:
1)TF卡里面的rtthread.bin文件和烧入到APP一样,则反复写都没问题;一旦TF卡里面的rtthread.bin文件和烧入到APP不一样,则挂了。
2)APP是采用romfs,TF卡是fat32文件系统
3)附上代码:
if (dfs_file_open(&src_fd, "/sd/rtthread.bin", DFS_O_RDONLY) < 0)
{
rt_kprintf("Open %s Failed
", "/sd/rtthread.bin");
return ;
}
else
{
rt_kprintf("Open %s OK,src_fd.size=%d
", "/sd/rtthread.bin",src_fd.size);
}


if (src_fd.size > (USER_FLASH_SIZE + 1))
{
rt_kprintf("src_fd.size=%d > %d
",src_fd.size,USER_FLASH_SIZE+1);
return ;
}

/*rt_kprintf("FLASH_If_Erase start
");
FLASH_If_Erase(APPLICATION_ADDRESS);
rt_kprintf("FLASH_If_Erase over
");*/
rt_hw_interrupt_disable();

do
{
memset(block_ptr,0,BUZZER);
read_bytes = dfs_file_read(&src_fd, block_ptr, BUZZER);
if (read_bytes > 0)
{
//write_spiflash(block_ptr,read_bytes);
//dfs_file_write(&fd, block_ptr, read_bytes);
ramsource = (uint32_t)block_ptr;
packet_length=BUZZER;
totle_length+=read_bytes;
/* Write received data in Flash */
if (FLASH_If_Write(&flashdestination, (uint32_t*) ramsource, (uint16_t) packet_length/4) == 0)
{
rt_kprintf("write ok:%d,allszie=%d
",packet_length,totle_length);
}
else /* An error occurred while writing to Flash memory */
{
rt_kprintf("write err:%d,allszie=%d
",packet_length,totle_length);
return ;
}
}
} while (read_bytes > 0);

dfs_file_close(&src_fd);

rt_thread_delay(RT_TICK_PER_SECOND * 3);
rt_kprintf("FLASH_If_Write over:%d bytes,Now reboot
",totle_length);

if (1) /* execute the new program */
{
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
/* Jump to user application */
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
Jump_To_Application();
}
bjhdtv
bjhdtv 2014-09-25
上面的代码rt_hw_interrupt_disable();
是多余,刚才调试使用的。
bjhdtv
bjhdtv 2014-09-25
TF卡升级固件不是在Boot里面做的,而是在APP里面做的。boot里面没有rt-thread,只是参考stm32f4_iap_using_usart简单改了下。不知这个方案是否可行?

谢谢

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览