• 驱动仅提供32位刷写的情况下如何完成刷写单数字节


    [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也实现了,但是想起来好像宏定义更好看一点,哈哈。有想法、问题、意见可以评论或私信提出,欢迎交流转载。

    以上就是今天要讲的内容,感谢您的关注。


    __EOF__

  • 本文作者: Ooonly
  • 本文链接: https://www.cnblogs.com/Ooonly/p/17631066.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    Data Guard archive gap检测及解决方案
    【Django | 开发】 Rest Framework 开放API
    SpringBoot视图渲染技术
    基于LVM通过添加硬盘实现分区扩容的方法介绍
    JS教程之Electron.js设计强大的多平台桌面应用程序的好工具
    顺序表在线OJ题(详解+图解)
    Python-基础学习-第二轮
    406. 根据身高重建队列
    AI虚拟人物 数字人直播,不用出镜,不用露脸的直播方式(附教程 软件)
    favicon.ico网站图标不显示问题 Failed to load resource: net::ERR_FILE_NOT_FOU
  • 原文地址:https://www.cnblogs.com/Ooonly/p/17631066.html