工控驿站

 找回密码
 立即注册
工控驿站»工控驿站 » 编程软件»需要实现spiflash的山区读写操作
查看: 365|回复: 1

[讨论帖] 需要实现spiflash的山区读写操作

[复制链接]

该用户从未签到

发表于 2017-8-9 17:01:26 | 显示全部楼层 |阅读模式
需要实现spiflash的山区读写操作,如何快速补足数组而不丢失数据?
硬件:
     MCU: stm32f103,
     FLASH: w25q128
开发平台:
     keil5.20

需要在一块板子上实现spi_flash以扇区大小为单位的读写操作,接口函数如下:
  1. /*
  2. *********************************************************************************************************
  3. *   函 数 名: sf_WriteSector
  4. *   功能说明: 向指定扇区写入整个扇区的数据
  5. *   形    参:  _pBuf:数据源缓冲区
  6. *                       _uSectorNumber:扇区编号(以w25q128为例,编号取值范围为0~4095)
  7. *   返 回 值: 无
  8. *********************************************************************************************************
  9. */
  10. void sf_WriteSector(uint8_t * _pBuf, uint16_t _uSectorNumber)
  11. {
  12.     uint16_t len;
  13.     uint16_t i;
  14.     len = sizeof(_pBuf)/sizeof(uint8_t);
  15.     if(4096 > len)
  16.     {
  17.             //当写入数据缓冲区大小小于扇区大小时进行补足操作
  18.     }
  19.     sf_WriteBuffer(_pBuf, _uSectorNumber*4096+0, 4096);//写入数据缓冲区,扇区编号,扇区大小
  20. }

  21. /*
  22. *********************************************************************************************************
  23. *   函 数 名: sf_ReadSector
  24. *   功能说明: 读取指定扇区的全部数据
  25. *   形    参:  _pBuf:读取数据缓冲区
  26. *                       _uSectorNumber:扇区编号(以w25q128为例,编号取值范围为0~4095)
  27. *   返 回 值: 无
  28. *********************************************************************************************************
  29. */
  30. void sf_ReadSector(uint8_t * _pBuf, uint16_t _uSectorNumber)
  31. {
  32.     sf_ReadBuffer(_pBuf, _uSectorNumber*4096+0, 4096);
  33. }
复制代码
需要考虑写入时,若写入数据缓冲区数据不足4K(一个扇区的大小),那么就需要对其进行补足操作,
使用code blocks验证malloc、sizeof、memcpy的用法,测试代码如下所示:
malloc: 不知道什么原因,不管是len=(int*)malloc(3*sizeof(int))
len=(int*)malloc(6*sizeof(int)),malloc所分配的内存大小长度‘len一直为1~~
不过使用malloc进行内存分配,则数组中的原始数据将被覆盖,,
sizeof:主要是为了测试如何得到传入数据的长度,可以通过sizeof(array)/sizeof(TYPE)得到数组长度
memcpy: 可采用它实现数组补足功能
不过还是未找到扩充数组长度且保留数组元数据的方法,请问各位大神遇到这种情况怎么解决呢?
  1. #include"stdio.h"
  2. #include"stdlib.h"
  3. #include"string.h"

  4. int main()
  5. {
  6.     int i;
  7.     int len;
  8.     int* array;
  9.     int* arrayCopy;
  10.     int data = 3;

  11.     /*测试数组内存分配及赋值*/
  12.     array = (int*)malloc(3*sizeof(int));
  13.     if(!array)
  14.     {
  15.         printf("创建数组失败!\n");
  16.         exit(1);
  17.     }

  18.     memcpy(array,&data,3*sizeof(int));
  19.     len = sizeof(array)/sizeof(int);

  20.     for(i=0; i<len-1; i++)
  21.     {
  22.         printf("%d ",array[i]);
  23.     }
  24.     printf("%d & first array len is %d\n",array[i], len);

  25.     /*测试数组扩展*/
  26.     array = (int*)malloc(6*sizeof(int));
  27.     if(!array)
  28.     {
  29.         printf("创建数组失败!\n");
  30.         exit(1);
  31.     }
  32.     len = sizeof(array)/sizeof(int);
  33.     for(i=0; i<len-1; i++)
  34.     {
  35.         printf("%d ",array[i]);
  36.     }
  37.     printf("%d & second array len is %d\n",array[i], len);
  38. }
复制代码
运行结果:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

该用户从未签到

发表于 2017-8-10 17:16:12 | 显示全部楼层
在写入函数中进行补足就可以了啊,你的写入函数传递的参数有要写入的数据缓冲区指针和要写入的数据个数,那么在写入函数里面进行判断,如果传递进来的数据个数等于一个扇区的大小,就不用补足直接写入,要是小于一个扇区的大小,则将要写入的数据写入之后,再将剩余的空间使用预设的补足数据写入不就可以啦
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

武汉夜生活 武汉夜生活 武汉桑拿网 武汉桑拿网 武汉桑拿网 武汉夜生活

QQ|小黑屋|手机版|Archiver|工控驿站 ( 鲁ICP备11011731号-4

GMT+8, 2020-4-2 16:35 , Processed in 0.078125 second(s), 21 queries .

Powered by 工控资料窝

© 2013-2015 www.gkwo.net

快速回复 返回顶部 返回列表