使用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]中。
for(i=0;i<ADC_BufferLength;i++)
{
TxBuffer[i*4] = (u8)((AD_Value[i])&0xff);
TxBuffer[i*4+1] = (u8)(((AD_Value[i])&0xff00)>>8); //ADC1:低字
TxBuffer[i*4+2] = (u8)(((AD_Value[i])&0xff0000)>>16);
TxBuffer[i*4+3] = (u8)(((AD_Value[i])&0xff000000)>>24);//ADC2:高字
}
但是,这样势必影响到数据存储的速度,从而影响到实时数据的保存。该怎么办呢?
问题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 falsh的一页是2k=2048个字节,于是我将ADC_BuferLength定义为512,即2048个
字节,恰好是flash一页的大小。
编译能够通过,但是程序却一直在“字转字节”的小程序中陷入了死循环.
我尝试着将堆区扩大,将Stack_Size EQU 0x00000800 改成 Stack_Size EQU 0x00008000
结果依然是:在”字转字节“的小程序中死循环,全速运行,也不会到达断点处;
然后我将数组unsigner char TxBuffer[ADC_BufferLength*4]由局部变量改成全局变量,
结果依然是:在”字转字节“的小程序中陷入了死循环,即使全速运行,也不能到达断点处,当停止全速运行时,通过memory窗口
查看数组TxBuffer中数据时,发现,只能看到数据的前1024个数据,即TxBuffer[0]~TxBuffer[1023],之后的1024个数据则全部为
0x00。
这又该怎么办呢?
|