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 خواهیم پرداخت. با سیسوگ همراه باشید.  

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

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

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

دیدگاهتان را بنویسید

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

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

  1. سلام روز همگی بخیر. ببخشید من پست اموزشی رو با عنوان مبدل دیجیتال به آنالوگ توی لیست آموزش میکروکنترلر stm32 ندیدم, بخاطر همین اینجا سوالمو میپرسم.
    دوستان من با استفاده از ESP32 محصول شرکت espressif , فایل صوتی با فرمت mp3 رو از طریق یلوتوث دریافت یا از روی microSD خوندم! و از طریق رابط I2S به مبدل دیجیتال به آنالوگ pcm5102 فرستادم و خروجی خوبی دریافت کردم. ولی متاسفانه دیروز حواسم به ولتاژ منبع تغذیه نبود و ماژول pcm5102 سوخت متاسفانه. الان رفتم میبینم قیمتش آنچنان رفته بالا ک حقیقتا توان خرید این ماژول رو ندارم.
    الان میخواستم ببینم از میکروکنترلرهای stm32 میشه بجای این ماژول استفاده کنم؟ و اینکه اگر امکان پذیر هس چطور باید انجامش بدم؟
    لطفا دوستانی که تجربه ای دارن, کمکم کنن.
    ممنون

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

      سلام
      چرا از dac داخلی خود esp32 استفاده نمیکنید ؟ کیفیت خوبی هم داره
      https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/dac.html

      1. عصر بخیر… مبدل دیجیتال به آنالوگ داخلی esp32, هشت بیتی هستش. کیفیت مطلوب و خوبی نداره.
        شما با رابط i2s میکروکنترلرstm32 کار کردین؟

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

          ۸ بیت که به نظر کیفیت معقولی هست
          ولی به با i2s کار کردیم و به خوبی هم کار میکنه مشکل شما الان کجاست
          البته stm32 هم dac داخلی فکر کنم ده بیتی یا ۱۲ بیتی هم داره.

  2. mohammad گفت:

    سلام
    خسته نباشید
    اگه بخوایم “یک” فایل با حجم بیشتر از 4 گیگابایت داشته باشیم، از فرمت fat32 نمیشه استفاده کرد، باید از exfat استفاده کرد
    ولی من نمونه کدی پیدا نکردم که توش روی sd card و با این فرمت، فایلی ساخته باشن…
    در واقع همه جا اومدن از متغیرای FIL استفاده کردن که f_sizeش یه عدد 32 بیتیه (همون 4 گیگ)
    به جز این مجموعه دستورات، دستورای دیگه نیست برای فرمت exfat؟

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

      سلام دوست عزیز
      خوب مورد شما یه مورد خاصه :)‌تا حالا برای خودم پیش نیامده که چنین حجمی رو لازم داشته باشم
      ولی شما میتونید از کتابخانه ELM-CHAN استفاده کنید طبق گفت های خودش این کتابخونه قادره فایل سیستم exFAT رو پشتیبانی کنه و دقیقا اشاره کرده که میتونید فایل های حجیم بزرگتر از ۴G بسازید – لینک زیر رو مطالعه کنید
      http://elm-chan.org/docs/exfat_e.html

  3. محمد گفت:

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

    برای انتقال حجم زیاد داده 32 بیتی و با سرعت بالا به sdcard، لازمه انتقال توسط DMA و بصورت SDIO انجام بشه. ممنون میشم در ادامه آموزش ، به نحوه پیکر بندی صحیح cube برای DMA هم مطالبی اختصاص بدید و به تغییرات لازم و نکات مهم در پیکربندی و کد نویسی اشاره کنید. سعی خودم و منابع اینترنت بی نتیجه بود.

    باز هم ممنون

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

      سلام دوست عزیز
      خواهش میکنم نظر لطف شماست :))
      سعی میکنیم در لیست کاهامون قرار بدیم راه اندازی DMA رو
      البته لازمه اشاره کنم چون fat یه فرایند نرم افزاری است به شکل کامل نمیشه از قابلیت dma برای بالابردن سرعت استفاده کرد ولی خوب راه هایی هم هست که بشه به این مهم دست پیدا کرد.

  4. مرتضی خوشحال MORTEZA گفت:

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

    1. سلام ممنون از نظر لطفتون دوست عزیز… قسمت 15 این مجموعه هنوز منتشر نشده

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

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

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

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

  6. سعید گفت:

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

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

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

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

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

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

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

  8. محمد گفت:

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

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

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

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

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

  9. SARA گفت:

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

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

      1. Sara گفت:

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

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

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