Перейти к содержанию
    

stm32f103 и FAT32

Здравствуйте, Уважаемые коллеги.

 

Снова вынужден просить помощи.

Никак не получается прикрутить к stm32f103c8 файловую систему. Сама система FAT32 "обкатана" ещё на avr. Чтение сектора тоже функционирует верно.

 

Вот фрагмент кода:

SD_ReadSector(partition->firstSector, buffer);         //read the bpb sector
bpb = (struct BS_Structure *)buffer;

  }
  // загрузить информацию о диске
    var1 = buffer[13];          // для тестирования прочитать 13-й байт (=1)
//    var1 =  bpb->sectorPerCluster; // для тестирования прочитать 
  bytesPerSector      = bpb->bytesPerSector;
  sectorPerCluster    = bpb->sectorPerCluster;
  reservedSectorCount = bpb->reservedSectorCount;
..............................................................................

структура описана так:

//Структура для доступа к данным BootSector
struct BS_Structure{
unsigned char  jumpBoot[3];         //Ассемблерная команда перехода к загрузочному коду default: 0x009000EB
unsigned char  OEMName[8];          //Имя OEM в кодировке ASCII
unsigned short bytesPerSector;      //Количество байтов в секторе. deafault: 512
unsigned char  sectorPerCluster;    //Количество секторов в кластере 
unsigned short reservedSectorCount; //Размер зарезервированной области в секторах 
unsigned char  numberofFATs;        //Количество копий FAT. Обычно в системе хранятся две копии
unsigned short rootEntryCount;      //Максимальное количество файлов в корневом каталоге
unsigned short totalSectors_F16;    //16-разрядное количество секторов в файловой системе. Если количество секторов не может быть представлено 2-байтовой величиной, позднее в структуре данных следует альтернативное 4-байтовое поле (а 2-байтовое поле должно быть равно нулю)must be 0 for FAT32
unsigned char  mediaType;           //Тип носителя. Согласно документации Microsoft, для стационарных дисков используется значение 0xf8, а для съемных - 0xf0
unsigned short FATsize_F16;         //16-разрядный размер (в секторах) каждой копии FAT в FAT12 и FAT16. В FAT32 поле равно 0must be 0 for FAT32
unsigned short sectorsPerTrack;     //Количество секторов в дорожке   
unsigned short numberofHeads;       //Количество головок
unsigned long  hiddenSectors;       //Количество секторов перед началом раздела
unsigned long  totalSectors_F32;    //32-разрядное количество секторов в файловой системе. Либо это поле, либо 16-разрядное поле (19-20) должно быть равно 0
unsigned long  FATsize_F32;         //32-разрядный размер одной копии FAT (в секторах)
unsigned short extFlags;            //Режим обновления нескольких структур FAT. Если бит 7 равен 1, активна только одна копия FAT, индекс которой определяется разрядами 0-3. В противном случае все структуры FAT являются зеркальными копиями друг друга
unsigned short FSversion;           //Основной и дополнительный номер версии 0x0000 (defines version 0.0)
unsigned long  rootCluster;         //Кластер, в котором находится корневой каталог (=2)
unsigned short FSinfo;              //Сектор, в котором находится структура FSINFO (=1)
unsigned short BackupBootSector;    //Сектор, в котором находится резервная копия загрузочного сектора (по умолчанию 6)
unsigned char  reserved[12];        //Зарезервировано
unsigned char  driveNumber;         //Номер диска BIOS INT13h
unsigned char  reserved1;           //Не используется
unsigned char  bootSignature;       //Расширенная сигнатура, которая показывает, действительны ли следующие три значения. Сигнатура равна 0x29
unsigned long  volumeID;            //Серийный номер тома; в некоторых версиях Windows вычисляется на основании даты и времени создания
unsigned char  volumeLabel[11];     //Метка тома в кодировке ASCII. Выбирается пользователем при создании файловой системы "NO NAME "
unsigned char  fileSystemType[8];   //Метка типа файловой системы в кодировке ASCII  "FAT32"
unsigned char  bootData[420];       //Не используется
unsigned short bootEndSignature;    //Сигнатура (0xAA55)
};

 

Так вот, когда читаю buffer[13], то там 1, как и должно быть. А при попытке через структуру (bpb->sectorPerCluster), то получаю 194=0xc2.

Байт 0xc2 присутствует в секторе, но это buffer[14]. Т.е. как-то происходит смещение. Не могу понять как.....

 

Может быть получается какое-то выравнивание в структуре... типа по границе слова...

И ещё тест: при попытке прочитать так (bpb->sectorsPerTrack), реально считывается (bpb->hiddenSectors), которое находится дальше на 4 байта.

В структуре до этой позиции имеется 4 поля типа short, которые оказываются невыровнены. Так что похоже на результат выравнивания.

 

Как указать, чтобы выравнивания не было?

 

Компилятор Keil uVision 5.15.

 

Спасибо.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...