stm32 и fatfs
-
Ravor
- Нашел транзистор. Понюхал.
- Сообщения: 197
- Зарегистрирован: Пн апр 25, 2016 15:43:23
- Откуда: Россия , Воронеж
stm32 и fatfs
Добрый день. Попробывал код для работы с файлами и возникла проблема. Считывание происходит нормально , но вот запись данных ппросто производит надругательство над файлом. Поелзные данные записывают в самый конец , а перед ними куча мусора.
- Вложения
-
- sd.rar
- (390.89 КБ) 382 скачивания
Re: stm32 и fatfs
А в самом буфере данные располагаются нормально ?
Иван Сусанин - первый полупроводник 
-
Ravor
- Нашел транзистор. Понюхал.
- Сообщения: 197
- Зарегистрирован: Пн апр 25, 2016 15:43:23
- Откуда: Россия , Воронеж
Re: stm32 и fatfs
[uquote="Myp3ik",url="/forum/viewtopic.php?p=3325919#p3325919"]А в самом буфере данные располагаются нормально ?[/uquote]
Да , т.к. вывожу буффер на lcd дисплей и на нём все нормально.
Да , т.к. вывожу буффер на lcd дисплей и на нём все нормально.
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: stm32 и fatfs
Всем привет!
Как я понял, надо прописать низкоуровневые функции:
Столкнулся с проблемой непонимания как переписать функции.
Допустим, если взять функцию
как ее реализовать?
pdrv - можно игнорировать если я планирую работать только с SD картой?
buff - тут вроде понятно, указатель на буфер в 512 байт.
sector - это сектор для чтения. Я так понял, минимальный размер чтения/записи - 512 байт?
count - сколько секторов читаем. Допустим, реализована функция чтения одного сектора (512 байт), то я должен ее вызвать count раз (передавая ей номер нужного сектора для чтения), но что будет с данными, которые будут читаться в buff? Они же будут затираться. Или же мне не стоит думать об этом и просто вызвать функцию SD_ReadSector, последовательно передавая ей, в качестве аргументов, сектора, которые должны читаться?
такая реализация функции работоспособна?
Как я понял, надо прописать низкоуровневые функции:
Код: Выделить всё
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)такая реализация функции работоспособна?
Код: Выделить всё
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;
}Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн
-
Frogfot
- Мучитель микросхем
- Сообщения: 443
- Зарегистрирован: Ср окт 19, 2011 08:48:27
- Откуда: Мать городов русских
Re: stm32 и fatfs
Вот тут http://chipenable.ru/index.php/programm ... s-ch2.html хорошо разжёвано работа с Petit FatFs. Сам только разбираюсь.
Хорошему коту и в декабре - март 
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: stm32 и fatfs
И снова здарсьте.
Пытаюсь развернуть FATFS на мегабитной SPI EEPROM.
Столкнулся с проблемой вылета в hard fault при попытке записать данные в файл.
Изучение проблемы показало, что исключение срабатывает при условии, что я пытаюсь записать >= 16 символов (без учета конца строки) при вызове f_close
Камень STM32F103C8
EEPROM M95M01
Кусок кода, который записывает данные в файл
Все норм, когда
В примере выше генерируется hard fault.
Дальше глубже.
ВЫяснилось, что при ошибке портится значение регистра R3 и программа пытается вызвать функцию по не существующему адресу 0x156.
В общем, причину найти не смог. Вот скриншоты нормальной работы программы и не с ошибкой
Норм

Не норм

Почему генерируется HF и как мне записать больше 16ти байт в файл?
Пытаюсь развернуть 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);
Все норм, когда
Код: Выделить всё
uint8_t wtext[] = "123456789ABCDEF";В примере выше генерируется hard fault.
Дальше глубже.
ВЫяснилось, что при ошибке портится значение регистра R3 и программа пытается вызвать функцию по не существующему адресу 0x156.
В общем, причину найти не смог. Вот скриншоты нормальной работы программы и не с ошибкой
Норм
Не норм
Почему генерируется HF и как мне записать больше 16ти байт в файл?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: stm32 и fatfs
В общем, продолжаю копать дальше. Не знаю, в правильном ли направлении двигаюсь.
Предположительно нашел место, где фэйлится содержимое регистра R3.
Вот дамп памяти нормальной программы.

Вот программы курильщика

Немного поясню то, что я понял. Адрес перехода в подпрограмму формируется в регистре R3.
Деббагер остановлен как раз на месте, где должен быть осуществлен переход по адресу, который находится в R3.
Окончательно адрес перехода формируется предыдущей командой
До этого момента, вроде бы, шло всё одинаково (если сравнивать работу программы рабочей и с ошибкой).
Если обратить внимание на дам, то я выделил адрес адрес перехода, куда, в конце концов, должна попасть программа. Это 0х80004327. В рабочей программе этот адрес находится по смещению 0x10, как и указано в инструкции выше.
Но в не рабочей программе этот адрес находится по другому смещению, но в дизассемблере смещение по-прежнему 0х10. В результате забирается адрес перехода 0х00000156. Программа пытается перейти по этому адресу, в результате чего генерируется Hard fault исключение.
По-хорошему, инструкция должна выглядеть так
Пока всё, что удалось нарыть по этой проблеме. Не знаю, на верном ли я пути. В общем, по-прежнему нуждаюсь в помощи.
Предположительно нашел место, где фэйлится содержимое регистра R3.
Вот дамп памяти нормальной программы.
Вот программы курильщика
Немного поясню то, что я понял. Адрес перехода в подпрограмму формируется в регистре R3.
Деббагер остановлен как раз на месте, где должен быть осуществлен переход по адресу, который находится в R3.
Код: Выделить всё
0x8002276 BLX R3Окончательно адрес перехода формируется предыдущей командой
Код: Выделить всё
LDR R3, [R3, #0x10]До этого момента, вроде бы, шло всё одинаково (если сравнивать работу программы рабочей и с ошибкой).
Если обратить внимание на дам, то я выделил адрес адрес перехода, куда, в конце концов, должна попасть программа. Это 0х80004327. В рабочей программе этот адрес находится по смещению 0x10, как и указано в инструкции выше.
Но в не рабочей программе этот адрес находится по другому смещению, но в дизассемблере смещение по-прежнему 0х10. В результате забирается адрес перехода 0х00000156. Программа пытается перейти по этому адресу, в результате чего генерируется Hard fault исключение.
По-хорошему, инструкция должна выглядеть так
Код: Выделить всё
LDR R3, [R3, #0x0С]Пока всё, что удалось нарыть по этой проблеме. Не знаю, на верном ли я пути. В общем, по-прежнему нуждаюсь в помощи.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн
Re: stm32 и fatfs
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
*/- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: stm32 и fatfs
Спасибо за ответ. У меня конфиг Byte-by-byte access
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн
- bezzabotna
- Встал на лапы
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Re: stm32 и fatfs
Вы не пробовали увеличить размер стэка и кучи?
Я конечно все понимаю, но этого я не понимаю.
Re: stm32 и fatfs
[uquote="Chip115",url="/forum/viewtopic.php?p=3418428#p3418428"]И снова здарсьте.
Пытаюсь развернуть FATFS на мегабитной SPI EEPROM.[/uquote]
Если не секрет: на кой сдалась FatFS на SPI EEPROM которая очевидно внутренняя и не вытаскивается из устройства?
Или предполагается, что пользователь может выпаять её из девайса, впаять в другой девайс, с целью - передать таким образом данные?
Пытаюсь развернуть FATFS на мегабитной SPI EEPROM.[/uquote]
Если не секрет: на кой сдалась FatFS на SPI EEPROM которая очевидно внутренняя и не вытаскивается из устройства?
Или предполагается, что пользователь может выпаять её из девайса, впаять в другой девайс, с целью - передать таким образом данные?
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: stm32 и fatfs
[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.
Пытаюсь развернуть FATFS на мегабитной SPI EEPROM.[/uquote]
Если не секрет: на кой сдалась FatFS на SPI EEPROM которая очевидно внутренняя и не вытаскивается из устройства?
Или предполагается, что пользователь может выпаять её из девайса, впаять в другой девайс, с целью - передать таким образом данные?
Могу предположить что так он хочет упростить работу с EEPROM.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: stm32 и fatfs
Предполагается, что пользователь, при подключении устройства по USB, увидит флешку, размером 1/2 EEPROMa, куда можно будет дропнуть бинарник с прошивкой, и устройство перепрошьется при перезагрузке.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн