Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32f103 и FAT32
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Ioann_II
Здравствуйте, Уважаемые коллеги.

Снова вынужден просить помощи.
Никак не получается прикрутить к 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.

Спасибо.
aaarrr
Цитата(Ioann_II @ Mar 23 2017, 17:33) *
Как указать, чтобы выравнивания не было?


__packed struct ...
Ioann_II
Спасибо - теперь всё получилось, запустил.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.