大家好,最近在调试SDIO驱动TF卡,并使用FATFS文件系统,运行在UCOSIII环境下,实现功能是实时采集(定时器中断采样)心电信号然后存储在TF卡中,存储数据单独一个任务,但采集到的心电信号有掉数据的情况,如下图: 使用的心电信号发生器,每8个点(512字节)存储一次,这里明显丢了一次的数据。 开始一直以为是f_write的问题,后来又检查了一下代码,用IO输出高低电平的方式跟踪到disk_write函数内的这句代码用时不稳定: Status = SD_WaitWriteOperation(); //SDIO工作在DMA模式,需检查DMA操作是否完成 进入到函数内部 GPIO_SetBits(GPIOB,GPIO_Pin_3); while(((SDIO->STA & SDIO_FLAG_TXACT)) && (timeout >0))//SDIO->STA状态寄存器 { timeout--; } GPIO_ResetBits(GPIOB,GPIO_Pin_3); 得到如下示波器波形: file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image003.gif 可以发现等待时长有时过长,直接影响了下一次存储。 不仅如此,采集到的心电信号还有这样的情况: 对应示波器波形如下: 在网上查了一下,说是SDIO DMA似乎就有这种情况,bug挺多,不只是否属实,所以请教一下大家这个问题如何解决了?我试着换成POLLING 方式,结果各种错误,功能都实现不了。 或者是否有其他方式避开这个问题?
|