完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
在VScode开发软件上,基于GD32F103VC移植完成了RT_Thread Nano 3.0.3后,领导突然要求在W25Q16JV芯片里面保存日志。
我第一时间想到了easyflash,因为很多人都在推,所以我就用了。 按照教程,我只需要log保存功能,使能EF_USING_LOG,ENV跟IAP暂时不需要,所以全部屏蔽了。 #ifndef EF_CFG_H_ #define EF_CFG_H_ /* using ENV function, default is NG (Next Generation) mode start from V4.0 */ // #define EF_USING_ENV #ifdef EF_USING_ENV /* Auto update ENV to latest default when current ENV version number is changed. */ /* #define EF_ENV_AUTO_UPDATE */ /** * ENV version number defined by user. * Please change it when your firmware add a new ENV to default_env_set. */ #define EF_ENV_VER_NUM /* @note you must define it for a value, such as 0 */ /* MCU Endian Configuration, default is Little Endian Order. */ /* #define EF_BIG_ENDIAN */ #endif /* EF_USING_ENV */ /* using IAP function */ /* #define EF_USING_IAP */ /* using save log function */ #define EF_USING_LOG /* The minimum size of flash erasure. May be a flash sector size. */ #define EF_ERASE_MIN_SIZE 4096 /* @note you must define it for a value */ /* the flash write granularity, unit: bit * only support 1(nor flash)/ 8(STM32f4)/ 32(stm32f1) */ #define EF_WRITE_GRAN 1 /* @note you must define it for a value */ /* * * This all Backup Area Flash storage index. All used flash area configure is under here. * |----------------------------| Storage Size * | Environment variables area | ENV area size @see ENV_AREA_SIZE * |----------------------------| * | Saved log area | Log area size @see LOG_AREA_SIZE * |----------------------------| * |(IAP)Downloaded application | IAP already downloaded application, unfixed size * |----------------------------| * * @note all area sizes must be aligned with EF_ERASE_MIN_SIZE * * The EasyFlash add the NG (Next Generation) mode start from V4.0. All old mode before V4.0, called LEGACY mode. * * - NG (Next Generation) mode is default mode from V4.0. It's easy to settings, only defined the ENV_AREA_SIZE. * - The LEGACY mode has been DEPRECATED. It is NOT RECOMMENDED to continue using. * Beacuse it will use ram to buffer the ENV and spend more flash erase times. * If you want use it please using the V3.X version. */ /* backup area start address */ #define EF_START_ADDR (0) /* @note you must define it for a value */ /* ENV area size. It's at least one empty sector for GC. So it's definition must more then or equal 2 flash sector size. */ // #define ENV_AREA_SIZE (2 * EF_ERASE_MIN_SIZE) /* @note you must define it for a value if you used ENV */ /* saved log area size */ #define LOG_AREA_SIZE (200 * EF_ERASE_MIN_SIZE) /* @note you must define it for a value if you used log */ // 不大于512个sector,W25Q16JV共有32个block,每个block有16个sector,每个sector有4096大小 /* print debug information of flash */ // #define PRINT_DEBUG #endif /* EF_CFG_H_ */ 然后在ef_port.c里面移植实现了ef_port_read,ef_port_write,ef_port_erase,ef_port_init等函数,单独测试都没有问题。 我使用的easyflash通过API读取,提示EasyFlash V4.1.99 is initialize success. 直接使用ef_port_write写一条log,ef_port_read读一条log,都没有问题。 但是使用ef_port_write写多条log,ef_port_read读多条log,一直只显示最初的log,后面的全部都不见了。 //要写入到W25Q16的字符串数组 const uint8_t TEXT_Buffer[]={"CFdino SPI TEST"}; const uint8_t TEXT_Buffer1[]={"CF dino SPI TEST111"}; const uint8_t TEXT_Buffer2[]={"CF dino SPI TEST222"}; const uint8_t TEXT_Buffer3[]={"CF dino SPI TEST333"}; #define SIZE sizeof(TEXT_Buffer) #define SIZE1 sizeof(TEXT_Buffer1) #define SIZE2 sizeof(TEXT_Buffer2) #define SIZE3 sizeof(TEXT_Buffer3) ef_log_clean(); rt_thread_delay(5000); rt_kprintf("\rstart write\r\n"); ID = ef_log_write((uint32_t*)TEXT_Buffer,SIZE); // 写入log rt_kprintf("\rTEXT_Buffer:%d\r\n",ID); rt_thread_delay(5); ID = ef_log_write((uint32_t*)TEXT_Buffer1,SIZE1); // 写入log rt_thread_delay(5); rt_kprintf("\rTEXT_Buffer1:%d\r\n",ID); ID = ef_log_write((uint32_t*)TEXT_Buffer2,SIZE2); // 写入log rt_thread_delay(5); rt_kprintf("\rTEXT_Buffer2:%d\r\n",ID); ID = ef_log_write((uint32_t*)TEXT_Buffer3,SIZE3); // 写入log rt_thread_delay(5); rt_kprintf("\rTEXT_Buffer3:%d\r\n",ID); ef_log_read(0,(uint32_t*)datatemp,SIZE); //从倒数第0个索引处开始,读出SIZE个字节 rt_thread_delay(500); rt_kprintf("index0 data1:%s\r\n",datatemp); ef_log_read(1,(uint32_t*)datatemp,SIZE1); //从倒数第1个索引处开始,读出SIZE个字节 // rt_thread_delay(500); rt_kprintf("index1 data2:%s\r\n",datatemp); ef_log_read(2,(uint32_t*)datatemp,SIZE2); //从倒数第2个索引处开始,读出SIZE个字节 rt_thread_delay(500); rt_kprintf("index2 data3:%s\r\n",datatemp); ef_log_read(3,(uint32_t*)datatemp,SIZE3); //从倒数第3个索引处开始,读出SIZE个字节 rt_thread_delay(500); rt_kprintf("index3 data4:%s\r\n",datatemp); 结果读出来的 index0 datatemp1:CFdino SPI TEST index0 data1:CFdino SPI TEST index1 data2:Fdino SPI TEST index2 data3:dino SPI TEST index3 data4:ino SPI TEST 我以为是写入失败,然后通过ef_log_get_used_size去拿了一下保存的日志长度。12+16+20+20+20 = 88. 长度没有问题。然后通过ef_log_read(0,(uint32_t*)datatemp,88);去读取88个长度,结果还是读出来CFdino SPI TEST,后面的全部没有了。 然后通过ef_port.c里面的ef_port_read去读88个,结果也是CFdino SPI TEST。 通过自己实现的w25q16_read函数去读88个长度,结果也是CFdino SPI TEST。 void W25QXX_Read(uint8_t *pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) { uint16_t i; FLASH_CS_RESET; // 使能器件 spi_transfer(0x03); // 发送读取命令 spi_transfer((uint8_t)((ReadAddr) >> 16)); // 发送24bit地址 spi_transfer((uint8_t)((ReadAddr) >> 8)); spi_transfer((uint8_t)ReadAddr); for (i = 0; i < NumByteToRead; i++) { pBuffer[i] = spi_transfer(0XFF); // 循环读数 } FLASH_CS_SET; } |
|
相关推荐
1个回答
|
|
|
根据您的描述,问题发生在使用 EasyFlash 保存多条日志到 W25Q16JV 芯片时写入成功但读取失败。以下是可能的原因及解决方案: 根本原因分析
解决方案步骤 1:修复 ef_cfg.h 配置步骤 2:验证 Flash 驱动层步骤 3:修正多日志读取代码步骤 4:关键API调用检查可能遇到的坑点排查表
补充建议
调试技巧
通过以上方法,95%以上的日志读写问题都可解决。重点检查Flash分区配置和SPI驱动稳定性,这两点是GD32平台最常见的问题根源。 |
||
|
|
||
只有小组成员才能发言,加入小组>>
184个成员聚集在这个小组
加入小组rtstudio是否可像keil加载ini解决虚拟串口与mcu串口通讯?
1212 浏览 0 评论
【Vision Board创客营连载体验】基于RA8D1-Vision Board的自动路径规划小车
1776 浏览 1 评论
【Vision Board创客营连载体验】基于Vision Board的垃圾分类
2156 浏览 0 评论
【Vision Board创客营连载体验】使用 Vision Board 做一个 UVC Camera
1777 浏览 0 评论
【Vision Board创客营连载体验】TinyMaix进行手写数字识别
2006 浏览 0 评论
1464浏览 5评论
在RT-Thread Studio中新建的stm32f407-atk-explorer工程运行qemu失败,是什么原因引起的?
1766浏览 3评论
为什么rt_device_read()只能读取到两个字节数据?
363浏览 3评论
连得上热点,但是ping baidu.com出现timeout,请问跟什么有关?
421浏览 3评论
420浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 19:49 , Processed in 2.015355 second(s), Total 77, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2953
