AD采集到的实时数据全部存入nand flash和定义大数组的问题

2019-08-23 14:40发布

使用STM32ADC1ADC2同步采集2路外部信号,且定时器中断(TIM2_CC2,每0.01ms采集一次,即采样率为100ksps)触发ADC1ADC2同时采集。
其中ADC1采集的数据保存在ADC_DR的低16位,ADC2采集的数据保存在ADC_DR的高16位。
然后将ADC1ADC2采集的数据通过DMA方式将ADC_DR中的字数据传输至数组 unsigner int  AD_Value[ADC_BufferLength]中,最后将保存在数组
 AD_Value中的数据写入nand flash中保存起来。
现在主要有两个问题:
问题1:由于数组AD_Value中保存的是数据,而目前所使用的nand  flash K9F1G08U0E8位的,因此,在将数组AD_Value中的数据写入flash 之前,需要先将数组AD_Value数据分解字节数据,并将这些字节数据保存在字节数组unsigner char TxBuffer[ADC_BufferLength*4]中。
比如通过以下方式:
[mw_shl_code=c,true] for(i=0;i<ADC_BufferLength;i++) { TxBuffer[i*4] = (u8)((AD_Value)&0xff); TxBuffer[i*4+1] = (u8)(((AD_Value)&0xff00)>>8); //ADC1:低字 TxBuffer[i*4+2] = (u8)(((AD_Value)&0xff0000)>>16); TxBuffer[i*4+3] = (u8)(((AD_Value)&0xff000000)>>24);//ADC2:高字 } [/mw_shl_code] 但是,这样势必影响到数据存储的速度,从而影响到实时数据的保存。该怎么办呢?
问题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。
这又该怎么办呢?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。