stm32 и fatfs

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Ravor
Нашел транзистор. Понюхал.
Сообщения: 197
Зарегистрирован: Пн апр 25, 2016 15:43:23
Откуда: Россия , Воронеж

stm32 и fatfs

Сообщение Ravor »

Добрый день. Попробывал код для работы с файлами и возникла проблема. Считывание происходит нормально , но вот запись данных ппросто производит надругательство над файлом. Поелзные данные записывают в самый конец , а перед ними куча мусора.
Вложения
sd.rar
(390.89 КБ) 382 скачивания
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: stm32 и fatfs

Сообщение Myp3ik »

А в самом буфере данные располагаются нормально ?
Иван Сусанин - первый полупроводник :solder:
Ravor
Нашел транзистор. Понюхал.
Сообщения: 197
Зарегистрирован: Пн апр 25, 2016 15:43:23
Откуда: Россия , Воронеж

Re: stm32 и fatfs

Сообщение Ravor »

[uquote="Myp3ik",url="/forum/viewtopic.php?p=3325919#p3325919"]А в самом буфере данные располагаются нормально ?[/uquote]
Да , т.к. вывожу буффер на lcd дисплей и на нём все нормально.
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: stm32 и fatfs

Сообщение 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;
}
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Frogfot
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Re: stm32 и fatfs

Сообщение Frogfot »

Вот тут http://chipenable.ru/index.php/programm ... s-ch2.html хорошо разжёвано работа с Petit FatFs. Сам только разбираюсь.
Хорошему коту и в декабре - март :)
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: stm32 и fatfs

Сообщение 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);


Все норм, когда

Код: Выделить всё

uint8_t wtext[] = "123456789ABCDEF";

В примере выше генерируется hard fault.

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

Норм
Изображение

Не норм
Изображение

Почему генерируется HF и как мне записать больше 16ти байт в файл?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: stm32 и fatfs

Сообщение Chip115 »

В общем, продолжаю копать дальше. Не знаю, в правильном ли направлении двигаюсь.
Предположительно нашел место, где фэйлится содержимое регистра R3.

Вот дамп памяти нормальной программы.
Изображение

Вот программы курильщика
Изображение

Немного поясню то, что я понял. Адрес перехода в подпрограмму формируется в регистре R3.
Деббагер остановлен как раз на месте, где должен быть осуществлен переход по адресу, который находится в R3.

Код: Выделить всё

0x8002276   BLX   R3

Окончательно адрес перехода формируется предыдущей командой

Код: Выделить всё

LDR   R3, [R3, #0x10]

До этого момента, вроде бы, шло всё одинаково (если сравнивать работу программы рабочей и с ошибкой).
Если обратить внимание на дам, то я выделил адрес адрес перехода, куда, в конце концов, должна попасть программа. Это 0х80004327. В рабочей программе этот адрес находится по смещению 0x10, как и указано в инструкции выше.
Но в не рабочей программе этот адрес находится по другому смещению, но в дизассемблере смещение по-прежнему 0х10. В результате забирается адрес перехода 0х00000156. Программа пытается перейти по этому адресу, в результате чего генерируется Hard fault исключение.
По-хорошему, инструкция должна выглядеть так

Код: Выделить всё

LDR   R3, [R3, #0x0С]

Пока всё, что удалось нарыть по этой проблеме. Не знаю, на верном ли я пути. В общем, по-прежнему нуждаюсь в помощи.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: stm32 и fatfs

Сообщение 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
*/
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: stm32 и fatfs

Сообщение Chip115 »

Спасибо за ответ. У меня конфиг Byte-by-byte access
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
bezzabotna
Встал на лапы
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

Re: stm32 и fatfs

Сообщение bezzabotna »

Вы не пробовали увеличить размер стэка и кучи?
Я конечно все понимаю, но этого я не понимаю.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: stm32 и fatfs

Сообщение jcxz »

[uquote="Chip115",url="/forum/viewtopic.php?p=3418428#p3418428"]И снова здарсьте.
Пытаюсь развернуть FATFS на мегабитной SPI EEPROM.[/uquote]
Если не секрет: на кой сдалась FatFS на SPI EEPROM которая очевидно внутренняя и не вытаскивается из устройства?
Или предполагается, что пользователь может выпаять её из девайса, впаять в другой девайс, с целью - передать таким образом данные? :)))
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: stm32 и fatfs

Сообщение 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.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: stm32 и fatfs

Сообщение Chip115 »

Предполагается, что пользователь, при подключении устройства по USB, увидит флешку, размером 1/2 EEPROMa, куда можно будет дропнуть бинарник с прошивкой, и устройство перепрошьется при перезагрузке.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Ответить

Вернуться в «ARM»