往stm32f103的flash中存数据,为什么读得时候没读取成功?

o0黑色淘金0o 2014-05-28 02:16:09
以前我只是存一个结构体变量,可以存入flash,也可以读
但是我换成结构体数组后就不行了,这事为什么呢??????????
这是我要往flash中存的结构体数组:
typedef struct g_ink_detection
{
//用于确认flash中保存数据有效性0x530F00FF说明数据有效
//0x530F00FF == b 0101 0011 0000 1111 0000 0000 1111 1111
long m_flash_init;//(低位校准0点时设置)(高位校准质量时设置)
long m_beep_max;
long m_beep_min;
long m_temperature_0;
long m_nad_0;
long m_nad_temperatureh;
long m_nad_temperaturel;
long m_nad_weight;
}G_ink_detection;
G_ink_detection g_ink_detection[3] = {{0},{0},{0}};

这是写flash和读flash用到的函数:
int getparam()
{
STMFLASH_Read(0x08007E00,(u16*)g_ink_detection,sizeof(g_ink_detection));
}
int setparam()
{
STMFLASH_Write(0x08007E00,(u16*)g_ink_detection,sizeof(g_ink_detection));
}

/////////////////////////////////////////////最终调用的是下面这个程序、、、、、、、、、、、、、、、、、、、、、
//从指定地址开始读出指定长度的数据
//ReadAddr:起始地址(8位)数
//pBuffer:数据指针
//NumToRead:半字(16位)数
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)
{
u16 i;
for(i=0;i<NumToRead;i++)
{
pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节
ReadAddr+=2;//偏移2个字节
}
}
//从指定地址开始读出指定长度的数据
//ReadAddr:起始地址(8位)数
//pBuffer:数据指针
//NumToRead:半字(16位)数
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)
{
u16 i;
for(i=0;i<NumToRead;i++)
{
pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节
ReadAddr+=2;//偏移2个字节
}
}
...全文
948 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
o0黑色淘金0o 2014-06-04
  • 打赏
  • 举报
回复
引用 13 楼 elvsf2 的回复:
每次读取2个字节,sizeof(g_ink_detection) 要除2
确实是这个问题,已经解决了,谢谢了
JasonQ 2014-05-30
  • 打赏
  • 举报
回复
每次读取2个字节,sizeof(g_ink_detection) 要除2
JasonQ 2014-05-30
  • 打赏
  • 举报
回复
写之前有擦除操作吗?
图灵转世 2014-05-29
  • 打赏
  • 举报
回复
int a[5], a是数组首元素的地址,&a[0]也是数组首元素的地址。所以 a 和 &a[0]是等价的。
o0黑色淘金0o 2014-05-28
  • 打赏
  • 举报
回复
引用 7 楼 wangfan027 的回复:
[quote=引用 5 楼 wangfan027 的回复:] [quote=引用 4 楼 a215353685 的回复:] [quote=引用 2 楼 wangfan027 的回复:] 揣摩你意图应该是这样吧

int getparam()
 {
 STMFLASH_Read(0x08007E00,(u16*)&g_ink_detection,sizeof(g_ink_detection));//&
 }
 int setparam()
 {
 STMFLASH_Write(0x08007E00,(u16*)&g_ink_detection,sizeof(g_ink_detection));//&
 }
我写入的是数组,那得用数组的指针啊,数组是g_ink_detection[3],那数组]的指针应该是g_ink_detection,你为什么要用&g_ink_detection呢?[/quote] 哦,看错了,应该是sizeof(g_ink_detection)的问题,这sizeof的是那个指针的长度(应该是4),所以读写不完整 换成sizeof(G_ink_detection)看看[/quote] 抱歉,仔细看了sizeof的说明,你用的没错 编辑下,最多只能连续回复3次

void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)    
 {
 u16 i;
 for(i=0;i<NumToRead;i++)
 {
 pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节
ReadAddr+=2;//偏移2个字节
}
 }
如果读取16个字节STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,16) i会循环16次,但你的ReadAddr+=2;早已加到32去了,不对[/quote]还有你说的那点确实不多,我应该用&g_ink_detection,因为int a[5]; a是数组首元素的首地址,而&a是数组的首地址,所以应该用&a
o0黑色淘金0o 2014-05-28
  • 打赏
  • 举报
回复
引用 7 楼 wangfan027 的回复:
[quote=引用 5 楼 wangfan027 的回复:] [quote=引用 4 楼 a215353685 的回复:] [quote=引用 2 楼 wangfan027 的回复:] 揣摩你意图应该是这样吧

int getparam()
 {
 STMFLASH_Read(0x08007E00,(u16*)&g_ink_detection,sizeof(g_ink_detection));//&
 }
 int setparam()
 {
 STMFLASH_Write(0x08007E00,(u16*)&g_ink_detection,sizeof(g_ink_detection));//&
 }
我写入的是数组,那得用数组的指针啊,数组是g_ink_detection[3],那数组]的指针应该是g_ink_detection,你为什么要用&g_ink_detection呢?[/quote] 哦,看错了,应该是sizeof(g_ink_detection)的问题,这sizeof的是那个指针的长度(应该是4),所以读写不完整 换成sizeof(G_ink_detection)看看[/quote] 抱歉,仔细看了sizeof的说明,你用的没错 编辑下,最多只能连续回复3次

void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)    
 {
 u16 i;
 for(i=0;i<NumToRead;i++)
 {
 pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节
ReadAddr+=2;//偏移2个字节
}
 }
如果读取16个字节STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,16) i会循环16次,但你的ReadAddr+=2;早已加到32去了,不对[/quote]这应该没问题吧,因为我写的时候多占用了一倍的容量,读的时候也是多读一倍,这样就相互抵消了
dceacho 2014-05-28
  • 打赏
  • 举报
回复
引用 5 楼 wangfan027 的回复:
[quote=引用 4 楼 a215353685 的回复:]
[quote=引用 2 楼 wangfan027 的回复:]
揣摩你意图应该是这样吧


int getparam()
{
STMFLASH_Read(0x08007E00,(u16*)&g_ink_detection,sizeof(g_ink_detection));//&
}
int setparam()
{
STMFLASH_Write(0x08007E00,(u16*)&g_ink_detection,sizeof(g_ink_detection));//&
}
我写入的是数组,那得用数组的指针啊,数组是g_ink_detection[3],那数组]的指针应该是g_ink_detection,你为什么要用&g_ink_detection呢?[/quote]
哦,看错了,应该是sizeof(g_ink_detection)的问题,这sizeof的是那个指针的长度(应该是4),所以读写不完整
换成sizeof(G_ink_detection)看看[/quote]
抱歉,仔细看了sizeof的说明,你用的没错


编辑下,最多只能连续回复3次

void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)
{
u16 i;
for(i=0;i<NumToRead;i++)
{
pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节
ReadAddr+=2;//偏移2个字节
}
}

如果读取16个字节STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,16)
i会循环16次,但你的ReadAddr+=2;早已加到32去了,不对
dceacho 2014-05-28
  • 打赏
  • 举报
回复
引用 4 楼 a215353685 的回复:
[quote=引用 2 楼 wangfan027 的回复:] 揣摩你意图应该是这样吧

int getparam()
 {
 STMFLASH_Read(0x08007E00,(u16*)&g_ink_detection,sizeof(g_ink_detection));//&
 }
 int setparam()
 {
 STMFLASH_Write(0x08007E00,(u16*)&g_ink_detection,sizeof(g_ink_detection));//&
 }
我写入的是数组,那得用数组的指针啊,数组是g_ink_detection[3],那数组]的指针应该是g_ink_detection,你为什么要用&g_ink_detection呢?[/quote] 哦,看错了,应该是sizeof(g_ink_detection)的问题,这sizeof的是那个指针的长度(应该是4),所以读写不完整 换成sizeof(G_ink_detection)看看
o0黑色淘金0o 2014-05-28
  • 打赏
  • 举报
回复
引用 2 楼 wangfan027 的回复:
揣摩你意图应该是这样吧

int getparam()
 {
 STMFLASH_Read(0x08007E00,(u16*)&g_ink_detection,sizeof(g_ink_detection));//&
 }
 int setparam()
 {
 STMFLASH_Write(0x08007E00,(u16*)&g_ink_detection,sizeof(g_ink_detection));//&
 }
我写入的是数组,那得用数组的指针啊,数组是g_ink_detection[3],那数组]的指针应该是g_ink_detection,你为什么要用&g_ink_detection呢?
o0黑色淘金0o 2014-05-28
  • 打赏
  • 举报
回复
我写入的是数组,那得用数组的指针啊,数组是g_ink_detection[3],那数组]的指针应该是g_ink_detection,你为什么要用&g_ink_detection呢?
dceacho 2014-05-28
  • 打赏
  • 举报
回复
揣摩你意图应该是这样吧

int getparam()
 {
 STMFLASH_Read(0x08007E00,(u16*)&g_ink_detection,sizeof(g_ink_detection));//&
 }
 int setparam()
 {
 STMFLASH_Write(0x08007E00,(u16*)&g_ink_detection,sizeof(g_ink_detection));//&
 }
o0黑色淘金0o 2014-05-28
  • 打赏
  • 举报
回复
我用的地址是0x08007E00

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧