项目场景:

项目中原来使用华邦W25Q128芯片,后因为flash容量续替换为W25Q256芯片。Bootloader使用自己分装的对W25Q128驱动程序,APP程序使用armink提供SFUD框架。项目程序放在stm32片内flash中,片外norflash中存放OTA的固件和更新标志位。Bootloader上电读取flash中更新标志位位和校验数据都正常,APP读取flash中工作参数也都正常。


问题描述

执行完固件升级后,软重启mcu依然使用内部flash旧固件,但是断电重启后可正常加载升级后的程序。


原因分析:

先仿真APP程序,读取download区代码,发现固件升级标志位和固件描述头部信息crc都正确。再仿真Bootloader程序,发现无法读取flash中数据发现都是0xFF,片外flash未写入状态。初步怀疑是bootloader驱动问题,但是偶然发现断电重启后可以正常读取片外flash的数据,且crc正确。排除下载固件时未正确写入片外flash。
之前代码可以正常升级固件这次只是换了个固件导致代码异常。之前有个项目用到eeprom从24C32换到24C64也出现问题(可查看这篇笔记:读24cxx EEPROM),eeprom的问题是寻址从1字节变成2字节导致无法读出数据。可查看华邦W25Q256的datasheet。
W25Q256支持两种寻址模式3字节寻址4字节寻址


其区别在Address位数不同,功能码也不同3字节读数据是0x03,4字节则是0x13写flash也是存在两种寻址方式

还有两条命令控制控制进入4字节寻址和退出4字节寻址。


那么外部flash读取失败的问题也明朗了,程序在APP中进入了4字节寻址,Bootloader中国使用的是3字节寻址。APP程序在完成固件升级后软重启MCU并不会复位W25Q256,导致flash还在4字节寻址模式中,Bootloader去读取数据只能读到0xFF。若断电后flash复位后,没进入4字节寻址boot便可以读出数据,这也就是为什么断电重启后会正常更新程序,不断电则没更新程序。
项目之前使用了SFUD框架快速开发flash,但是我们对正常运作的代码关注不够细致才导致这个bug的存在。回过去看一下SFUD是怎么实现对W25Q128和W25Q256关于寻址方面的配置。
SFUD框架中对4字节设置API函数源码:

/*** enable or disable 4-Byte addressing for flash** @note The 4-Byte addressing just supported for the flash capacity which is large then 16MB (256Mb).** @param flash flash device* @param enabled true: enable   false: disable** @return result*/
static sfud_err set_4_byte_address_mode(sfud_flash *flash, bool enabled) {sfud_err result = SFUD_SUCCESS;uint8_t cmd;SFUD_ASSERT(flash);/* set the flash write enable */result = set_write_enabled(flash, true);if (result != SFUD_SUCCESS) {return result;}if (enabled) {cmd = SFUD_CMD_ENTER_4B_ADDRESS_MODE;} else {cmd = SFUD_CMD_EXIT_4B_ADDRESS_MODE;}result = flash->spi.wr(&flash->spi, &cmd, 1, NULL, 0);if (result == SFUD_SUCCESS) {flash->addr_in_4_byte = enabled ? true : false;SFUD_DEBUG("%s 4-Byte addressing mode success.", enabled ? "Enter" : "Exit");} else {SFUD_INFO("Error: %s 4-Byte addressing mode failed.", enabled ? "Enter" : "Exit");}return result;
}

其函数调用是根据flash芯片大小判断的:(源码中注释写的16MB应该是注释标注错误,256Mb是32MB)

/* if the flash is large than 32MB (256Mb) then enter in 4-Byte addressing mode */
if (flash->chip.capacity > (1L << 24)) {result = set_4_byte_address_mode(flash, true);
} else {flash->addr_in_4_byte = false;
}

解决方案:

其实出现这个问题往往是因为更换硬件芯片,只对现有代码运行一下发现能用就没有继续思考下去。加上boot程序往往代代相传,当初没有考虑到不同芯片的兼容问题,也可能是为了压缩程序空间故意没做兼容。
可以有两种解决方案:
方案1:对于已经出货的机器可以修改APP程序,在OTA下载完固件后,软重启前退出4字节模式,这样Bootloader可以正常读取更新标志位。个人觉得若出现这种出货的情况数据项目过程中风险评估不到位加上测试不到位。
方案2:修改boot程序,增加对机型判断若是256Mb的芯片使用4字节模式寻址读写数据。

WINBOND/华邦 W25Qxxx调试笔记相关推荐

  1. W25Q128华邦Flash调试踩坑

    W25Q128华邦Flash调试踩坑 存储器内部默认数据为全1,同样整片擦除后数据恢复为全1. 注意:这款Flash不支持写数据覆盖,即写第二次数据之前要先擦除要写入地址对应的扇区.具体原因在于Fla ...

  2. 华邦存储芯片 W25Q 系列命名规则

    解析华邦存储芯片 W25Q 系列命名规则 华邦的 SPI flash 型号(丝印)一般如下(只看当前最新的 W25Q 系列): W25Q xxx y z XX Y Z xxx表示容量(单位 bit), ...

  3. linux内核支持多串口,基于华邦W90P710处理器的Linux内核应用及串口驱动的实现

    嵌入式Linux是一种很受欢迎的操作系统,具有开放源码.不存在黑箱技术.内核小.功能强大.运行稳定.效率高.易于定制裁减等特点[1],广泛应用于工控产品.很多工控产品需要和外部设备进行信息交换,而串口 ...

  4. linux串口驱动及应用程序,基于华邦W90P710处理器的Linux内核应用及串口驱动的实现-嵌入式系统-与非网...

    嵌入式Linux是一种很受欢迎的操作系统,具有开放源码.不存在黑箱技术.内核小.功能强大.运行稳定.效率高.易于定制裁减等特点[1],广泛应用于工控产品.很多工控产品需要和外部设备进行信息交换,而串口 ...

  5. w25n01g 代码_STM32F405驱动华邦W25N01G简介与demo

    关于STM32F405驱动华邦W25N01GVZE1G的简介与驱动代码 W25N01G简介 常用flash可分为NOR flash和NAND flash等.比如华邦(winbond)的W25Qxx系列 ...

  6. 华邦存储器W25Q80, W25Q16, W25Q32系列的spi通讯

    华邦存储器W25Q80, W25Q16, W25Q32系列与stm32f1系列单片机的spi通讯 2020.4.9 spi通讯在配置好之后一定要开启spi使能,和串口的配置是一样的 2020.4.13 ...

  7. Openwrt读取spi-nand协议Flash芯片UniqueID(华邦为例)

    Flash芯片一般都有一个出厂时由制造商设定的Unique ID,唯一ID.获取到可以用来进行各类加密识别认证,作为设备唯一ID的一种. 本文以华邦品牌的flash芯片为例(W25N01GV.W25M ...

  8. 调试笔记--jlink 变量转实时波形小技巧

    调试笔记–jlink 变量转实时波形小技巧 上篇讲了jlink RTT组件在RAM中开辟一段内存,将printf字符串存入然后通过jlink调试接口读取RAM,将printf字符串在jlink-RTT ...

  9. 调试笔记--keil 测量周期小技巧

    调试笔记–keil 测量周期小技巧 本文参考安富莱专题教程第7期 http://www.armbbs.cn/forum.php?mod=viewthread&tid=87176&ext ...

最新文章

  1. ecshop api.php,api.php
  2. python20个常用语法_这20个常规Python语法你都搞明白了吗?
  3. java 修改txt_Java实现批量修改txt文件名称的方法示例
  4. 2如何看表分区字段_技术分享|Oracle分区技术的实现总结
  5. JS的构造及其事件注意点总结
  6. C#使用mybatis学习笔记
  7. php单引号和双引号的速度,在php中单引号和双引号是否有性能优势?[复制]
  8. 华硕门店点亮系统_6大关键赋能,点亮导购服务力!
  9. linux rootkit扫描,如何扫描我的Linux系统的rootkit,蠕虫,木马等?
  10. 关于jesd204出错
  11. Stanford Dogs Dataset(斯坦福狗数据集)
  12. @JsonFormat和@DataFormat的使用
  13. 吴伯凡-认知方法论-给思维一个支点
  14. 六、利用ESP32搭建网络服务器(一)
  15. 朋友圈点赞、发红包 测试用例的设计点
  16. archlinux 罗技K380 F1-F12 功能键锁定
  17. 管理系统开发的常见软件
  18. 华东理工大学的计算机系,华东理工大学计算机系介绍
  19. MapReduce快速入门系列(4) | Hadoop序列化
  20. 正大集团oa系统服务器,正大oa服务器地址

热门文章

  1. WLAN直连总体结构和相关流程概览(二)
  2. supervisor使用
  3. iqooneo3 如何不用vivo账号下载外部应用_难用传言是否为真,IQOO NEO 3系统深度评测...
  4. python不支持哪种数据类型_Python不支持以下哪种数据类型?
  5. jquery仿淘宝SKU选择商品属性代码
  6. 虚拟服务器部署环境,如何在虚拟服务器环境部署SR-IOV?
  7. python——字典
  8. 三分屏课件制作_微课设计与制作实践参考论文
  9. 简单的菜单,进行修改menu4
  10. HUAWEI华为笔记本电脑 荣耀MagicBook 16锐龙5 5600H(HYM-W56)原装出厂Windows10系统恢复原厂OEM系统21H1