硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1339|回复: 8
收起左侧

[其它] 求解惑,关于NOR FLASH超出地址范围的读写

[复制链接]

7

主题

27

回帖

48

积分

新手上路

积分
48
发表于 2022-8-16 20:34:32 | 显示全部楼层 |阅读模式
自己画了个板子,MCU是103zet6,用的32Mbit的nor flash,64个扇区
下午测试硬件的时候,没注意就直接用这个例程,例程用的nor flsah是128个扇区
例程内容往第128个扇区读写,竟然也能读写出来正确的写入数据

起始地址是一样的,都是0x64000000,我想知道我这个往不存在的第128个扇区写的数据,存储在了哪一块的空间



image.png image.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
发表于 2022-8-17 11:26:03 | 显示全部楼层
这里有个关键的地方,重新上电后,对应的数据还正常吗,另外你的测试代码怎么写的。
回复

使用道具 举报

7

主题

27

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2022-8-17 18:13:50 | 显示全部楼层
我今天改回4M字节的大小了,断电数据还是有的。至于超过范围的倒是没去试断电数据在不在,我明天试试看掉电后还能正常读取不,代码就直接拿硬汉哥你的程序就用了,改了下FSMC的对应区和引脚而已
回复

使用道具 举报

7

主题

27

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2022-8-23 10:23:37 | 显示全部楼层
eric2013 发表于 2022-8-17 11:26
这里有个关键的地方,重新上电后,对应的数据还正常吗,另外你的测试代码怎么写的。

前几天隔离才出来,好家伙,忘光了,等我后续开发到这个地方再跟上
回复

使用道具 举报

7

主题

27

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2022-8-23 10:27:41 | 显示全部楼层
eric2013 发表于 2022-8-17 11:26
这里有个关键的地方,重新上电后,对应的数据还正常吗,另外你的测试代码怎么写的。

隔离刚出来,已经忘光了,等我后续整到这个地方再更
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
发表于 2022-8-24 02:32:55 | 显示全部楼层
tomasgod 发表于 2022-8-23 10:27
隔离刚出来,已经忘光了,等我后续整到这个地方再更

好的。
回复

使用道具 举报

7

主题

27

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2022-10-19 11:04:39 | 显示全部楼层
eric2013 发表于 2022-8-17 11:26
这里有个关键的地方,重新上电后,对应的数据还正常吗,另外你的测试代码怎么写的。

断电测试了下,数据能正常保存的。。。。。
回复

使用道具 举报

7

主题

27

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2022-10-19 11:05:36 | 显示全部楼层
eric2013 发表于 2022-8-17 11:26
这里有个关键的地方,重新上电后,对应的数据还正常吗,另外你的测试代码怎么写的。

断电测试了下,数据还是能正常保存读写的。。
回复

使用道具 举报

7

主题

27

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2022-10-19 14:07:47 | 显示全部楼层
eric2013 发表于 2022-8-17 11:26
这里有个关键的地方,重新上电后,对应的数据还正常吗,另外你的测试代码怎么写的。


#define NOR_FLASH_ADDR          ((uint32_t)0x64000000)

#define ADDR_SHIFT(A)         (NOR_FLASH_ADDR + (2 * (A)))
#define NOR_WRITE(Address, Data)  (*(__IO uint16_t *)(Address) = (Data))
/*
*********************************************************************************************************
*        函 数 名: NOR_WriteHalfWord
*        功能说明: 半字编程. 编程前执行解锁命令序列。编程完毕后,自动退到读取模式。半字编程可以是随机地址。
*                                编程前需要保证存储单元是全0xFF状态。可以重复编程相同的数据。
*        形    参:         _uiWriteAddr : 偏移地址[0, 16*1024*1024 - 2]; 编程地址必须为偶数
*                                _usData      : 数据 16Bit
*
*        返 回 值: NOR_SUCCESS, NOR_ERROR, NOR_TIMEOUT
*********************************************************************************************************
*/
uint8_t NOR_WriteHalfWord(uint32_t _uiWriteAddr, uint16_t _usData)
{
        NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA);
        NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055);
        NOR_WRITE(ADDR_SHIFT(0x0555), 0x00A0);
        NOR_WRITE(NOR_FLASH_ADDR + _uiWriteAddr, _usData);

        return (NOR_GetStatus(Program_Timeout));
}

硬汉哥,为啥这里第四个NOR_WRITE写入的地址不需要左移一位,既然是16位数据线,地址不应该都是左移一位么
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-25 20:00 , Processed in 0.194551 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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