0

我正在做一个项目,我必须将 ADC 流的数据存储在 µSD 卡上。但是,即使我使用 16 位缓冲区,我也会丢失 ADC 流中的数据。我的 ADC 与 DMA 一起使用,我使用 FATFS(不带 DMA)和 SDMMC1 外设来用数据填充 .bin 文件。

您有避免这种损失的想法吗?

这是我的项目:https ://github.com/mathieuchene/STM32H743ZI

我在他们的最新版本中使用了 nucleo-h743zi2 Board、CubeIDE 和 CubeMx。

编辑 1

我尝试实施 Colin 的解决方案,它更好,但我在收购过程中遇到了一件奇怪的事情。但是,当我增加最大计数值或尝试调试时,会出现 HardFault_Handler。我修改了 main.c 文件,创建了 2 个块uint16_t blockX[BUFFERLENGTH/2](我还像这样更改了 main 函数中的 while(1) 部分

    if (flagHlfCplt){
          //flagCplt=0;
          res = f_write(&SDFile, block1, strlen((char*)block1), (void *)&byteswritten);
          memcpy(block2, adcBuffer, BUFFERLENGTH/2);
          flagHlfCplt = 0;
          count++;
      }
      if (flagCplt){
          //flagHlfCplt=0;
          res = f_write(&SDFile, block2, strlen((char*)block2), (void *)&byteswritten);
          memcpy(block1, adcBuffer[(BUFFERLENGTH/2)-1], BUFFERLENGTH/2);
          flagCplt = 0;
          count++;
          }

      if (count == 10){
          f_close(&SDFile);
          HAL_ADC_Stop_DMA(&hadc1);
          while(1){
              HAL_GPIO_TogglePin(LD1_GPIO_Port, LD1_Pin);
              HAL_Delay(1000);
          }
      }
  }

编辑 2

我修改了我的程序。我将块 1 和块 2 的长度设置为 BUFFERLENGTH,并添加了一个指针 (*idx) 来更改已填充的缓冲区。我不再有 HardFault_Handler 但我仍然从我的 adc 流中丢失了一些数据。这是我所做的修改:

// my pointer and buffers
uint16_t  block1[BUFFERLENGTH], block2[BUFFERLENGTH], *idx;
// init of pointer and adc start
idx=block1;
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)idx, BUFFERLENGTH);
// while(1) part
while (1)
  {
      if (flagCplt){
        if (flagToChangeBuffer) {
            idx=block1;
            res = f_write(&SDFile, block2, strlen((char*)block2), (void *)&byteswritten);
            flagCplt = 0;
            flagToChangeBuffer=0;
            count++;
        }
        else {
            idx=block2;
            res = f_write(&SDFile, block1, strlen((char*)block1), (void *)&byteswritten);
            flagCplt = 0;
            flagToChangeBuffer=1;
            count++;
        }
      }

      if (count == 150){
          f_close(&SDFile);
          HAL_ADC_Stop_DMA(&hadc1);
          while(1){
              HAL_GPIO_TogglePin(LD1_GPIO_Port, LD1_Pin);
              HAL_Delay(1000);
          }
      }
  }

有人知道如何用这些损失解决我的问题吗?

此致

马修

4

0 回答 0