最近需要在STM32F407ZET6上面做网络升级固件的功能。调试过程中出现了一些怪现象,遂做个调试记录。
一、弄清楚你的芯片的flash大小,做好bootloader和app的地址区分。
一开始我被参考手册中的信息误导了。参考手册是针对一个系列的,会把最大容量的显示出来。具体是多少还是要看你自己的系列所占大小。
可以看到一共有12个扇区,总计1024KB的大小。然后想都没想就按这个地址长度来规划,结果是可想而知的。我的芯片是STM32F407ZET6,flash大小只有512KB,从选型手册上可以看到。
所以,正确的地址范围应该为:0x08000000-0x0807FFFF。然后划分bootloader占用128KB,即0x20000的大小,APP占用后面所有的可用地址,范围为0x08020000-0x0807FFFF,共384KB。
二、从ST官网上面找到关于通过LWIP实现IAP的例程。这里面是官方通过https和tftp进行IAP升级的代码,具有参考价值。
从这个例程着手,可以减少代码时间。我打算先从TFTP着手,实现IAP升级。
三、准备2份代码,一份是bootloader的,一份是APP的,前提条件:bootloader代码必须要保证lwip工作正常,能正常获取IP,UDP,TCP工作正常。APP代码没有特殊要求。下面是注意点。
bootloader在keil中地址分布
APP在keil中的地址分布
app代码的起始部分,请手动设置代码的入口地址:
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x20000);
四、bootloader中添加TFTP server的功能。
我从下载的官网例程中复制了需要的几个文件:tftpserver.c tftpserver.h flash_if.c flash_if.h,分别是tftpserver和flash的功能代码。加入我自己的工程中,下面开始分析代码。
五、先了解下TFTP的知识。