9055|18

144

帖子

2

TA的资源

一粒金砂(高级)

楼主
 

nand flash实时存储AD采集的数据和定义大数组的问题 [复制链接]

使用STM32的ADC1和ADC2同步采集2路外部信号,且定时器中断
(TIM2_CC2,每0.01ms采集一次,即采样率为100ksps)触发ADC1和ADC2同时采集。
其中ADC1采集的数据保存在ADC_DR的低16位,ADC2采集的数据保存在ADC_DR的高16位。
然后将ADC1和ADC2采集的数据通过DMA方式将ADC_DR中的字数据传输至数组
unsigner int  AD_Value[ADC_BufferLength]中,最后将保存在数组AD_Value中的数据
写入nand flash中保存起来。
现在主要有两个问题:
问题1:由于数组AD_Value中保存的是字数据,而目前所使用的nand  flash K9F1G08U0E是8位的,
因此,在将数组AD_Value中的数据写入flash 之前,需要先将数组AD_Value中字数据分解字节数据,
并将这些字节数据保存在字节数组unsigner char TxBuffer[ADC_BufferLength*4]中。
比如通过以下方式:
  1. for(i=0;i<ADC_BufferLength;i++)
  2.             {
  3.               TxBuffer[i*4]   = (u8)((AD_Value[i])&0xff);
  4.               TxBuffer[i*4+1] = (u8)(((AD_Value[i])&0xff00)>>8);         //ADC1:低字
  5.                      TxBuffer[i*4+2] = (u8)(((AD_Value[i])&0xff0000)>>16);
  6.               TxBuffer[i*4+3] = (u8)(((AD_Value[i])&0xff000000)>>24);//ADC2:高字                       
  7.                  }               
复制代码
但是,这样势必影响到数据存储的速度,从而影响到实时数据的保存。该怎么办呢?
问题2:两路AD同步采集,且采集速率都是100ksps,而nand  flash的页编程时间一般为300us~700us,
那么,在flash的页编程时间里,2路AD采集到的数据量=2*100k*700us*2Byte(每个AD采集数据为2个字节)=280Byte,
因此,为了能够保证保存AD采集的全部实时数据,那么缓冲区的大小就至少为280Byte。
于是我就将ADC_BufferLength定义为128:#define ADC_BufferLength  128
这样一来,缓冲区的实际大小就是128*4=512Byte,这是满足要求的。
​程序编译通过了,nand  flash的读写也是正确的。
​但考虑到nand flash的一页是2k=2048个字节,于是,将于是我就将ADC_BufferLength定义为512,即2048个字节,恰好是falsh一页的大小。
​编译能够通过,但是程序却一直在“字转字节”的小程序中循环:
我尝试着将堆区扩大,将Stack_Size      EQU     0x00000800 改成 Stack_Size      EQU     0x00008000
结果依然是:在”字转字节“的小程序中死循环,全速运行,也不会到达断点处;
然后我将数组unsigner char TxBuffer[ADC_BufferLength*4]由局部变量改成全局变量,
结果依然是:在”字转字节“的小程序中陷入了死循环,即使全速运行,也不能到达断点处,当停止全速运行时,通过memory窗口
查看数组TxBuffer中数据时,发现,只能看到数据的前1024个数据,即TxBuffer[0]~TxBuffer[1023],之后的1024个数据则全部为
0x00。
这又该怎么办呢?

1.PNG (22.94 KB, 下载次数: 0)

在"字转字节"小程序里陷入死循环

在"字转字节"小程序里陷入死循环
此帖出自stm32/stm8论坛

最新回复

楼主你这问题解决了吗?我也在搞NAND FLASH,类似你的问题。  详情 回复 发表于 2016-5-25 16:15
点赞 关注
 

回复
举报

165

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
i不会是char吧...
此帖出自stm32/stm8论坛

点评

就是 谢谢 问题2解决了  详情 回复 发表于 2015-3-18 17:34
 
 

回复

4008

帖子

0

TA的资源

版主

板凳
 
本帖最后由 huo_hu 于 2015-3-18 16:31 编辑

1:用指针强制类型转换
TxBuffer[i*4]   =* (u32 *)(AD_Value);
2:问题没有看懂,这个和Stack_Size没有关系啊,除非你内存很吃紧了...
如果内存够就开2个缓冲区,AD和flash各访问一个,满了就换...
多于1024的数据用memory查看.
此帖出自stm32/stm8论坛

点评

图1和图2最下方的Memory2中的数据:04 08 FF 0F 01 08 FF 0F... 对应的是数组TxBuffer[0]、TxBuffer[1]、TxBuffer[2]、TxBuffer[3]、TxBuffer[4]、TxBuffer[5]、TxBuffer[6]、TxBuffer[7]...的值。 所以,如果我  详情 回复 发表于 2015-3-19 17:45
您的意思是这样吗(其中ADC_BufferLength=512[/backcolor]): (u32*)AD_Value是将AD_Value强制转换成指针,且该指针指向的数据类型是unsigner int; *((u32*)AD_Value)则是对该指针变量的引用,也就是(u32*)AD_Val  详情 回复 发表于 2015-3-19 17:38
谢谢,我会尝试一下的  详情 回复 发表于 2015-3-18 17:35
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

4
 
EETUX 发表于 2015-3-18 15:50
i不会是char吧...

就是     谢谢
问题2解决了



此帖出自stm32/stm8论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

5
 
huo_hu 发表于 2015-3-18 16:29
1:用指针强制类型转换
TxBuffer   =* (u32 *)(AD_Value);
2:问题没有看懂,这个和Stack_Size没有关系啊,除非你内存很吃紧了...
如果内存够就开2个缓冲区,AD和flash各访问一个,满了就换...
多于1024的数据用memory查看.



谢谢,我会尝试一下的
此帖出自stm32/stm8论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

6
 
huo_hu 发表于 2015-3-18 16:29
1:用指针强制类型转换
TxBuffer   =* (u32 *)(AD_Value);
2:问题没有看懂,这个和Stack_Size没有关系啊,除非你内存很吃紧了...
如果内存够就开2个缓冲区,AD和flash各访问一个,满了就换...
多于1024的数据用memory查看.
您的意思是这样吗(其中ADC_BufferLength=512):
  1.      for(i=0;i<ADC_BufferLength;i++)
  2.             {
  3.                   TxBuffer[i*4]   = *((u32*)AD_Value);
复制代码
(u32*)AD_Value是将AD_Value强制转换成指针,且该指针指向的数据类型是unsigner int;

*((u32*)AD_Value)则是对该指针变量的引用,也就是(u32*)AD_Value所指向的值。


如果按照最初的字转字节的小程序,结果如图1所示;

按照上述代码,结果如图2所示。

可能是我还没有真正懂版主的意思,所以,麻烦再指点一下。先谢过!




1.PNG (62.25 KB, 下载次数: 0)

图1:字转字节

图1:字转字节

12.PNG (62.18 KB, 下载次数: 0)

图2:强制转换成指针

图2:强制转换成指针
此帖出自stm32/stm8论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

7
 
閺屻儳婀呴張顒€绗橀崗銊╁劥鐠併劏顔戦敍宀冾嚞閻ц缍�閹存牞鈧拷濞夈劌鍞�
此帖出自stm32/stm8论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

8
 
閺屻儳婀呴張顒€绗橀崗銊╁劥鐠併劏顔戦敍宀冾嚞閻ц缍�閹存牞鈧拷濞夈劌鍞�
此帖出自stm32/stm8论坛
 
 
 

回复

9856

帖子

24

TA的资源

版主

9
 
閺屻儳婀呴張顒€绗橀崗銊╁劥鐠併劏顔戦敍宀冾嚞閻ц缍�閹存牞鈧拷濞夈劌鍞�
此帖出自stm32/stm8论坛

点评

恩 这个我正在考虑中 谢谢提醒  详情 回复 发表于 2015-3-21 09:02
 
 
 

回复

4008

帖子

0

TA的资源

版主

10
 
閺屻儳婀呴張顒€绗橀崗銊╁劥鐠併劏顔戦敍宀冾嚞閻ц缍�閹存牞鈧拷濞夈劌鍞�
此帖出自stm32/stm8论坛

点评

恩 谢谢版主  详情 回复 发表于 2015-3-21 09:03
 
 
 

回复

4008

帖子

0

TA的资源

版主

11
 
閺屻儳婀呴張顒€绗橀崗銊╁劥鐠併劏顔戦敍宀冾嚞閻ц缍�閹存牞鈧拷濞夈劌鍞�
此帖出自stm32/stm8论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

12
 
閺屻儳婀呴張顒€绗橀崗銊╁劥鐠併劏顔戦敍宀冾嚞閻ц缍�閹存牞鈧拷濞夈劌鍞�
此帖出自stm32/stm8论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

13
 
閺屻儳婀呴張顒€绗橀崗銊╁劥鐠併劏顔戦敍宀冾嚞閻ц缍�閹存牞鈧拷濞夈劌鍞�
此帖出自stm32/stm8论坛
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

14
 
閺屻儳婀呴張顒€绗橀崗銊╁劥鐠併劏顔戦敍宀冾嚞閻ц缍�閹存牞鈧拷濞夈劌鍞�
此帖出自stm32/stm8论坛

点评

楼主你这问题解决了吗?我也在搞NAND FLASH,类似你的问题。  详情 回复 发表于 2016-5-25 16:15
 
 
 

回复

4008

帖子

0

TA的资源

版主

15
 
閺屻儳婀呴張顒€绗橀崗銊╁劥鐠併劏顔戦敍宀冾嚞閻ц缍�閹存牞鈧拷濞夈劌鍞�
此帖出自stm32/stm8论坛

点评

单片机型号是stm32f103zet6,使用的外部存储器是nand flash K9F1G08,stm32与外部nand flash连接,使用了stm32的FSMC  详情 回复 发表于 2015-3-22 12:25
 
 
 

回复

144

帖子

2

TA的资源

一粒金砂(高级)

16
 
閺屻儳婀呴張顒€绗橀崗銊╁劥鐠併劏顔戦敍宀冾嚞閻ц缍�閹存牞鈧拷濞夈劌鍞�
此帖出自stm32/stm8论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

17
 
閺屻儳婀呴張顒€绗橀崗銊╁劥鐠併劏顔戦敍宀冾嚞閻ц缍�閹存牞鈧拷濞夈劌鍞�
此帖出自stm32/stm8论坛
 
 
 

回复

482

帖子

0

TA的资源

一粒金砂(中级)

18
 
閺屻儳婀呴張顒€绗橀崗銊╁劥鐠併劏顔戦敍宀冾嚞閻ц缍�閹存牞鈧拷濞夈劌鍞�
此帖出自stm32/stm8论坛
 
 
 

回复

482

帖子

0

TA的资源

一粒金砂(中级)

19
 
閺屻儳婀呴張顒€绗橀崗銊╁劥鐠併劏顔戦敍宀冾嚞閻ц缍�閹存牞鈧拷濞夈劌鍞�
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播报名| TI 面向楼宇和工厂自动化行业的毫米波雷达解决方案
【内容简介】TI 60GHz IWRL6432和 IWRL1432毫米波雷达传感器如何帮助解决楼宇和工厂自动化应用中的感应难题
【直播时间】5月28日(周三)上午10:00
【直播礼品】小米双肩包、contigo水杯、胶囊伞、安克充电器

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 9

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表