FAT File System چیست؟
بهصورت ساده فرضکنید یک حافظه فلش یا رم یا… در اختیار دارید و قراره از این حافظه جهت ذخیرهی اطلاعات استفادهکنید، بهعنوان یک مهندس الکترونیک میدونید که درحالتعادی میتونید یک بایت یا یک سکتور از اطلاعات را در هربار تغییر بدید. حالا فرضکنید این اطلاعات لازمه در دستهبندیهای مختلف مدیریت بشند و هربار بتونید اطلاعات جدیدی را به یک دسته اضافه یا حذفکنید و یا بتونید حتی دستهای را حذفنمایید. برای مدیریت چنین حافظههایی استانداردهایی وجود دارد که یکیاز معروفترین آنها استانداردهایی هست که مایکروسافت ایجادکرده و برخیاز اونها تحت عنوان FAT شناخته میشند، مانند FAT16 FAT32 و… در این ساختار دستهبندی اطلاعات تحتعنوان فایل ذخیره میشه و کلی قابلیت دیگه هم در ساختار FAT دیدهشده که بهمرور به ورژنهای بالاتر اضافه شدهاست.
درباره این آموزش – مقدمه
وقتی قراره پروژه الکترونیکی انجامبدید و قراره مثلا حافظه مموری کارت را به پروژتون اضافهکنید استفادهاز یک استاندارد مانند FAT در مدیریت ذخیرهسازی اطلاعات برروی حافظه میتونه محاسن زیادی را برای شما رقم٬بزنه مثلا بهراحتی میتونید اطلاعات را با سرعتبالا از کامپیوتر به حافظه و از حافظه به کامپیوتر انتقالبدید و همینطور میتونید مدیریت اطلاعاتتون را تحت یک استاندارد داشتهباشید. چندینسال پیش، آقایی بهنام Chang در وبسایت شخصیاش کتابخانهای برای FAT منتشرکرده که مخصوص میکروکنترلرهای با سرعت و رم پایین مثل AVR بوده و بسیار هم پرکاربرد بوده و هست. در این آموزش بهخوبی نحوهی شروعبهکار و استفادهاز این کتابخانه را آموزش میدیم و برای اینکار از شبیهساز پروتئوس استفاده میکنیم که مطمئنا میتونه بسیارمفید و کاربردی باشه.
دربارهی راهاندازی کتابخانه ff.h
این نوشته آموزشی صرفا برای آشنایی اولیه و راهاندازی کتابخانهی ff است و اصلاً بهعنوان یک راهنمای کامل و جامع قابلاستفاده نیست. برای اطلاعاتبیشتر باید به راهنمای کتابخانه که در سایت elm-chang.org مراجعهنمایید. در این پست آموزشی قرار است ما ضمن شبیهسازی برنامهی نوشتهشده در کدویژن با پروتئوس، حافظه مموری کارت را نیز با برنامه OSFMount که یک برنامهی رایگان هست شبیهسازی نماییم.
دربارهی کتابخانهها
این سایت منتشرکنندهی دو کتابخانهی ff و pff برای کار با سیستم فایل FAT است. کتابخانهی ff برای میکروکنترلرهایی مانند ATMega که حافظهی کافی دارند یا میکروکنترلرهای قویتر ساختهشده درحالیکه کتابخانه pff باکمی امکانات کمتر برای استفاده روی میکروکنترلرهای با حافظهی کمتر مانند ATTiny ساختهشدهاست. باتوجهبه مقدار حافظهای که نیاز داریم یکیاز این دو کتابخانه را استفاده میکنیم.
دربارهی نرمافزار و سختافزار
سیستمعامل مورداستفاده Windows 10 x64 Version 1703 Build 15063.540 است. مثال مطرحشده توسط برنامهی CodeVisionAVR 3.12 Advanced نوشته و کامپایل شدهاست. برای شبیهسازی نیز از نرمافزارهای Proteus 8.5 SP0 Build 22067 برای شبیهسازی منطق برنامه و دیدن خروجی و برنامهی OSFMount 1.5 Build 1015 for 64-Bit Windows برای ایجاد فضای شبیهسازی شدهی فایلسیستم FAT و اختصاص فضای شبیهسازی خام برای برنامهی Proteus استفادهشدهاست. لازمبهذکر است که در این پست مثال مطرحشده فقط نرمافزاری شبیهسازیشده است. برنامه از ۴قسمت تشکیلشده است که در ادامه معرفی میشوند:
- کتابخانههای مورداستفاده معرفی شدهاند تا از توابع موجود در آنها در برنامه استفادهکنیم.
- متغیرها و ساختارهای مورداستفاده که سعیشده نامگذاری آنها متناسب با کارکردشان باشد.
- وقفهی تایمر صفر که در بازههای زمانی کوتاه اقدامبه فراخوانی تابع disk_timeproc() میکند تا MemoryCard به حالت خواب نرود.
- باقی کدها برای اجرای برنامه
تنظیمات تایمر 0 هم به اینشکل انجام شدهاند.
یادتان باشد این تنظیمات برای شبیهسازی انجام شدهاند و برای واقعیت باید از روی راهنمای کتابخانه محاسبه را انجامدهید. زمان اجرای تابع disk_timeproc() را باید هر ۱۰میلیثانیه تنظیمکنید تا کارتحافظه فعال بماند. همچنین از منوی Project ==> Configure ==> C Compiler ==> Libraries ==> MMC/SD/SD HC Card تیک هر دو گزینهی موجود را بزنید و باقی تنظیمات رو مطابق عکس انجامدهید.
کدهای کامل برنامه هم در اتمام پست برای دانلود قرارگرفتهاست. مدار را مطابق شماتیکزیر در پروتئوس ببندید و تنظیمات قطعات را مطابق عکسهای زیر انجامدهید(حافظهی مموری کارت 1MB درنظرگرفته شدهاست تا فایلنهایی پروژه جهت آپلود کمحجم شود):
همچنین از منوی Project ==> Configure ==> C Compiler ==> Libraries ==> MMC/SD/SD HC Card تیک هر دو گزینهی موجود را بزنید و باقی تنظیمات رو مطابق عکس انجامدهید. کدهای کامل برنامه هم در ادامهی این مقاله و هم در ضمیمه آمدهاند. مدار را مطابق شماتیک زیر در پروتئوس ببندید و تنظیمات قطعات را مطابق عکسهای زیر انجام دهید (حافظهی مموری کارت 1MB درنظرگرفته شدهاست تا فایلنهایی پروژه جهت آپلود کمحجم شود):
بعداز اولین اجرای شبیهسازی Proteus پیامهای خطایی خواهد داد که بهدلیل نبودن فایلسیستم است! تصویر زیر را ببینید:
راهکار حلمشکل این است که یکبار بااستفادهاز برنامهی OSFMount فایل Image کارتحافظه که توسط پروتئوس ایجاد شدهاست را به ویندوز وصلکنیم تا بتوانیم آنرا به فرمت FAT تبدیلکنیم. ابتدا برنامهی OSFMount را اجراکنید و سپس از منوی File گزینهی Mount new virtual disk را بزنید تا پنجرهی روبرو بازشود. مطابقشکل مقادیر پنجره را تنظیمکنید و روی OK کلیککنید.
حالا باید فایل ما در ویندوز بهشکلزیر متصلشدهباشد:
همچنین درایور F نیز بهصورتزیر دیدهشود:
برای استفادهاز درایو و تبدیل آن به FAT روی آن کلیکراست کرده و گزینهی Format را انتخابکنید. سپس تنظیمات را باتوجهبه شکل انجامدهید و سپس عملیات فرمت را Start کنید. پیامهای هشدار را هم تأیید نمایید.
چون حجم درایو را 1MB درنظرگرفتیم، فقط میتوانیم از FAT12 استفادهکنیم؛ درحالیکه اگر حجم درایو را بیشتر میکردیم میتوانستیم FAT16 و FAT32 رو هم توی گزینهها ببینیم و با آنها فرمتکنیم. کار ما با درایو مجازی تمام شد!
به برنامه OSMount برگردید و روی دکمهی Dismount all & Exit کلیککنید. با اجرای برنامهی شبیهسازیشده در Proteus میبینید که ایندفعه برنامه بهخوبی کار میکند و تا انتها پیش میرود. با Mount مجدد فایل SDcard میتوانیم فایل ایجادشده در فایل سیستم را هم ببینیم.
کد نهایی
#include <mega32a.h> #include <alcd.h> #include <ff.h> #include <delay.h> unsigned char buffer[16]; FRESULT res; unsigned int nbytes; FATFS drive; FIL file; char path[] = "0:/url.txt"; char text[] = "http://chipkadeh.ir"; // Timer 0 overflow interrupt service routine // disk_teimerproc avoids MemoryCard sleep! interrupt[TIM0_OVF] void timer0_ovf_isr(void) { TCNT0 = 0x31; disk_timerproc(); } void main(void) { lcd_init(16); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 3.906 kHz // Mode: Normal top=0xFF // OC0 output: Disconnected // Timer Period: 52.992 ms TCCR0 = (0 << WGM00) | (0 << COM01) | (0 << COM00) | (0 << WGM01) | (1 << CS02) | (0 << CS01) | (0 << CS00); TCNT0 = 0x31; OCR0 = 0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK = (0 << OCIE2) | (0 << TOIE2) | (0 << TICIE1) | (0 << OCIE1A) | (0 << OCIE1B) | (0 << TOIE1) | (0 << OCIE0) | (1 << TOIE0); #asm("sei") DDRB.1 = 1; PORTB.1 = 0; /* ============================ Write to disk ============================*/ f_mount(0, &drive); // mount f_open(&file, "url.txt", FA_WRITE | FA_OPEN_ALWAYS | FA_OPEN_EXISTING); f_write(&file, text, sizeof(text) - 1, &nbytes); // sizeof()-1 means no "\r" // or "\n" character f_close(&file); f_mount(0, 0); // dismount /* ============================ Read from disk ===========================*/ if ((res = f_mount(0, &drive)) == FR_OK) lcd_putsf("FAT mounted = OK"); delay_ms(1000); lcd_clear(); if ((res = f_open(&file, path, FA_READ)) == FR_OK) lcd_putsf("File open: url.txt"); delay_ms(1000); lcd_clear(); if ((res = f_read(&file, buffer, 20, &nbytes)) == FR_OK) lcd_putsf("Reading Data"); delay_ms(1000); lcd_clear(); lcd_puts(buffer); delay_ms(1000); f_close(&file); while (1); }
دانلود فایلهای آموزشی موردنیاز
دانلود سورس پروتئوس و کدویژن: SD_Card-Virtualization.zip
منبع: سیسوگ