将PC上的数据导入到MCU的External Flash上续
在Keil和Segger Embeded Studio上实现Flashload不成功后,转到用Segger的JLink的CommanderScript的配合终于完成了将PC上的数据成功传到扩展Flash上了。
将实现方法以及碰见的坑整理一下:
- 实现方法:
- 在Apollo3 MCU上用Keil开发一个程序,将指定地址的Internal Flash的数据块Copy到External Flash上。
- 由于Internal Flash的空间有限,通常是2MB,算上已经使用的,也就是能有1MB左右的空间可以做搬运的中转站,所以在MCU跑的的程序每次只能搬运1MB内容
- 在PC上用C语言开发一个将大文件切割成1MB小文件的工具,将文件分割成数个1MB大小的文件。
- 写JLink Command Script将1MB的文件从PC 搬到Internal Flash上
- 写JLink Command Script通知MCU的程序,将数据搬到External Flash上。
- JLink 与MCU的程序通过 JLink 命令(w4,m32命令)与MCU的程序访问同一内存数据空间,来通知MCU程序数据已经准备好了,JLink通过Sleep来确认MCU的搬运结果
- 碰见的坑:
- 每次Loadbin后,MCU的程序会Halt了。Jlink与MCU之间的内存通信空间就不正常了。
- 刚开始的时候,操作顺序是在一个script中,调用loadbin将数据文件载入Internel Flash上,然后通过w4命令通知MCU去搬运,发现两边根本碰不上。
- 解决方法:在Loadbin数据文件后,再次调用将MCU的运行程序Loadbin加载进入MCU上,调用reset/g两个命令才能正常执行。
- 刚开始的时候,操作顺序是在一个script中,调用loadbin将数据文件载入Internel Flash上,然后通过w4命令通知MCU去搬运,发现两边根本碰不上。
- 每次Loadbin,Jlink会检查Load的数据与MCU的Internal Flash的数据是否一致,如果没有变化,不会做loadbin操作。导致加载MCU的搬运程序不会被重置MCU运行环境,也不能正常进行搬运工作。
- 解决方法:每次调用loadbin之前将对应的Internal Flash地址段Erase一次,这样就能正常操作了。
- 每次Loadbin后,MCU的程序会Halt了。Jlink与MCU之间的内存通信空间就不正常了。