[Ooonly]
前情提要:需要刷写一整个app程序,分包刷写,每包字节数为单数,要求CRC校验正确。(芯片底层提供32位全字刷写和16位半字刷写,驱动只整合了32位全字刷写函数)
使用32位刷写函数出现的现象:通过keil5观察内存空间发现一包刷写成功一包刷写失败一包刷写成功…一直循环到末尾,刷写失败的包开始几个字节为乱码,不是包中的内容,且后面为全0xFF。
一、分析问题原因
首先理解驱动中32位写入内存函数刷写单数字节是如何处理的,在每次刷写完一次4字节之后,判断该包剩余未刷写字节数是否小于4,若小于4则补充0xFF至4个字节后一次刷入4字节结束。
出现问题,由于一个完整的app程序要求每个包中间是完美连接的,即一个分包的末尾字节的下一个字节为下一包的首字节。此时一个包的末尾字节后有刚刚补充的0xFF,内存通常在一次刷写之后会自动加上写保护,再次擦除之后才可再次刷写。
一包刷写成功之后,下一包的首字节刷写地址和上一包末尾补充0xFF冲突,造成刷写失败写入随机非0乱码。
二、解决方法
更改驱动中32位全字刷写函数,更改逻辑为:当前包刷写剩余字节数小于4时,将剩余字节按顺序放入一个4字节缓存中,并记录下剩余字节个数。当下一包开始刷写时,刷写地址需减去上一包剩余字节个数,并从首字节开始补充上述4字节缓存,形成一个由上一包的尾字节与当前包首字节组成的4字节全字刷写。最后需要额外判断整个app是否即将刷写完成,若当前包为最后一包,那么就没有下一包来补充含有剩余字节的4字节缓存,此时按原有逻辑补充0xFF进行32位全字刷写。
三、注意事项
由于该全字刷写函数不一定只有app刷写功能调用,还有例如参数保存等功能调用,所以建议使用宏定义,若不是app刷写功能则32位全字刷写函数内容与原来保持一致。作者并因为是新手,对宏定义理解不深刻,并没有第一时间想到这种操作方式,使用if-else也实现了,但是想起来好像宏定义更好看一点,哈哈。有想法、问题、意见可以评论或私信提出,欢迎交流转载。
以上就是今天要讲的内容,感谢您的关注。