本帖最后由 金光 于 2017-9-9 16:09 编辑
问题描述:最近做stm32L476RG的IAP功能,设计思路是初始程序运行在BANK1,用串口接收更新程序,存储在BANK2,再置位选项字节中的BFB2,程序跳转到BANK2运行;如果串口又收到更新程序,则存储在BANK1,清零选项字节中的BFB2,程序跳转到BANK1运行;如此反复。 但是实际做的过程中遇到了问题,调试了几天都没有进展。实现上述的第一步是成功的,BANK1中的程序收到更新程序存储在BANK2并能够正确运行。BANK2中的程序又收到更新程序,先擦除BANK1也是OK的,但是将新程序写入BANK1时就会产生错误。通过ST-LINK utility能够观察到,新程序存储在BANK2,地址为0x08080000起始,BANK1已经擦除,但是没有写入数据。 开始使用的是快速写FLASH,即FLASH_TYPEPROGRAM_FAST,出错时错误标志位有PGSERR、PGAERR、PROGERR;又尝试了FLASH_TYPEPROGRAM_DOUBLEWORD,出错时的标志位是PGAERR、PROGERR、OPERR。 调试过程中还遇到一个很奇怪的问题,当更新程序运行在BANK2时,程序地址空间应该是从0x08080000起始,但是我读一个函数的地址却是0x08002861,属于BANK1的地址空间。 以上是我遇到的一些问题,欢迎大家一起讨论,更欢迎同行的高手和ST的专家指教。在此先谢谢大家!
|