OpenEdv-开源电子网

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

读FLASH的数据发现读写不一致,求解答

[复制链接]

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
发表于 2016-1-4 11:54:42 | 显示全部楼层 |阅读模式
3金钱
const u8  TEXT_Buffer[2]={1,2};
#define SIZE sizeof(TEXT_Buffer)                //数组长度
#define FLASH_SAVE_ADDR  0X08070000                //设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
int main(void)
{         
        u8 key;
        u8 datatemp[SIZE];

        delay_init();                     //延时函数初始化         
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
        KEY_Init();                                        //初始化按键
        while(1)
        {
                key=KEY_Scan(0);
                if(key==KEY3_PRES)        //KEY1按下,写入STM32 FLASH
                {

                        STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
                        printf("%s","数据写入完毕");
                }
                if(key==KEY4_PRES)        //KEY0按下,读取字符串并显示
                {

                        STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE);
                        printf("%d",(u16*)datatemp);
                }

                delay_ms(10);  
   
        }
}请问为什么我仿真的时候0x08070000的地址里的数据都改成我要的数了,但是printf出来是35 33 36 38 37 34 38 34 30 。。根本不是1和2 ,请问是不是printf的不对的,怎么修改?谢谢啦

最佳答案

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

对了的。你写两个字节分别写的1和2,即0x01和0x02。 而你读是一次性读的两个字节,显示也是显示的两个字节数的大小。 而这两个字节数的存放是 01 02。其大小就是0x0201,即513。(大小端模式你自己看看)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2016-1-4 11:54:43 | 显示全部楼层
本帖最后由 BMN李 于 2016-1-4 14:25 编辑
864384664 发表于 2016-1-4 14:16
这回打印出的数是35 31 33 ,十进制是513,还是不对啊

对了的。你写两个字节分别写的1和2,即0x01和0x02。
而你读是一次性读的两个字节,显示也是显示的两个字节数的大小。

而这两个字节数的存放是 01 02。其大小就是0x0201,即513。(大小端模式你自己看看)
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-1-4 12:53:19 | 显示全部楼层
printf("%d",(u16*)datatemp);你确定这样可行?
回复

使用道具 举报

29

主题

311

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1530
金钱
1530
注册时间
2012-9-4
在线时间
262 小时
发表于 2016-1-4 13:09:53 | 显示全部楼层
printf("%d",(u16*)datatemp); 打印出来的应该只有datatemp[0]这个值吧。。。
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
 楼主| 发表于 2016-1-4 13:13:25 | 显示全部楼层
aben 发表于 2016-1-4 13:09
printf("%d",(u16*)datatemp); 打印出来的应该只有datatemp[0]这个值吧。。。

结果一样,不是我要的值
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
 楼主| 发表于 2016-1-4 13:15:12 | 显示全部楼层
八度空间 发表于 2016-1-4 12:53
printf("%d",(u16*)datatemp);你确定这样可行?

那应该怎么打印呢?
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2016-1-4 13:55:59 | 显示全部楼层
printf("%d",*((u16*)datatemp));
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2016-1-4 14:05:36 | 显示全部楼层
aben 发表于 2016-1-4 13:09
printf("%d",(u16*)datatemp); 打印出来的应该只有datatemp[0]这个值吧。。。

打印的是地址
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
 楼主| 发表于 2016-1-4 14:16:29 | 显示全部楼层
BMN李 发表于 2016-1-4 13:55
printf("%d",*((u16*)datatemp));

这回打印出的数是35 31 33 ,十进制是513,还是不对啊
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
 楼主| 发表于 2016-1-4 14:17:45 | 显示全部楼层
864384664 发表于 2016-1-4 14:16
这回打印出的数是35 31 33 ,十进制是513,还是不对啊

他打印的长度是怎么确定的呢?为什么会打印出三个数...
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2016-1-4 14:25:09 | 显示全部楼层
本帖最后由 BMN李 于 2016-1-4 14:31 编辑
864384664 发表于 2016-1-4 14:17
他打印的长度是怎么确定的呢?为什么会打印出三个数...
这里是你串口助手十六进制显示,所以分成了三个。
还有就是好好看看printf的使用吧。。。
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
 楼主| 发表于 2016-1-4 15:05:38 | 显示全部楼层
BMN李 发表于 2016-1-4 11:54
对了的。你写两个字节分别写的1和2,即0x01和0x02。
而你读是一次性读的两个字节,显示也是显示的两个字 ...

谢谢你的耐心解答
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
 楼主| 发表于 2016-1-4 15:08:35 | 显示全部楼层
BMN李 发表于 2016-1-4 14:25
这里是你串口助手十六进制显示,所以分成了三个。
还有就是好好看看printf的使用吧。。。

金币只能给一个人,不好意思啊。你的回答让我十分透彻的明白了我的问题,再次谢谢你。金币没到你手机不要生气啊
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2016-1-4 15:09:55 | 显示全部楼层
864384664 发表于 2016-1-4 15:05
谢谢你的耐心解答

还有一点是上面那个读操作的SIZE应该是SIZE/2,因为该函数是读两字节的吧。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 22:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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