jinguang2020 发表于 2017-9-12 14:04:46

做stm32L476RG的IAP功能遇到了问题

本帖最后由 jinguang2020 于 2017-9-12 14:05 编辑

问题描述:最近做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给的例程,也存在同样的问题。以上是我遇到的一些问题,欢迎大家一起讨论,更欢迎同行的高手和ST的专家指教。在此先谢谢大家!

发表于 2017-9-12 15:47:29

楼主生成少些文件时,工程配置中是否修改了FLASH的其实地址?

jinguang2020 发表于 2017-9-12 17:21:35

安 发表于 2017-9-12 15:47
楼主生成少些文件时,工程配置中是否修改了FLASH的其实地址?

工程配置中没有修改Flash起始地址,这个会有什么影响呢?

发表于 2017-9-13 08:39:14

这样的影响就是。写入的代码可能会有问题,他的起始地址是不一样的。楼主可以按照实际应用的地址修改一下FLASH起始地址,然后再测试一下。

dsjsjf 发表于 2017-9-13 14:47:52

顶楼上的

PaulRambo 发表于 2018-1-23 15:02:10

楼主,我最近也遇到这个问题。请问您解决了吗?

yu0405jie 发表于 2018-1-23 16:21:45

在编写程序的时候,需要根据你的FLASH起始地址,更改工程的链接文件,编译器会根据你的链接文件内容规划各函数的地址,在经过链接之后也会将调用的函数名更改为地址。如果在BANK2的函数地址放在了BANK1中,那实际也会执行BANK1中的指令,这样擦除BANK1的内容之后,相关函数指令也会擦除,就影响了BANK1的再次写入。

PaulRambo 发表于 2018-1-23 16:30:43

非常感谢yu0405jie,按照你的提醒修改了配置文件,我自己的IAP可以用了。谢谢
页: [1]
查看完整版本: 做stm32L476RG的IAP功能遇到了问题