Страница 1 из 1
stm32 и fatfs
Добавлено: Чт мар 08, 2018 11:31:27
Ravor
Добрый день. Попробывал код для работы с файлами и возникла проблема. Считывание происходит нормально , но вот запись данных ппросто производит надругательство над файлом. Поелзные данные записывают в самый конец , а перед ними куча мусора.
Re: stm32 и fatfs
Добавлено: Чт мар 08, 2018 14:44:55
Myp3ik
А в самом буфере данные располагаются нормально ?
Re: stm32 и fatfs
Добавлено: Чт мар 08, 2018 15:17:33
Ravor
[uquote="Myp3ik",url="/forum/viewtopic.php?p=3325919#p3325919"]А в самом буфере данные располагаются нормально ?[/uquote]
Да , т.к. вывожу буффер на lcd дисплей и на нём все нормально.
Re: stm32 и fatfs
Добавлено: Вс апр 01, 2018 08:51:50
Chip115
Всем привет!
Как я понял, надо прописать низкоуровневые функции:
Код: Выделить всё
DSTATUS disk_initialize (BYTE);
DSTATUS disk_status (BYTE);
DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE);
DRESULT disk_write(BYTE, const BYTE*, DWORD, BYTE);
DRESULT disk_ioctl (BYTE, BYTE, void*);
Столкнулся с проблемой непонимания как переписать функции.
Допустим, если взять функцию
Код: Выделить всё
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 */
)
как ее реализовать?
pdrv - можно игнорировать если я планирую работать только с SD картой?
buff - тут вроде понятно, указатель на буфер в 512 байт.
sector - это сектор для чтения. Я так понял, минимальный размер чтения/записи - 512 байт?
count - сколько секторов читаем. Допустим, реализована функция чтения одного сектора (512 байт)
Код: Выделить всё
SD_ReadSector(uint32_t BlockNumb,uint8_t *buff)
, то я должен ее вызвать count раз (передавая ей номер нужного сектора для чтения), но что будет с данными, которые будут читаться в buff? Они же будут затираться. Или же мне не стоит думать об этом и просто вызвать функцию SD_ReadSector, последовательно передавая ей, в качестве аргументов, сектора, которые должны читаться?
такая реализация функции работоспособна?
Код: Выделить всё
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 */
)
{
DRESULT res;
res = SD_ReadSector(sector, buff);
return res;
}
Re: stm32 и fatfs
Добавлено: Ср май 02, 2018 18:11:17
Frogfot
Вот тут
http://chipenable.ru/index.php/programm ... s-ch2.html хорошо разжёвано работа с Petit FatFs. Сам только разбираюсь.
Re: stm32 и fatfs
Добавлено: Чт июл 12, 2018 02:47:32
Chip115
И снова здарсьте.
Пытаюсь развернуть FATFS на мегабитной SPI EEPROM.
Столкнулся с проблемой вылета в hard fault при попытке записать данные в файл.
Изучение проблемы показало, что исключение срабатывает при условии, что я пытаюсь записать >= 16 символов (без учета конца строки) при вызове f_close
Камень STM32F103C8
EEPROM M95M01
Кусок кода, который записывает данные в файл
Код: Выделить всё
FATFS mynewdiskFatFs; /* File system object for User logical drive */
FIL MyFile; /* File object */
char mynewdiskPath[4]; /* User logical drive path */
UINT wbytes; /* File write counts */
uint8_t wtext[] = "1123456789ABCDEF"; /* File write buffer */
if(FATFS_LinkDriver(&USER_Driver, mynewdiskPath) == 0)
{
if(f_mount(&mynewdiskFatFs, (TCHAR const*)mynewdiskPath, 0) == FR_OK)
{
if (f_mkfs((TCHAR const*)mynewdiskPath,0,512) == FR_OK)
if(f_open(&MyFile, "STM32.TXT", FA_CREATE_ALWAYS | FA_WRITE) == FR_OK)
{
if(f_write(&MyFile, wtext, sizeof(wtext), &wbytes) == FR_OK);
{
if (f_close(&MyFile) != FR_OK)
while (1);
}
}
}
}
FATFS_UnLinkDriver(mynewdiskPath);
Все норм, когда
В примере выше генерируется hard fault.
Дальше глубже.
ВЫяснилось, что при ошибке портится значение регистра R3 и программа пытается вызвать функцию по не существующему адресу 0x156.
В общем, причину найти не смог. Вот скриншоты нормальной работы программы и не с ошибкой
Норм
Не норм
Почему генерируется HF и как мне записать больше 16ти байт в файл?
Re: stm32 и fatfs
Добавлено: Пт июл 13, 2018 04:28:00
Chip115
В общем, продолжаю копать дальше. Не знаю, в правильном ли направлении двигаюсь.
Предположительно нашел место, где фэйлится содержимое регистра R3.
Вот дамп памяти нормальной программы.
Вот программы курильщика
Немного поясню то, что я понял. Адрес перехода в подпрограмму формируется в регистре R3.
Деббагер остановлен как раз на месте, где должен быть осуществлен переход по адресу, который находится в R3.
Окончательно адрес перехода формируется предыдущей командой
До этого момента, вроде бы, шло всё одинаково (если сравнивать работу программы рабочей и с ошибкой).
Если обратить внимание на дам, то я выделил адрес адрес перехода, куда, в конце концов, должна попасть программа. Это 0х80004327. В рабочей программе этот адрес находится по смещению 0x10, как и указано в инструкции выше.
Но в не рабочей программе этот адрес находится по другому смещению, но в дизассемблере смещение по-прежнему 0х10. В результате забирается адрес перехода 0х00000156. Программа пытается перейти по этому адресу, в результате чего генерируется Hard fault исключение.
По-хорошему, инструкция должна выглядеть так
Пока всё, что удалось нарыть по этой проблеме. Не знаю, на верном ли я пути. В общем, по-прежнему нуждаюсь в помощи.
Re: stm32 и fatfs
Добавлено: Пт июл 13, 2018 07:44:56
dosikus
Chip115, чановские либы вылетали в хард фаулт в одном случае - в неправильной конфигурации индейцев, а именно
_WORD_ACCESS в файле конфигурации.
Там и табличкО имеется.
Код: Выделить всё
/*---------------------------------------------------------------------------/
/ System Configurations
/---------------------------------------------------------------------------*/
#define _WORD_ACCESS 0
/* The _WORD_ACCESS option is an only platform dependent option. It defines
/ which access method is used to the word data on the FAT volume.
/
/ 0: Byte-by-byte access. Always compatible with all platforms.
/ 1: Word access. Do not choose this unless under both the following conditions.
/
/ * Address misaligned memory access is always allowed for ALL instructions.
/ * Byte order on the memory is little-endian.
/
/ If it is the case, _WORD_ACCESS can also be set to 1 to improve performance and
/ reduce code size. Following table shows an example of some processor types.
/
/ ARM7TDMI 0 ColdFire 0 V850E 0
/ Cortex-M3 0 Z80 0/1 V850ES 0/1
/ Cortex-M0 0 RX600(LE) 0/1 TLCS-870 0/1
/ AVR 0/1 RX600(BE) 0 TLCS-900 0/1
/ AVR32 0 RL78 0 R32C 0
/ PIC18 0/1 SH-2 0 M16C 0/1
/ PIC24 0 H8S 0 MSP430 0
/ PIC32 0 H8/300H 0 x86 0/1
*/
Re: stm32 и fatfs
Добавлено: Пт июл 13, 2018 07:55:04
Chip115
Спасибо за ответ. У меня конфиг Byte-by-byte access
Re: stm32 и fatfs
Добавлено: Чт авг 09, 2018 15:33:04
bezzabotna
Вы не пробовали увеличить размер стэка и кучи?
Re: stm32 и fatfs
Добавлено: Пт сен 07, 2018 07:20:25
jcxz
[uquote="Chip115",url="/forum/viewtopic.php?p=3418428#p3418428"]И снова здарсьте.
Пытаюсь развернуть FATFS на мегабитной SPI EEPROM.[/uquote]
Если не секрет: на кой сдалась FatFS на
SPI EEPROM которая очевидно
внутренняя и не вытаскивается из устройства?
Или предполагается, что пользователь может выпаять её из девайса, впаять в другой девайс, с целью - передать таким образом данные?

Re: stm32 и fatfs
Добавлено: Сб сен 08, 2018 08:34:32
Oxford
[uquote="jcxz",url="/forum/viewtopic.php?p=3452140#p3452140"][uquote="Chip115",url="/forum/viewtopic.php?p=3418428#p3418428"]И снова здарсьте.
Пытаюсь развернуть FATFS на мегабитной SPI EEPROM.[/uquote]
Если не секрет: на кой сдалась FatFS на
SPI EEPROM которая очевидно
внутренняя и не вытаскивается из устройства?
Или предполагается, что пользователь может выпаять её из девайса, впаять в другой девайс, с целью - передать таким образом данные?

[/uquote]
Могу предположить что так он хочет упростить работу с EEPROM.
Re: stm32 и fatfs
Добавлено: Вс сен 23, 2018 04:18:01
Chip115
Предполагается, что пользователь, при подключении устройства по USB, увидит флешку, размером 1/2 EEPROMa, куда можно будет дропнуть бинарник с прошивкой, и устройство перепрошьется при перезагрузке.