OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7702|回复: 10

为什么使用单片机内部的flash做eeprom的时候,我写去的数据与读出来的数据不一致呢?

[复制链接]

20

主题

69

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5486
金钱
5486
注册时间
2018-3-25
在线时间
16 小时
发表于 2018-3-27 17:59:50 | 显示全部楼层 |阅读模式
1金钱
为什么使用单片机内部的flash做eeprom的时候,我写去的数据与读出来的数据不一致呢?我给内部flash写入了 0x01和0x02两个字节的数据,是使用函数库写的,现在可以确定写入成功。但是我在读出发送的串口的时候数据位置不一致啊?这是为什么呢?    unsigned char data[10]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10};
    unsigned int a=0;

    FLASH_Unlock();
    FLASH_ErasePage(0x0801fc00);    //要擦除页的首地址
    FLASH_Lock();

    FLASH_Unlock();
    FLASH_ProgramHalfWord(0x0801fc00,data[0]);
    FLASH_ProgramHalfWord(0x0801fc00+2,data[1])
    FLASH_Lock();
    while(1)
    {
        tese_data[3]=((unsigned char)(a>>0));
        tese_data[2]=((unsigned char)(a>>8));
        tese_data[1]=((unsigned char)(a>>16));
        tese_data[0]=((unsigned char)(a>>24));
        usart1_send_data(tese_data,4);

    }

0102.png

最佳答案

查看完整内容[请看2#楼]

强制转换一定要了解数据存储格式,高位低位顺序,以及存储方式,你在中间打印一下(UINT)*a 就明白了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-27 17:59:51 | 显示全部楼层
强制转换一定要了解数据存储格式,高位低位顺序,以及存储方式,你在中间打印一下(UINT)*a 就明白了。
回复

使用道具 举报

20

主题

69

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5486
金钱
5486
注册时间
2018-3-25
在线时间
16 小时
 楼主| 发表于 2018-3-27 18:00:47 | 显示全部楼层
数据位置怎么反了呢?我明明在强制数据类型转换时做了安排的
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-27 20:24:41 来自手机 | 显示全部楼层
没看懂你的程序…a怎么被赋值的呢…
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-3-28 00:58:30 | 显示全部楼层
串口我们例程,先学会我们例程。
回复

使用道具 举报

20

主题

69

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5486
金钱
5486
注册时间
2018-3-25
在线时间
16 小时
 楼主| 发表于 2018-3-28 11:18:52 | 显示全部楼层
正点原子 发表于 2018-3-28 00:58
串口我们例程,先学会我们例程。

不是串口的问题啊,串口那部分现在没问题,就是读写内部flash的问题。写到内部flash的数据读出来后数据的位置与原位置相反,比如我以半字写入的方式给某一个存储单元(如0x08001fff)写入数据 0x0001。之后在地址加2,写入数据0x0002。写完再读出来来就变成00020001了。我先写的0001怎么跑到后面了??????????
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-28 12:29:34 来自手机 | 显示全部楼层
你那个输出data3210的排序,输出自然是反着的
回复

使用道具 举报

20

主题

69

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5486
金钱
5486
注册时间
2018-3-25
在线时间
16 小时
 楼主| 发表于 2018-3-28 15:00:34 | 显示全部楼层
孟亮 发表于 2018-3-28 12:29
你那个输出data3210的排序,输出自然是反着的

    unsigned int x=7999999;
    unsigned int a=0;
   
    unsigned char data[10]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10};
   
    FLASH_Unlock();                                                  //解锁
   
    FLASH_ErasePage(0x0801fc00);                                     //要擦除页的首地址
   
    FLASH_ProgramHalfWord(0x0801fc00,(unsigned short)data[0]);      //写入半字数据16位
    FLASH_ProgramHalfWord(0x0801fc00+2,(unsigned short)data[1]);    //写入半字数据16位 但是地址要便宜2个字节
   
    FLASH_Lock();                                                    //上锁
   
    while(1)
    {
        a=(*(unsigned int*)0x0801fc00);         //读出写入单元的数据
        
        tese_data[0]=((unsigned char)(a>>0));
        tese_data[1]=((unsigned char)(a>>8));
        tese_data[2]=((unsigned char)(a>>16));
        tese_data[3]=((unsigned char)(a>>24));
        usart1_send_data(tese_data,4);
        
        x=7999999;
        while(x--);
    }
这样后输出的是 01 00 02 00       这是为什么?
回复

使用道具 举报

20

主题

69

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5486
金钱
5486
注册时间
2018-3-25
在线时间
16 小时
 楼主| 发表于 2018-3-28 15:10:25 | 显示全部楼层
孟亮 发表于 2018-3-28 12:29
你那个输出data3210的排序,输出自然是反着的

    unsigned int x=7999999;
    unsigned int a=0;
   
    unsigned char data[10]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10};
   
    FLASH_Unlock();                                                  //解锁
   
    FLASH_ErasePage(0x0801fc00);                                     //要擦除页的首地址
   
    FLASH_ProgramHalfWord(0x0801fc00,(unsigned short)data[0]);      //写入半字数据16位
    FLASH_ProgramHalfWord(0x0801fc00+2,(unsigned short)data[1]);    //写入半字数据16位 但是地址要便宜2个字节
   
    FLASH_Lock();                                                    //上锁
   
    while(1)
    {
        a=(*(unsigned int*)0x0801fc00);         //读出写入单元的数据
        
        tese_data[0]=((unsigned char)(a>>0));
        tese_data[1]=((unsigned char)(a>>8));
        tese_data[2]=((unsigned char)(a>>16));
        tese_data[3]=((unsigned char)(a>>24));
        usart1_send_data(tese_data,4);
        
        x=7999999;
        while(x--);
    }
这样后输出的是 01 00 02 00       这是为什么?
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-28 16:27:27 | 显示全部楼层
本帖最后由 孟亮 于 2018-3-28 16:29 编辑

0x0801fc00           0x0801fc01           0x0801fc02           0x0801fc03
00000001              00000000             00000010              00000000

之后*a=00000001,00000000,00000010,00000000
再之后data0=00000001,data1=00000000,data2=00000010,data3=00000000
输出 01 00 02 00吧?
回复

使用道具 举报

20

主题

69

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5486
金钱
5486
注册时间
2018-3-25
在线时间
16 小时
 楼主| 发表于 2018-3-29 15:37:00 | 显示全部楼层
孟亮 发表于 2018-3-28 16:31
强制转换一定要了解数据存储格式,高位低位顺序,以及存储方式,你在中间打印一下(UINT)*a 就明白了。

已经搞清楚了,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 22:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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