Top.Mail.Ru
Уведомления
Очистить все

[Решено] STM32F4 ADC+TIM+SD

(@ruslan)
Level 1

Привет! Можете помочь с SD-картой на STM32F4? На SD я писать понял как, - взял пример microtechnics. Но вот не пойму почему у меня не работает это из прерываний... Я каждые 6 мкс попадаю в прерывания где оцифровываю сигнал и пытаюсь его записать на SD и так 4000000 раз.
В майне я создаю на SD файл:
FATFS fileSystem;
FIL testFile;
UINT testBytes;
FRESULT res;

if(f_mount(&fileSystem, SD_Path, 1) == FR_OK)
{
uint8_t path[13] = "testfile.txt";
path[12] = '';

res = f_open(&testFile, (char*)path, FA_WRITE | FA_CREATE_ALWAYS);
}
И открываю его, а потом в прерывании пытаюсь в него записать оцифрованные значения, и после 4000000 раз закрыть его.
if(t<4000000) //
{
ADC1->SR=0;
ADC1->CR2|=ADC_CR2_SWSTART;
UserData=ADC1->DR;
res = f_write(&testFile, UserData, 2, &testBytes);
}
else
{
res = f_close(&testFile);
}
Что я делаю не так? Я просто не когда раньше не работал с флешкой...

Цитата
Создатель темы Размещено : 20.06.2016 14:24
(@ivan)
Level 1

Так может лучше значения в буфер писать, а потом за один раз в файл. Возможно функция записи одного значения длится дольше 6 мкс, да и вообще, из прерывания лучше не вызывать функцию, генерирующую другое прерывание.

ОтветитьЦитата
Размещено : 21.06.2016 01:52
(@ivan)
Level 1

И переменная t какой тип имеет?

ОтветитьЦитата
Размещено : 21.06.2016 01:56
(@ruslan)
Level 1

Я сделал глобальную переменную pr;
Сделал вот так в прерывание:
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM2_IRQn 0 */

/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */

pr=1;

/* USER CODE END TIM2_IRQn 1 */
}
И в main.c
extern int pr;
int t=0;

while (1)
{
if (pr==1)
{
if(t<4000000) //
{
t++;
ADC1->SR=0;
ADC1->CR2|=ADC_CR2_SWSTART;
UserData=ADC1->DR;
array[0]=UserData >> 8;
array[1]=UserData;
res = f_write(&testFile, array, 2, &testBytes);
pr=0;
}
else
{
res = f_close(&testFile);
}
}
}

ОтветитьЦитата
Создатель темы Размещено : 21.06.2016 12:48
Поделиться: