硬汉嵌入式论坛

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

[例程下载] "V5-105_NOR Flash访问例程"可能有点小问题

[复制链接]

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2015-8-3 12:03:17 | 显示全部楼层 |阅读模式
最近在做F4操作nor,看了很多例程都是照搬官网的,甚至连最基本的擦除地址都搞错了,
看安富来是自己做的,就仔细读了安富来的例子,发现下面这个是不是个bug呢?新手,请楼主指教
捕获.PNG
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2015-8-3 12:15:40 | 显示全部楼层
这里是半字操作,注意指针++是两个字节。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2015-8-3 12:25:44 | 显示全部楼层
我们基础篇教程里面的例子都是来官方。
这个是我2013年的时候专门开的帖子,说明关于我们基础篇教程及其例子的说明,请看这里:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=2103


我在外面专门开了一个帖子进行说明这个问题,争取让所有的网友都看到
注意,我们V5开发板配套的基础篇教程里面的例子基本都是从官方固件库移植过来
http://www.armbbs.cn/forum.php?mod=viewthread&tid=11964
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2015-8-3 12:44:50 | 显示全部楼层

回 eric2013 的帖子


指针的事情我明白;不过您仔细看下,红线哪句在这里意义何在?
如果我读2048个字节,安装这个函数执行,因为有红线所示语句存在,for循环到512就停了吧?
应该读不到2048了
编辑补充,我认为应该去电红圈那句,或者不用for了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2015-8-3 12:47:45 | 显示全部楼层

回 chishangpiao 的帖子

chishangpiao:指针的事情我明白;不过您仔细看下,红线哪句在这里意义何在?
如果我读2048个字节,安装这个函数执行,因为有红线所示语句存在,for循环到512就停了吧?
应该读不到2048了 (2015-08-03 12:44) 
我说的就是这句,简单点你用代入法试试。这个变量记录的是字节数,每一次for循环都是操作了2个字节,所以这里是减2.
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2015-8-3 12:48:08 | 显示全部楼层

回 eric2013 的帖子

eric2013:我们基础篇教程里面的例子都是来官方。
这个是我2013年的时候专门开的帖子,说明关于我们基础篇教程及其例子的说明,请看这里:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=2103


....... (2015-08-03 12:25)
我没别的意思,别误会,我是看了几乎所有的st操作nor的例程,看你们写了几个自己的函数,仔细阅读你们nor的例程,
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2015-8-3 12:48:54 | 显示全部楼层

回 chishangpiao 的帖子

chishangpiao:我没别的意思,别误会,我是看了几乎所有的st操作nor的例程,看你们写了几个自己的函数,仔细阅读你们nor的例程, (2015-08-03 12:48) 
[s:142]
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2015-8-3 12:54:00 | 显示全部楼层

回 eric2013 的帖子

eric2013:我说的就是这句,简单点你用代入法试试。这个变量记录的是字节数,每一次for循环都是操作了2个字节,所以这里是减2. (2015-08-03 12:47)
您还是没有明白我的意思,
for (i = 0; i < uiNum / 2; i++)这里的 i < uiNum / 2在变化吧?uiNum/2一直在减小,每次for循环-2,还能执行那么多次数吗?
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2015-8-3 12:57:03 | 显示全部楼层
个人认为,可以设置一个变量 t=uiNum / 2,把for (i = 0; i < uiNum / 2; i++)改成for (i = 0; i < t; i++),我不知道自己理解的对不,请楼主指教
或者删去红圈那句,执行完for,根据i再更新uiNum
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2015-8-3 13:07:41 | 显示全部楼层

回 chishangpiao 的帖子

chishangpiao:个人认为,可以设置一个变量 t=uiNum / 2,把for (i = 0; i < uiNum / 2; i++)改成for (i = 0; i < t; i++),我不知道自己理解的对不,请楼主指教
或者删去红圈那句,执行完for,根据i再更新uiNum
 (2015-08-03 12:57) 
注意多余出来的单字节处理下就行,
我们的这个NOR FLASH仅支持16bit操作,不像SRAM,可以字,半字,字节操作。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2015-8-3 13:30:30 | 显示全部楼层

回 eric2013 的帖子

eric2013:注意多余出来的单字节处理下就行,
我们的这个NOR FLASH仅支持16bit操作,不像SRAM,可以字,半字,字节操作。 (2015-08-03 13:07)
明白你说的意思,
但和我说不一样哦,
我的意思是这个函数在这个for循环是有问题的,
for (i = 0; i < uiNum / 2; i++)
{
    usHalfWord = *pNor16++;
    *_pBuf++ = usHalfWord;
    *_pBuf++ = usHalfWord >> 8;
    uiNum -= 2;
}

且抛开nor的bit问题不说,这里for语句i在++,而uiNum 每次又减2,for的判断使用了uiNum 这里没有问题吗?

简单点,说这个函数,从norflash的0地址读数据,读2048字节
调该用函数为NOR_ReadBuffer(buf,0,2048);
那么就跳过第一个if直接执行for了吧?uiNum=2048,
第一次执行for,i=0,判断i是小于1024,执行完for此时uiNum=2044,
第二次执行for,i=1,判断i是小于多少呢?1022了,执行完for此时uiNum=2042,
……
等i=511的时候就是最后一次了吧,
总执行512次,也就读1024字节吧?
因为读数量是偶数,那么下面的那个if也是不行的,所以最终的读数据是1024字节,512 h_word,
我刚刚花时间已经在硬件上仿真了,你们可以测试下该函数试试
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2015-8-3 13:34:54 | 显示全部楼层
第一次执行for,i=0,判断i是小于1024,执行完for此时uiNum=2044?    uiNum=2046
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2015-8-3 13:37:01 | 显示全部楼层

回 eric2013 的帖子

eric2013:第一次执行for,i=0,判断i是小于1024,执行完for此时uiNum=2044?    uiNum=2046 (2015-08-03 13:34)
抱歉,我一时走心打错了,是2046,,2044
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2015-8-3 13:40:29 | 显示全部楼层

回 chishangpiao 的帖子

chishangpiao:抱歉,我一时走心打错了,是2046,,2044 (2015-08-03 13:37) 
简单点可以这样:
uiNum =2048
for (i = 0; i < 2048/ 2; i++)
{
    uiNum -= 2;
}

i = 1023的试试执行结束。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2015-8-3 13:47:07 | 显示全部楼层

回 eric2013 的帖子

eric2013:简单点可以这样:
uiNum =2048
for (i = 0; i < 2048/ 2; i++)
{
....... (2015-08-03 13:40)
对的,这个是肯定没有问题的,问题在于
for (i = 0; i < uiNum / 2; i++)
{
    uiNum -= 2;
}
2048是常量,uiNum是变量哦

也简单点吧,uiNum=4;这里可以看做偶数地址读4字节吧?
for (i = 0; i < uiNum / 2; i++)
{
    uiNum -= 2;
}

执行几次?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2015-8-3 14:01:30 | 显示全部楼层

回 chishangpiao 的帖子

chishangpiao:对的,这个是肯定没有问题的,问题在于
for (i = 0; i < uiNum / 2; i++)
{
    uiNum -= 2;
....... (2015-08-03 13:47) 
嗦嘎,原来你一直想表达的是这个问题,非常感谢告知。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2015-8-3 14:02:02 | 显示全部楼层

回 eric2013 的帖子

eric2013:

简单点可以这样:
uiNum =2048
for (i = 0; i < 2048/ 2; i++)
{
.......
我已经做过硬件仿真了,那台电脑是公司的没有网卡,U口也堵了,仿真结果没法截图给你,我指出那里确实是有问题的,就是只能读取到参数_uiBytes四分之一的数据,
我本来也申请公司买你们的板子了,因为价格的问题还没有批下来,所以手上暂时没有你们的板子,但无论哪个硬件仿真出来的效果都是一样的。
下面是我在这台能上网的电脑上修改的你们程序,可以和1楼贴出来的你们程序对比下,是不是不一样?下图红线是我添加修改的地方
捕获11.PNG
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2015-8-3 14:03:54 | 显示全部楼层

回 eric2013 的帖子

eric2013:嗦嘎,原来你一直想表达的是这个问题,非常感谢告知。 (2015-08-03 14:01)
哈哈,你懂了,突然发现我语言表达太差了,老是 说半天别人才明白,
感谢楼主大大的热心恢复交流
回复

使用道具 举报

6

主题

65

回帖

83

积分

初级会员

积分
83
发表于 2015-8-13 22:23:06 | 显示全部楼层
[s:151] 好贴
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 16:16 , Processed in 0.387506 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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