Поиск
Показаны результаты для тегов 'fatfs'.
-
stm32 Проблема с записью данных с АЦП на SD карту при помощи FATFS
PadenieShtanov опубликовал тема в STM
Приветствую, столкнулся с проблемой при записи данных с АЦП, посредством библиотеки FATFS на SD карту. Данные с АЦП формируются в массив, после чего последовательностью функций f_mount, f_open, f_write записываются на SD карту, однако иногда функция f_write возвращает результат FR_INVALID_OBJECT и запись прерывается. Копнув глубже увидел что такой статус появляется из за того, что функция HAL_SD_GetCardState возвращает странный статус HAL_SD_CARD_SENDING, который описан как sd card is sending operation information. Большего описания нигде не нашел. Проблема исчезает посредством увеличения делителя частоты тактирования SDIO, что в свою очередь значительно режет скорость передачи созданного файла с данными на пк посредством USB HS, с чем вроде можно и свыкнуться, но хотелось бы разобраться в чём причина. Возможно кто-то сталкивался с подобной проблемой и может помочь. -
Использую FatFS на картах памяти microSDHC. С картами памяти работаю на процессорах Freescale MK24 и NXP i.MX RT1050. Карты используются достаточно интенсивно (запись, чтение, удаление файлов) в нескольких потоках FreeRTOS одновременно. Через некоторое время работы таблица FAT ломается, один раз поймал, что 0-й блок затерт 0xFF. Пробовал убрать весь код, который вносит изменения в файловую систему (запись, удаление) (низкоуровневая функция записи блока на SD точно не вызывается), но со временем FAT все равно разрушается. Помогает только блокировка записи на уровне карты памяти.
-
FatFs: получить LFN имя файла зная SFN
Sergey_Aleksandrovi4 опубликовал тема в В помощь начинающему
Приветствую, форумчане. Ковыряюсь с библиотекой FatFs от ChaN'а. Есть набор файлов в директории диска. Получаю их список с помощью f_readdir(), кэширую в ОЗУ имена короткого (DOS) формата SFN. Контроллер с короткими именами и работает в дальнейшем, здесь проблем нет. Но для вывода на экран GUI нужно длинное имя LFN. Пытаюсь получить его используя функцию f_stat(), но обе строки в структуре FILINFO вопреки ожиданиям содержат короткие SFN имена. Код: FRESULT res; FILINFO file_info; printf("Open <Long filename 1.txt> "); res = f_stat("Dir1/Long filename 1.txt", &file_info); if (res == FR_OK) printf("OK"); else printf("Error!"); printf(".altname==%s", file_info.altname); printf(".fname==%s", file_info.fname); printf("Open <LONGFI~1.TXT> "); res = f_stat("Dir1/LONGFI~1.TXT", &file_info); if (res == FR_OK) printf("OK"); else printf("Error!"); printf(".altname==%s", file_info.altname); printf(".fname==%s", file_info.fname); Вывод: Использую последнюю (ff14) версию библиотеки. Пока придумал лишь одно решение "в лоб": всякий раз при необходимости получить LFN последовательно брать каждый элемент директории с помощью f_readdir() и сравнивать строки исходного SFN и поля FILINFO.altname. При числе файлов 100+ это будет чертовски долго. Два вопроса: 1. Как всё-таки получить LFN строку имея в наличии SFN. 2. Мой подход к сортировке файлов концептуально верен или перемудрил? -
Добрый день. Проблема такая. Использую SD-карту по SPI (SDIO нет и не будет), перевожу её в High Speed mode, всё успешно: статус-регистры возвращаются как надо. Тактовая частота карты: 48 МГц. Прикрутил Fat FS ревизия 87030. Файлы видятся, работает чтение. Но скорость чтения данных с файлов не радует. 6 файлов общим объёмом 10 МБ читаются в течение 5,5 секунд. SD карты 4-го и 10-го класса скоростей на ёмкость 16 ГБ. Для чтения применяю мульти-секторную команду чтения (Read Begin, Read Data, Read End). Пробовал закешировать первый мегабайт (начальные сектора карты) - не помогает, видать файлы находятся дальше. Читаю с помощью fread() Какие есть пути (программные) повышения скорости чтения данных файлов? Нужно именно быстрое чтение данных, запись вообще не треуется.
-
Добрый день! Процессор stm32f407vg. На нём запущена FREERTOS. stm общается с SDcard по SDIO с прерываниями от DMA. Без ОС - инициализация, запись, чтение работают. Вопрос по поводу приоритетов прерываний. Обработчики прерываний имеют вид: void SDIO_IRQHandler(void) { portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; SD_ProcessIRQSrc(); xSemaphoreGiveFromISR( c_xSemaphore_SDIO_IRQHandler, &xHigherPriorityTaskWoken ); if( xHigherPriorityTaskWoken != pdFALSE ){ portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); } } void SD_SDIO_DMA_IRQHANDLER(void) { portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; SD_ProcessDMAIRQ(); xSemaphoreGiveFromISR( c_xSemaphore_SD_SDIO_DMA_IRQHANDLER, &xHigherPriorityTaskWoken ); if( xHigherPriorityTaskWoken != pdFALSE ) { portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); } } В функции SD_ReadMultiBlocksFIXED .... xSemaphoreGive( c_xSemaphore_SDIO_IRQHandler); xSemaphoreGive( c_xSemaphore_SD_SDIO_DMA_IRQHANDLER); SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE); SDIO_DMACmd(ENABLE); SD_LowLevel_DMA_RxConfig((uint32_t *)readbuff, (NumberOfBlocks * BlockSize)); while (xSemaphoreTake( c_xSemaphore_SDIO_IRQHandler, cardBLOCK_TIME_WAITING)==pdFALSE); while (xSemaphoreTake( c_xSemaphore_SD_SDIO_DMA_IRQHANDLER, cardBLOCK_TIME_WAITING)==pdFALSE); .... и в функции SD_WriteMultiBlocksFIXED ... SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE); SDIO_DMACmd(ENABLE); SD_LowLevel_DMA_TxConfig((uint32_t *)writebuff, (NumberOfBlocks * BlockSize)); while (xSemaphoreTake( c_xSemaphore_SD_SDIO_DMA_IRQHANDLER, cardBLOCK_TIME_WAITING)==pdFALSE); ... Настройка прерываний: void Init_NVIC(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 12; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = SD_SDIO_DMA_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 13; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 14; NVIC_Init(&NVIC_InitStructure); } Если NVIC_IRQChannelPreemptionPriority для SDIO и SDIO_DMA поставить 12 и 13, то программа зацикливается в ожидании while ((DMAEndOfTransfer == 0x00) && (TransferEnd == 0) && (TransferError == SD_OK) && (timeout > 0)) { timeout--; } в функции SD_WaitReadOperation(). Задача, для записи данных на карту void vTaskSendSD(void *pvParameters) { volatile UINT BytesWritten; portBASE_TYPE xStatus; uint8_t ps; for (;;) { xQueueReceive(xQueue, &ps, portMAX_DELAY); if(cSDclose < 500){//250 res = f_lseek(&fil, fil.fsize); if(ps) res = f_write(&fil, buf_2, 4096, &BytesWritten); else res = f_write(&fil, buf_1, 4096, &BytesWritten); f_sync(&fil); cSDclose++; }else{ f_close(&fil); f_mount(0, NULL); } } } Каждый из массивов buf заполняется в течении 2.7 сек. Если поставить приоритеты NVIC_IRQChannelPreemptionPriority для SDIO и SDIO_DMA поставить 4 и 5 и убрать семафоры из обработчиков прерываний - проект работает, но нестабильно. Данные на SDcard могут записываться без сбоев длительное время, а может записаться 4 кБайта и всё. В чём может быть проблема, кто сталкивался? Спасибо.
- 1 ответ
-
- stm32f407vg
- freertos
-
(и ещё 1 )
C тегом: