Сохраняйте поток АЦП на карте µSD без потерь на STM32H743ZI

Я работаю над проектом, в котором мне нужно хранить данные потока ADC на карте µSD. Однако даже если я использую 16-битный буфер, я теряю данные из потока АЦП. Мой ADC используется с DMA, и я использую FATFS (БЕЗ DMA) и периферийное устройство SDMMC1 для заполнения файла.bin данными.

Есть ли у вас идея избежать этой потери?

Вот мой проект: https://github.com/mathieuchene/STM32H743ZI

Я использую плату Nucleo-h743zi2, CubeIDE и CubeMx в их последней версии.

ИЗМЕНИТЬ 1

Я попытался реализовать решение Колина, оно лучше, но у меня в процессе приобретения возникают странные вещи. Однако когда я увеличиваю максимальное значение счетчика или пытаюсь выполнить отладку, появляется HardFault_Handler. Я модифицировал файл main.c, создав 2 блока (uint16_t blockX[BUFFERLENGTH/2]) и 2 флага, когда adcBuffer наполовину или полностью заполнен. Я также изменил часть 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);
          }
      }
  }

Кто-нибудь знает, как решить мою проблему с этими потерями?

С наилучшими пожеланиями

Матье

0 ответов

Другие вопросы по тегам