查看: 679|回复: 5
打印 上一主题 下一主题

430单片机的flash 写操作

[复制链接] qrcode

32

主题

63

帖子

163

积分

注册会员

Rank: 2

积分
163
楼主
跳转到指定楼层
发表于 2015-8-24 10:04 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当我用串口软件向430单片机flash中写入10时(假设理解成10秒钟),然后再把10从flash中取出来。但问题出现了,按理说写入flash的数据10两个字节应该被写入0x1080和0x1081两个地址了,读出数据也是从0x1080开始读出,但现在我的目的是:比如我把10要写到flash segA的0x1080-0x1085这6个地址,没有数据的地址写0,但要保证读出来的数据就是10,请问该怎么写入
回复

使用道具 举报

0

主题

134

帖子

160

积分

注册会员

Rank: 2

积分
160
沙发
发表于 2015-8-24 10:04 AM | 只看该作者
串口发送过去的应该是字符串,需要转换成数据,这个你可以验证下是否是这样的;如果你要存500这个数的话,这个已经是两个字节了,一个地址只能存一个字节,所以,500这个数是不能直接存的,需要转化成16进制数,分高8位,低8位存。
回复 支持 反对

使用道具 举报

45

主题

212

帖子

319

积分

中级会员

Rank: 3Rank: 3

积分
319
板凳
发表于 2015-8-24 10:30 AM | 只看该作者

10是1个字节,没有说明编译器认为10是十进制数,把10要写到flash segA的0x1080-0x1085这6个地址,可以用数组,例如,uint8_t test_buffer[6] = {10,0,0,0,0,0};

写入可以用指针,类似这样:

for ( uint8_t i = 0; i < 6; i++)

{

*flash_ptr++ = *test_buffer++;

}

写入函数可以这样:void flash_writebuf(uint8_t *flash_ptr,uint8_t *buffer,uint8_t len);

回复 支持 反对

使用道具 举报

0

主题

72

帖子

4

积分

新手上路

Rank: 1

积分
4
地板
发表于 2015-8-24 10:58 AM | 只看该作者

起始我也是这么写的

for (i=0; i<6; i++)

    {
        *Flash_ptr++ = value;                   // Write value to flash
    }

比如我让led亮十秒,问题是这样我用串口助手发10读出来的数不是10,只有我发000010时,读出来就是10秒,led也能亮10秒;这样是不是说,当我发送10给单片机,单片机存储到1080-1085这六个地址中是不能实现的,因为这样的话相当于1080=0 1081=0....1084=1 1085=0,读出来的数据就是000010了,因为这个数我可以随时更改比如100,或者1000都可以,就变成000100,0010000了
回复 支持 反对

使用道具 举报

0

主题

71

帖子

6

积分

新手上路

Rank: 1

积分
6
5#
发表于 2015-8-24 11:20 AM | 只看该作者

data=(unsigned char *)0x1080;

for(i=0;i<6;i++)

 {
   
   WorkTimeptr=*data++;
 }
 

 WorkTime=string_to_int(WorkTimeptr);

这是读出来的函数,读出来不就不等于10了吗

回复 支持 反对

使用道具 举报

0

主题

91

帖子

18

积分

新手上路

Rank: 1

积分
18
6#
发表于 2015-8-24 10:41 PM | 只看该作者

如果发500的话,接收到的应该是'5','0','0',这个我也不确定,实践出真知,试试就知道;

如果1个Flash地址只能存8位的话,当要存储500这个十进制数到FLASH仍然需要两个地址空间。

回复 支持 反对

使用道具 举报

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

本版积分规则

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