отладка в оперативной памяти (из 64кб - 40кб под прошивку 24кб оставшаяся оперативная память)
Создал проект с тремя основными функциями - инициализация SDHC (предполагается работа только с одной картой), чтение N секторов в буфер начиная со стартового адреса,
запись N секторов из буфера начиная со стартового адреса, проверял на буферах размером до 8 секторов, всё надежно работает.
Пытаюсь подключить библиотеку, нужно написать функцию disk_read:
СпойлерDRESULT disk_read ( BYTE pdrv, /* Physical drive nmuber to identify the drive */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Start sector in LBA */ UINT count /* Number of sectors to read */ ) { ////////////////////////////////////////////////////////////////////////// if(0 == spi_SD_Read_Block(buff, sector, uint8_t (count))) {return RES_OK;} else {return RES_ERROR;} ////////////////////////////////////////////////////////////////////////// }
получаю ошибку:
Цитата:
fatfs/diskio.cpp(159): error: no matching function for call to 'spi_SD_Read_Block'
моя функция:
Спойлерunsigned char spi_SD_Read_Block (char* bf, uint32_t SD_adr, uint8_t adr_count) //чтение секторов из SD карты { ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// unsigned char result; long int cnt = 0; //******************************************************************************************************************* for(uint8_t i=0; i < adr_count; i++) { SD_adr = SD_adr+i; unsigned char SD_adr_0 = SD_adr; //разбивка адреса uint32_t на 4 байта unsigned char SD_adr_1 = SD_adr >> 8; unsigned char SD_adr_2 = SD_adr >> 16; unsigned char SD_adr_3 = SD_adr >> 24; //---------- first_ACMD17 = spi_WaitReady(); if(first_ACMD17 == waiting) {return 1;} //превышено время ожидания spi_SD_cmd (0x51, SD_adr_3, SD_adr_2, SD_adr_1, SD_adr_0, 0x95); //CMD17 даташит стр 50 и 96 cnt=0; do { result=spi_SendRecvByte(0xFF); cnt++; } while ((result!=0x00) && (cnt < waiting)); after_ACMD17 = cnt; if (cnt == waiting) return 2; //превышено время ожидания spi_SendRecvByte(0xFF); cnt=0; do //Ждем начала блока { result=spi_SendRecvByte(0xFF); cnt++; } while ((result!=0xFE) && (cnt < waiting)); first_read = cnt; if (cnt == waiting) return 3; for (cnt=0;cnt<512;cnt++) bf[cnt+(512*i)]=spi_SendRecvByte(0xFF); //получаем байты блока из шины в буфер spi_SendRecvByte(0xFF); //Получаем контрольную сумму spi_SendRecvByte(0xFF); } return 0; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// }
Заголовок сообщения: Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC
Добавлено: Вс фев 24, 2019 10:29:00
Модератор
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Чудеса... У Вас ошибка, судя по содержимому её теста, связана не с указателем, а с невозможностью компилятору найти реализацию функции spi_SD_Read_Block.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
С буфером вопрос решился - я что то думал что unsigned char и просто char в данном случае одно и тоже, а это не так. Остальные вопросы в силе, (скоро новые возникнут).
Добавлено after 6 hours 45 minutes 21 second: Новые вопросы:
Есть некоторые успехи, в этой тестовой функции: Спойлерvoid ff_test(void) { ////////////////////////////////////////////////////////////////////////////////////////////// FATFS fs; FRESULT res; sprintf(lines[0],"Ready!"); //UART_Printf("Ready!\r\n");
res = f_close(&msgFile); if(res != FR_OK) { //UART_Printf("f_close() failed, res = %d\r\n", res); return; }
// Unmount res = f_mount(NULL, "", 0); if(res != FR_OK) { //UART_Printf("Unmount failed, res = %d\r\n", res); return; }
//UART_Printf("Done!\r\n"); }
все функции до f_close нормально работают (как минимум возвращают 0, а не код ошибки, и делают ожидаемые вещи), а вот f_close возвращает 1, почему такое может быть?
Нужно ли настраивать таймер на 10ms и вызывать в нём disk_timerproc (я вообще не нашёл такой функции в FatFs)?
Каким образом и где FatFs создаёт буферы для чтения и записи сектров, указатели которых передаются в функции disk_write и disk_read, если они создаются динамически, можно ли их заставить создаваться в стеке без потери функциональности библиотеки?
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Уточнение, перераспределение памяти для отладки в RAM - 44кб под прошивку 20кб оставшаяся оперативная память память.
Сейчас появилась такая проблема, в fileWork.cpp в функции ff_test есть строка:
res = f_open(&logFile, "log.txt", FA_OPEN_APPEND | FA_WRITE);
если выходить из функции до неё, то всо нормально, выполнение этой строки, в какой то момент(не пойму что я сделал), начало приводить к зависанию МК, до этого проблема была только с f_close (код ошибки 1), и ведь строки в log.txt успешно добавлялись!
Карта подключена к J10 (схема в проекте), к J2 подключен экран 20x4, lines[NumLines][20] массив для хранения строк отладочного экрана строки крутятся энкодером, пробовал подавать питание на J1 убирая перемычку J4, на проблему это не повлияло.
Добавлено after 8 hours 17 minutes 12 seconds: Нашёл ошибку, в функции чтения и записи секторов (spi_SD_Write_Block и spi_SD_Read_Block) они корректно работали только при чтении одного сектора, иначе адрес котцался, так правильно:
Добавлено after 5 hours 9 minutes 30 seconds: Новый вопрос, при каком минимальном количестве оперативной памяти в микроконтроллере у вас нормально работал FatFs не урезанный (с поддержкой длинных имён и юникодом c русской кодовой страницей)?
структуры у вас лезут не сами куда-то, а вы их помещаете либо в области глобальных переменных, либо в "куче", либо в области локальных переменных - а вот это ничто иное, как стек. если у вас структура определена внутри функции, как локальная, она попадет в стек - и это естественно.
FatFS от Чена в минимально-приемлемой конфигурации (чтение одного и запись другого файла) вполне неплохо обходится чуть более, чем килобайтом памяти. кстати, у него на сайте о требоаниях к ОЗУ все расписано весьма подробно и детально по всем возможностям...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 36
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения