Я работаю над проектом, в котором мне нужно хранить данные AD C Stream на карте µSD. Однако даже если я использую 16-битный буфер, я теряю данные из потока AD C. Мой AD C используется с 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);
}
}
}
EDIT 2
Я изменил свою программу. Я установил для блока 1 и блока 2 длину BUFFERLENGTH и добавил указатель (* idx), чтобы изменить заполненный буфер. У меня больше нет HardFault_Handler, но я все еще теряю некоторые данные из потока моего объявления c. Вот внесенные мной изменения:
// 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);
}
}
}
Кто-нибудь знает, как решить мою проблему с этой потерей?
С уважением
Матье