STM, STM32, آموزش, معرفی, مقاله

آموزش میکروکنترلر STM32F4 قسمت 14 : سیستم فایل FatFs بر روی کارت SD

آموزش میکروکنترلر STM32F4

در قسمت سیزدهم آموزش میکروکنترلر STM32F4 به مبحث مهم و کاربردی تایمر ها و سرویس وقفه پرداختیم. در این قسمت از آموزش میکروکنترلر STM32F4  به مبحث سیستمِ فایلِ FatFs بر روی کارت SD می‌پردازیم. با سیسوگ همراه باشید.

 

سیستم فایل FatFs بر روی کارت SD

سیستم فایل، یعنی روشی که برای ذخیره فایل‌ها روی وسایل ذخیره ساز استفاده می‌شود. از مشهورترین و قدیمی‌ترین این سیستم‌ها، Fat می‌باشد. با استفاده از این سیستم فایل می‌توان فایل‌هایی که روی حافظه ذخیره کردید در دستگاه های دیگر، مانند رایانه شخصی، که از این سیستم فایل پشتیبانی می‌کنند، مشاهده کرد و تغییر داد. معروف‌ترین سیستم فایل ارائه شده برای سیستم‌های میکروکنترلری و تعبیه شده، توسط فردی به نام Chan نوشته شده است (elm-chan.org). این سیستم فایل، سیستم فایل FAT و exFAT برای سیستم‌های تعبیه شده می‌باشد. رایگان و متن باز است و بر اساس C نوشته شده است. در واقع  پشته‌ای نرم‌افزاری است که بین کاربر و سخت‌افزار قرار می‌گیرد تا کاربر از درگیر شدن با سخت‌افزار رها شود.

 

سیستم فایل FatFs بر روی کارت SD

 

 

رابط های این نرم افزار عبارتند از:

  • دسترسی به فایل
    • f_open – بازکردن یا ساختن یک فایل
    • f_close – بستن یک فایل باز
    • f_read – خواندن یک فایل
    • f_write – نوشتن داده
    • f_lseek – حرکت دادن اشاره گر خواندن/نوشتن، گسترش اندازه
    • f_truncate – بریدن اندازه
    • f_sync – تخلیه داده نگهداری شده (cache)
    • f_forward – پیش فرست داده به جریان
    • f_expand – اختصاص یک بلوک هم مرز به فایل
    • f_gets – خواندن یک رشته
    • f_putc – نوشتن یک کاراکتر
    • f_puts – نوشتن یک رشته
    • f_printf – نوشتن یک رشته قالب بندی شده
    • f_tell – گرفتن اشاره گر خواندن/نوشتن کنونی
    • f_eof – آزمودن پایان-فایل
    • f_size – گرفتن اندازه
    • f_error – آزمون یک خطا

 

  • دسترسی پوشه
    • f_opendir – باز کردن پوشه
    • f_closedir – بستن یک پوشه باز
    • f_readdir – خواندن یک پوشه
    • f_findfirST – باز کردن یک پوشه و خواندن اولین موردی که تطیبق می‌کند
    • f_findnext – خواندن مورد بعدی که تطبیق می‌کند

 

  • مدیرت فایل/پوشه
    • f_STat – بررسی وجود فایل یا زیرپوشه
    • f_unlink – حذف یک فایل یا زیرپوشه
    • f_rename – تغییر نام یا جابجا کردن یک فایل یا زیرپوشه
    • f_chmod – تغییر صفات یک فایل یا زیرپوشه
    • f_utime – تغییر مهر زمانی یک فایل یا زیرپوشه
    • f_mkdir – ساختن یک زیرپوشه
    • f_chdir – تغییر پوشه جاری
    • f_chdrive – تغییر درایو جاری
    • f_getcwd – بازیابی درایو یا پوشه جاری

 

  • مدیریت حجم
    • f_mount – ثبت یا حذف ناحیه کاری در حجم
    • f_mkfs – ساختن یک حجم FAT روی درایو منطقی
    • f_fdisk – ساختن درایو منطقی روی درایو فیزیکی
    • f_getfree – گرفتن اندازه کلی و اندازه آزاد روی حجم
    • f_getlabel – گرفتن برچسب حجم
    • f_setlabel – گذاشتن برچسب حجم

رابط کنترل وسیله

این دستورات جز FatFs محسوب نمی‌شود و درباره کار با دستگاه هستند. این دستورات برای دستگاه های مختلف پیاده سازی شده‌اند. همان طور که در شکل دیده می‌شود FatFs با رابطی به آن‌ها دسترسی دارد.

 

رابط FatFs

 

  • disk_STatus – گرفتن وضعیت دستگاه
  • disk_initialize – آغازسازی دستگاه
  • disk_read – خواندن برش (ها)
  • disk_write – نوشتن برش (ها)
  • disk_ioctl – کنترل تابع‌های مرتبط با دستگاه
  • get_fattime – گرفتن زمان جاری

قبل از استفاده از هر فایلی باید ابتدا یک ناحیه کاری (شی سیستم فایل) در درایو منطقی با دستور f_mount  ثبت شود. غیر از f_mkfs و f_fdisk  سایر تابع‌ها بعد از این فرایند آماده کار می‌شوند. عملیات باز کردن تابع باید قبل از جداکردن حافظه یا خاموش کردن دستگاه بسته شود وگرنه فایل خراب خواهد شد.

برای باز کردن چند فایل با هم باید به ترتیب زیر عمل کرد. اما باز کردن چندگانه یک فایل با پرچم‌های نوشتن متفاوت ممنوع است.

FatFs از باز کردن چندگانه یک فایل حمایت نمی‌کند مگر اینکه در حالت فقط خواندنی باشند. اگر یک فایل چندباره باز شود، تغییر نام یا پاک کردن آن مجاز نیست. تخطی از این دستورها ممکن است به خرابی فایل منجر شود. می توان از گزینه قفل کردن فایل _FS_LOCK استفاده کرد. با یک کردن این گزینه همه حالت های گفته شده بالا که منجر به خطا می‌شوند متوقف می‌شود و با پیغام FR_LOCKED پاسخ داده می‌شود. اگر تعداد فایل های باز از مقدار _FS_LOCK بیشتر باشد هر دستور جدیدی برای باز کردن یا ایجاد فایل جدید با پیام FR_TOO_MANY_OPEN_FILES رد می‌شود.

تعدادی از تابع های پشته FatFs

تابع f_open

یک file object درست می‌کند که برای دسترسی به فایل به کار می رود

 

 

که fp اشاره‌گر به فایل و path مسیر به رشته تهی-پایان است که اسم فایل را نشان می دهد. پرچم حالت می‌تواند یکی از مقدارهای جدول زیر باشد.

 

تابع f_open در پشته

 

مقدار خروجی این تابع نیز یکی از تعریف های زیر است:

 

 

در زیر دو مثال دیده می‌شود:

 

 

و این مثال:

 

 

تابع f_write

برای نوشتن داده‌ها روی فایل به کار می‌رود.

 

 

تابع f_lseek

هر بار که تابع با دستور f_open باز می‌شود یا تابع جدیدی ساخته می‌شود اشاره گر نوشتن/خواندن در ساختمان فایل که با میدان fptr نشان داده می‌شود مقدار صفر را دارد و عملیات خواندن/نوشتن از خانه بعد یعنی 1 شروع می‌شود. بنابراین اگر قصد داریم فایلی را به تدریج یا چند مرحله پر کنیم باید خودمان اشاره‌گر را به نقطه مورد نظر تنطیم کنیم. برای این کار می توان از تابع f_lseek استفاده کرد. این تابع اشاره‌گر را در نقطه مورد نظر در فایل برای نوشتن یا خواندن تنظیم می‌کند. برای افزایش طول فایل نیز می‌توان از آن استفاده کرد. ساختار آن به شکل زیر است.

 

 

fp اشاره‌گر به فایل است و ofs مقدار دویدگی (آفست) را از ابتدای فایل نشان می‌دهد. مقدار دویدگی یک آدرس مستعار است که می‌تواند واژه دوتایی (32 بیتی) یا چهارتایی (64 بیتی) باشد.

اگر فایلی حاوی عبارت hello باشد برای اینکه داده‌ای به انتهای آن اضافه کنیم باید اشاره‌گر را به عدد 5 تنظیم کنیم که با دستور نوشتن بعدی از خانه 6ام به بعد، نوشتن انجام شود. برای گرفتن مقدار این عدد در فایل ها می‌توان از تابع f_size استفاده کرد.

تابع f_readdir

این تابع محتویات یک پوشه را نشان می‌دهد. با هر بار فراخوانی آن اشاره‌گر ساختمان فایل بعدی درون پوشه باز می‌گردد. وقتی به انتهای فهرست فایل‌ها رسید، یک اشاره‌گر تهی بدون خطا باز می‌گرداند و دوباره به فایل اول می رود.

 

 

برنامه نمونه:

 

 

مسیر فایل

مسیر فایل در FatFs همانند داس/ویندوز می‌باشد.

 

 

نام مورد استفاده قالب 8.3 دارد (sfn) برای استفاده از نام‌های بلند باید _USE_LFN را تنظیم کرد. زیرپوشه‌ها را باید با / یا \ جدا کرد. جدا کننده‌ها ی جفت در نظر گرفته نمی‌شوند. درایو منظقی با یک عدد و یک دو نقطه نشان داده می‌شود برای مثال 2: درایو شماره 2 است. وقتی شماره درایو حذف شود درایو پیش فرض (درایو صفر یا درایو جاری)  در نظر گرفته می‌شود. کاراکترهای \0 و \x1f به عنوان پایان مسیر در نظر گرفته می‌شوند. در حالت LFN ، فاصله‌ها در نظر گرفته می‌شود ولی در حالت عادی، پایان مسیر در نظر گرفته می‌شود. برای مثال مسیر “test path” در حالت عادی “test” در نظر گرفته می‌شود. فاصله‌های انتهای خط و نقطه‌ها در نظر گرفته نمی‌شوند (در هر دو حالت)، در حالت پیش فرض (_FS_RPATH == 0), مفهوم درایو جاری وجود ندارد. همه اشیا در حجم همواره با مسیر کامل از پوشه ریشه توصیف می‌شوند. پوشه های «.» و«..» مجاز نیستند. جدا کننده های ابتدای مسیر در نظر گرفته نمی‌شوند. درایو پیش فرض نیز درایو صفر در نظر گرفته می‌شود. وقتی مسیرهای نسبی فعال شود (_FS_RPATH >= 1), مسیر بیان شده، از پوشه ریشه ادامه پیدا می‌کند، اگر یک جدا کننده اول مسیر موجود باشد وگرنه از پوشه جاری درایو که با f_chdir گذاشته شده است ادامه می‌یابد. نام‌های دارای نقطه هم برای مسیرها مجاز هستند. درایو پیش فرض درایو جاری است که توسط f_chdrive تعیین می‌شود.

 

مسیر فایل در FatFs

 

وقتی گزینه _STR_VOLUME_ID مشخص شده باشد می‌توان از رشته‌های از پیش تعیین شده به جای عددها برای شماره درایوها استفاده کرد مثلا “sd:file1.txt”, “ram:swapfile.dat”

 

مدیریت حجم

سیستمِ فایل، برای هر کدام از درایوهای منطقی (درایو ها می توانند به شکل فیزیکی متفاوت باشند) به file system object نیاز دارد که با دستور f_mount به FatFs اضافه یا حذف (unregister) می‌شود. این دستور سکتور بوت را می‌خواند و بررسی می‌کند که سکتور Fat با سکتور صفر SFD، پارتیشن ها در قالب FDISK باشد.

اگر گزینه مولتی پارتیشن  ( MULTI_PARTITION == 1 )  فعال باشد هر درایو منطقی به یک بخش روی درایو فیزیکی محدود است که در جدول مدیریت پارتیشن ها مشخص شده است. این جدول باید توسط کاربر مشخص شود تا ارتباط بین درایوهای منطقی و پارتیشن ها مشخص شود. برای مثال یک نمونه از این جدول در زیر دیده می‌شود:

 

 

در شکل زیر دو حالت دیده می‌شود. شکل سمت راست حالت چندبخشی را نشان می‌دهد. دو درایو فیزیکی صفر و یک موجودند که درایو صفر به سه بخش تقسیم شده است و در مجموع 4 درایو منطقی داریم.

 

مدیریت حجم در STM32F4

 

نکات

  • درایو فیزیکی که بیش از یک بخش دارد نباید جداشدنی باشد.
  • تغییر حافظه ها وقتی که یک عملیات سیستمی در حال انجام است مجاز نیست.
  • تنها چهار بخش ابتدایی می توان تعریف کرد. بخش های گسترش یافته نیز مجاز نیستند.
  • ویندوز اجازه چند حجم روی ذخیره ساز های جداشدنی نمی دهد. تنها اولین بخش شناخته خواهد شد.

در شکل زیر این پشته دیده می‌شود.

 

پشته در STM32F4

 

اگر سخت‌افزار جانبی پروتکل spi و یا i2c را پشتیبانی کند این کتابخانه به تنهایی کافی است ولی برای کار کردن با برخی از سخت‌افزارهای دیگر نیاز به تابع های میانی است. نمونه این دو در شکل چپ و راست به ترتیب دیده می‌شود.

 

پشته در STM32F4

 

 

در جدول زیر تابع‌های مورد نیاز بنا به کاربردهای خاص دیده می‌شود.

 

مدیریت حجم در STM32F4

 

برخی ویژگی‌های این سیستم فایل عبارتند از:

  • تا 10 حجم دیسک قابل استفاده است
  • اندازه حجم دیسک برابر 2 ترابایت با برش های 512بایتی
  • اندازه فایل تا 4 گیگابایت در fat و بی نهایت در exFat
  • اندازه برش ها می تواند 512،1024، 2048 و 4096 باشد.

 

بسته به اینکه از کدام ماژول‌های این کتابخانه استفاده کنید می‌توانید با تعریف‌هایی آن‌ها را انتخاب کنید.

 

مدیریت حجم در STM32F4

 

همه کدهای FAT نیاز به تابع واسط برای دسترسی به سخت افزار دارند بسته به اینکه از پروتکل spi استفاده شود یا sdio به باس تک بیته یا باس 4 بیته نیاز است. دست کم به سه تابع نیاز دارید. یکی که کارت و کنترلر را آغازسازی کند یکی که یک بلوک را (که معمولا 512 بایت است) به داخل ram بخواند و یکی که یک بلوک را از ram به داخل کارت بنویسد.

 

در قسمت پانزدهم آموزش میکروکنترلر STM32F4 به مبحث کار کردن با کارت SD در کتابخانه HAL خواهیم پرداخت. با سیسوگ همراه باشید.

 


انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.  همکاری با سیسوگ

 

نوشته های مشابه

14 دیدگاه در “آموزش میکروکنترلر STM32F4 قسمت 14 : سیستم فایل FatFs بر روی کارت SD

  1. Alirezaakhavanqome علیرضا گفت:

    سلام اقا لطفا سری اموزش بعدی بزارید شدیدا بهش احتیاج داریم اینو واقعا خواهش میکنم

    1. زئوس Zeus زئوس Zeus گفت:

      اجازه بدید – در حال بررسی هستیم ؛

  2. Avatar سعید گفت:

    سلام من تقریبا تمام مقالات سیسوگ را مطاله می کنم و عالین اما این مقاه خیلی خلاصه بود ای کاش کمی توضیحات بیشتری در مورد این موضوع می نوشتید یا حداقل یک مقدمه در مورد فایها اولش می نوشتید اما منتظر ادامه این مقاله بخصوص در مورد فایل نویسی و راه اندازی SD کارت هستیم باتشکر

    1. زئوس Zeus زئوس Zeus گفت:

      سلام ؛ خوب گاهی پیش میآد که مطالب نیاز به توضیح بیشتر داشته باشند ؛ سعی میکنیم اونا رو کامل کنیم.

  3. Avatar محسن عبدالهی گفت:

    با سلام
    ممنونم از آموزش بسیار خوبتون
    بنده با RTOS نتونستم SDIO رو راه اندازی کنم.
    یعنی mount می کنه ولی وقتی درون تست بخوایم یه فایل رو باز کنیم خیلی طول میکشه بعدش خطای دیسک میده
    ممنونم ازتون که مشکل رو شناسایی کنید

    1. زئوس Zeus زئوس Zeus گفت:

      خوب یعنی بدون سیستم عامل درست کار میکنه ؟
      ببینید سیستم عامل در واقع نمی تونه دخالتی توی کار کردن یا نکردن SDIO داشته باشه ؛ مگر این که روی کتابخونه خودتون Mutex یا semaphore رو فعال کرده باشید و درست مدیریتش نکرده باشید در اون صورت هم نباید خطای دیسک رو داشته باشید.
      بعد این که سورس رو شما نوشتید ما که نمیتونیم متوجه بشیم مشکل از کجاست – چرا که سورس شما رو ندیدیم 😐

  4. Avatar محمد گفت:

    مدتیست با سیسوگ آشنا شدم سایت از نظر محتوا بسیار عالیست دمتون گرم
    بیصبرانه منتظر قسمت 15 هستیم . مرسی

    1. N H N H گفت:

      ممنون از لطف شما دوست عزیز

    2. Alirezaakhavanqome علبرضا گفت:

      سلام اقا واقعا خسته نباشید و دست مریزاد هرچی بگم کم گفتم

      1. N H N H گفت:

        سلام ممنون از لطف شما دوست عزیز

  5. Avatar SARA گفت:

    سلام ممنون از سایت خوبتون.
    قسمت 15 کی بر روی سایت قرار میگیره؟ من شدیدا بهش نیاز دارم

    1. N H N H گفت:

      سلام دوست عزیز
      تا روز چهارشنبه مطمئنا منتشر میشه. ممنون از شکیبایی شما

      1. Avatar Sara گفت:

        ممنون از پاسختون
        میخواستم درخواست کنم اگر امکانش هست توضیحاتی هم در مورد ساخت پوشه و زیر پوشه در sd card و خواندن آنها توسط میکرو هم داده بشه

        1. زئوس Zeus زئوس Zeus گفت:

          سلام – خوب کار با پوشه خیلی ساده است مثل فایل ؛ به توابع مربوطه نگاه بندازید ؛ و البته توصیه میکنم که به سایت خود چان سر بزنید و مستندات اونجا رو مطالعه کنید
          اگر سوال خاصی دارید مطرح کنید تا حد توان سعی میکنیم که جوابگو باشیم

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *