در قسمت سیزدهم آموزش میکروکنترلر STM32F4 به مبحث مهم و کاربردی تایمر ها و سرویس وقفه پرداختیم. در این قسمت از آموزش میکروکنترلر STM32F4 به مبحث سیستمِ فایلِ FatFs بر روی کارت SD میپردازیم. با سیسوگ همراه باشید.
سیستم فایل FatFs بر روی کارت SD
سیستم فایل، یعنی روشی که برای ذخیره فایلها روی وسایل ذخیره ساز استفاده میشود. از مشهورترین و قدیمیترین این سیستمها، Fat میباشد. با استفاده از این سیستم فایل میتوان فایلهایی که روی حافظه ذخیره کردید در دستگاه های دیگر، مانند رایانه شخصی، که از این سیستم فایل پشتیبانی میکنند، مشاهده کرد و تغییر داد. معروفترین سیستم فایل ارائه شده برای سیستمهای میکروکنترلری و تعبیه شده، توسط فردی به نام Chan نوشته شده است (elm-chan.org). این سیستم فایل، سیستم فایل FAT و exFAT برای سیستمهای تعبیه شده میباشد. رایگان و متن باز است و بر اساس C نوشته شده است. در واقع پشتهای نرمافزاری است که بین کاربر و سختافزار قرار میگیرد تا کاربر از درگیر شدن با سختافزار رها شود.
رابط های این نرم افزار عبارتند از:
- دسترسی به فایل
- 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 با رابطی به آنها دسترسی دارد.
- 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 درست میکند که برای دسترسی به فایل به کار می رود
1 2 3 4 5 | FRESULT f_open ( FIL* fp, /* [OUT] Pointer to the file object STructure */ conST TCHAR* path, /* [IN] File name */ BYTE mode /* [IN] Mode flags */ ); |
که fp اشارهگر به فایل و path مسیر به رشته تهی-پایان است که اسم فایل را نشان می دهد. پرچم حالت میتواند یکی از مقدارهای جدول زیر باشد.
مقدار خروجی این تابع نیز یکی از تعریف های زیر است:
1 | FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_NO_FILE, FR_NO_PATH, FR_INVALID_NAME, FR_DENIED, FR_EXIST, FR_INVALID_OBJECT, FR_WRITE_PROTECTED, FR_INVALID_DRIVE, FR_NOT_ENABLED, FR_NO_FILESYSTEM, FR_TIMEOUT, FR_LOCKED, FR_NOT_ENOUGH_CORE, FR_TOO_MANY_OPEN_FILES |
در زیر دو مثال دیده میشود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /* Copy a file "file.bin" on the drive 1 to drive 0 */ int main (void) { FATFS fs[2]; /* Work area (file sySTem object) for logical drives */ FIL fsrc, fdST; /* File objects */ BYTE buffer[4096]; /* File copy buffer */ FRESULT fr; /* FatFs function common result code */ UINT br, bw; /* File read/write count */ /* RegiSTer work area for each logical drive */ f_mount(&fs[0], "0:", 0); f_mount(&fs[1], "1:", 0); /* Open source file on the drive 1 */ fr = f_open(&fsrc, "1:file.bin", FA_READ); if (fr) return (int)fr; /* Create deSTination file on the drive 0 */ fr = f_open(&fdST, "0:file.bin", FA_WRITE | FA_CREATE_ALWAYS); if (fr) return (int)fr; /* Copy source to deSTination */ for (;;) { fr = f_read(&fsrc, buffer, sizeof buffer, &br); /* Read a chunk of source file */ if (fr || br == 0) break; /* error or eof */ fr = f_write(&fdST, buffer, br, &bw); /* Write it to the deSTination file */ if (fr || bw < br) break; /* error or disk full */ } /* Close open files */ f_close(&fsrc); f_close(&fdST); /* UnregiSTer work area prior to discard it */ f_mount(NULL, "0:", 0); f_mount(NULL, "1:", 0); return (int)fr; } |
و این مثال:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* Read a text file and display it */ FATFS FatFs; /* Work area (file sySTem object) for logical drive */ int main (void) { FIL fil; /* File object */ char line[82]; /* Line buffer */ FRESULT fr; /* FatFs return code */ /* RegiSTer work area to the default drive */ f_mount(&FatFs, "", 0); /* Open a text file */ fr = f_open(&fil, "message.txt", FA_READ); if (fr) return (int)fr; /* Read all lines and display it */ while (f_gets(line, sizeof line, &fil)) printf(line); /* Close the file */ f_close(&fil); return 0; } |
تابع f_write
برای نوشتن دادهها روی فایل به کار میرود.
1 2 3 4 5 6 | FRESULT f_write ( FIL* fp, /* [IN] Pointer to the file object STructure */ conST void* buff, /* [IN] Pointer to the data to be written */ UINT btw, /* [IN] Number of bytes to write */ UINT* bw /* [OUT] Pointer to the variable to return number of bytes written */ ); |
تابع f_lseek
هر بار که تابع با دستور f_open باز میشود یا تابع جدیدی ساخته میشود اشاره گر نوشتن/خواندن در ساختمان فایل که با میدان fptr نشان داده میشود مقدار صفر را دارد و عملیات خواندن/نوشتن از خانه بعد یعنی 1 شروع میشود. بنابراین اگر قصد داریم فایلی را به تدریج یا چند مرحله پر کنیم باید خودمان اشارهگر را به نقطه مورد نظر تنطیم کنیم. برای این کار می توان از تابع f_lseek استفاده کرد. این تابع اشارهگر را در نقطه مورد نظر در فایل برای نوشتن یا خواندن تنظیم میکند. برای افزایش طول فایل نیز میتوان از آن استفاده کرد. ساختار آن به شکل زیر است.
1 2 3 4 | FRESULT f_lseek ( FIL* fp, /* [IN] File object */ FSIZE_t ofs /* [IN] File read/write pointer */ ); |
fp اشارهگر به فایل است و ofs مقدار دویدگی (آفست) را از ابتدای فایل نشان میدهد. مقدار دویدگی یک آدرس مستعار است که میتواند واژه دوتایی (32 بیتی) یا چهارتایی (64 بیتی) باشد.
اگر فایلی حاوی عبارت hello باشد برای اینکه دادهای به انتهای آن اضافه کنیم باید اشارهگر را به عدد 5 تنظیم کنیم که با دستور نوشتن بعدی از خانه 6ام به بعد، نوشتن انجام شود. برای گرفتن مقدار این عدد در فایل ها میتوان از تابع f_size استفاده کرد.
تابع f_readdir
این تابع محتویات یک پوشه را نشان میدهد. با هر بار فراخوانی آن اشارهگر ساختمان فایل بعدی درون پوشه باز میگردد. وقتی به انتهای فهرست فایلها رسید، یک اشارهگر تهی بدون خطا باز میگرداند و دوباره به فایل اول می رود.
1 2 3 4 | FRESULT f_readdir ( DIR* dp, /* [IN] Directory object */ FILINFO* fno /* [OUT] File information STructure */ ); |
برنامه نمونه:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | FRESULT scan_files ( char* path /* STart node to be scanned (***also used as work area***) */ ) { FRESULT res; DIR dir; UINT i; STatic FILINFO fno; res = f_opendir(&dir, path); /* Open the directory */ if (res == FR_OK) { for (;;) { res = f_readdir(&dir, &fno); /* Read a directory item */ /* Break on error or end of dir */ if (res != FR_OK || fno.fname[0] == 0) break; if (fno.fattrib & AM_DIR) { /* It is a directory */ i = STrlen(path); sprintf(&path[i], "/%s", fno.fname); res = scan_files(path); /* Enter the directory */ if (res != FR_OK) break; path[i] = 0; } else { /* It is a file. */ printf("%s/%s\n", path, fno.fname); } } f_closedir(&dir) } return res; } int main (void) { FATFS fs; FRESULT res; char buff[256]; res = f_mount(&fs, "", 1); if (res == FR_OK) { STrcpy(buff, "/"); res = scan_files(buff); } return res; } |
مسیر فایل
مسیر فایل در FatFs همانند داس/ویندوز میباشد.
1 | "[drive:][/]directory/file" |
نام مورد استفاده قالب 8.3 دارد (sfn) برای استفاده از نامهای بلند باید _USE_LFN را تنظیم کرد. زیرپوشهها را باید با / یا \ جدا کرد. جدا کنندهها ی جفت در نظر گرفته نمیشوند. درایو منظقی با یک عدد و یک دو نقطه نشان داده میشود برای مثال 2: درایو شماره 2 است. وقتی شماره درایو حذف شود درایو پیش فرض (درایو صفر یا درایو جاری) در نظر گرفته میشود. کاراکترهای \0 و \x1f به عنوان پایان مسیر در نظر گرفته میشوند. در حالت LFN ، فاصلهها در نظر گرفته میشود ولی در حالت عادی، پایان مسیر در نظر گرفته میشود. برای مثال مسیر “test path” در حالت عادی “test” در نظر گرفته میشود. فاصلههای انتهای خط و نقطهها در نظر گرفته نمیشوند (در هر دو حالت)، در حالت پیش فرض (_FS_RPATH == 0), مفهوم درایو جاری وجود ندارد. همه اشیا در حجم همواره با مسیر کامل از پوشه ریشه توصیف میشوند. پوشه های «.» و«..» مجاز نیستند. جدا کننده های ابتدای مسیر در نظر گرفته نمیشوند. درایو پیش فرض نیز درایو صفر در نظر گرفته میشود. وقتی مسیرهای نسبی فعال شود (_FS_RPATH >= 1), مسیر بیان شده، از پوشه ریشه ادامه پیدا میکند، اگر یک جدا کننده اول مسیر موجود باشد وگرنه از پوشه جاری درایو که با f_chdir گذاشته شده است ادامه مییابد. نامهای دارای نقطه هم برای مسیرها مجاز هستند. درایو پیش فرض درایو جاری است که توسط f_chdrive تعیین میشود.
وقتی گزینه _STR_VOLUME_ID مشخص شده باشد میتوان از رشتههای از پیش تعیین شده به جای عددها برای شماره درایوها استفاده کرد مثلا “sd:file1.txt”, “ram:swapfile.dat”
مدیریت حجم
سیستمِ فایل، برای هر کدام از درایوهای منطقی (درایو ها می توانند به شکل فیزیکی متفاوت باشند) به file system object نیاز دارد که با دستور f_mount به FatFs اضافه یا حذف (unregister) میشود. این دستور سکتور بوت را میخواند و بررسی میکند که سکتور Fat با سکتور صفر SFD، پارتیشن ها در قالب FDISK باشد.
اگر گزینه مولتی پارتیشن ( MULTI_PARTITION == 1 ) فعال باشد هر درایو منطقی به یک بخش روی درایو فیزیکی محدود است که در جدول مدیریت پارتیشن ها مشخص شده است. این جدول باید توسط کاربر مشخص شود تا ارتباط بین درایوهای منطقی و پارتیشن ها مشخص شود. برای مثال یک نمونه از این جدول در زیر دیده میشود:
1 2 3 4 5 6 7 8 9 | /*Example: Logical drive 0-2 are tied to three pri-partitions on the physical drive 0 (fixed drive) Logical drive 3 is tied to an FAT volume on the physical drive 1 (removable drive) */ PARTITION VolToPart[] = { {0, 1}, /* "0:" ==> Physical drive 0, 1ST partition */ {0, 2}, /* "1:" ==> Physical drive 0, 2nd partition */ {0, 3}, /* "2:" ==> Physical drive 0, 3rd partition */ {1, 0} /* "3:" ==> Physical drive 1, auto detection */ }; |
در شکل زیر دو حالت دیده میشود. شکل سمت راست حالت چندبخشی را نشان میدهد. دو درایو فیزیکی صفر و یک موجودند که درایو صفر به سه بخش تقسیم شده است و در مجموع 4 درایو منطقی داریم.
نکات
در شکل زیر این پشته دیده میشود.
اگر سختافزار جانبی پروتکل spi و یا i2c را پشتیبانی کند این کتابخانه به تنهایی کافی است ولی برای کار کردن با برخی از سختافزارهای دیگر نیاز به تابع های میانی است. نمونه این دو در شکل چپ و راست به ترتیب دیده میشود.
در جدول زیر تابعهای مورد نیاز بنا به کاربردهای خاص دیده میشود.
برخی ویژگیهای این سیستم فایل عبارتند از:
- تا 10 حجم دیسک قابل استفاده است
- اندازه حجم دیسک برابر 2 ترابایت با برش های 512بایتی
- اندازه فایل تا 4 گیگابایت در fat و بی نهایت در exFat
- اندازه برش ها می تواند 512،1024، 2048 و 4096 باشد.
بسته به اینکه از کدام ماژولهای این کتابخانه استفاده کنید میتوانید با تعریفهایی آنها را انتخاب کنید.
همه کدهای FAT نیاز به تابع واسط برای دسترسی به سخت افزار دارند بسته به اینکه از پروتکل spi استفاده شود یا sdio به باس تک بیته یا باس 4 بیته نیاز است. دست کم به سه تابع نیاز دارید. یکی که کارت و کنترلر را آغازسازی کند یکی که یک بلوک را (که معمولا 512 بایت است) به داخل ram بخواند و یکی که یک بلوک را از ram به داخل کارت بنویسد.
در قسمت پانزدهم آموزش میکروکنترلر STM32F4 به مبحث کار کردن با کارت SD در کتابخانه HAL خواهیم پرداخت. با سیسوگ همراه باشید.
من با فلش مموری کار میکنم و توابع همین هست
اما قسمت FA_OPEN_APPEND نداره.
و من توی فایل .txt میتونم بنویسم، اما خط بعد نمیره و فقط روی هم متن قبل مینویسه و … .
سلام وقت بخیر. ببخشید من سعی کردم میکرو اس دی کارت رو راه اندازی کنم و یه کدی رو براش تست کردم. در ابتدای برنامه به این صورت هست که حجم حافظه کل و حجم بخش خالی sd کارت با کمک uart و روی برنامه hercules نمایش داده بشه. sd کارت چند بار فرمت شده و حجمش رو خالی نشون میده ولی وقتی برنامه اجرا میشه حجم فضای خالی 0 و حجم کل 2147481600
نمایش داده میشه. از میکرو sd card hw-125 samsung استفاده میکنم
سلام چرا من نمیتونم قسمت 15 رو پیدا کنم؟
احتمالا مقاله ادامه پیدا نکرده
سلام یه مشکل خیلی اساسی با لایب فت اف اس دارم !!
وقتی دیسم جدا میشه
و دباره وصل میشه با هیچ دستوری نتونستم دباره INIT کنم کارت حافظع رو همه دستوراتشو اعم از
fresult = f_mount(NULL,””,0);
MX_FATFS_Init();
f_sync(&fil) ;
امتحان کردم
«دیسم» یعنی وقتی دقیقا چی میشه
متوجه نشدم
سلام حاجی
برد ریست میشه
کارت حافطه روی برد نصب هست شروع میکنه به کار کرد بدون مشکل
یک نفر کارت رو خارج میکنه و دباره وصل میکنه
بدون ریست میکرو دباره با هیچ دستوری نمیشد اینیت کرد یا مونت کرد یا دباره کارت حافظه رو خوند
میکرو رو ریست میکنم مشکل حل میشه چاره دیگه ای نداشتم !!!
سلام
خوب این حالتها رو به شکل نرم افزاری باید هندل کرد- معمولا سوکت های SD پایه ای دارند که میگه آیا کارت داخل سوکت هست یا نه
سلام
چطور میشه از این کتابخانه ff.h در کدویزن استفاده کرد
تمامی فایلهاشو از سایت چان دانلود کردم
من اینکلود که میکنم تابه های f_open ,,, f_close ,…. تقریبا همش نمیخونه میزنه define شده اما reference نیست
خود کدویژن هم ff.h داره اما باز اون تو شبیه سازی اوکی ولی وفتی روی میگرو میزنم اجزا نمیکنه
ای سی 128A ….. پروتکل سریال فعال نمیشه
از config لیبری مموری کارت فعال کردم
سلام
البته مدت خیلی زیادی هست که با کدویژن کار نکردم (شاید حدود 10 سال) ولی فکر میکنم تو ورژن های آخری یعنی ۳ به بعد اصلا کدویژن این کتابخانه رو اضافه کرده خودش و فقط لازمه توی ویزارد تیکش رو بزنید.
سلام
وقتی با دستور f_read یه فایل txt رو می خونم، مقدار ascii اونها در ram ذخیره میشه.
امکانش هست که خود عدد ذخیره بشه؟
مثلا اگر تو یه فایل txt اعداد 12345 ذخیره شده باشن، موقع استفاده از f_read، همون 12345 خونده بشه نه مقدار ascii شون.
سلام دوست عزیز
فایل های متن به صورت کاکتری ذخیره میشن برای همین هم هست که اسکی اونو موقع خوندن دریافت میکنید (رشته)
برای تبدیل میتونید رشته رو به عدد تبدیل کنید بعد از خوندن از فایل
نمیشه فایل رو با یه فرمت دیگه ذخیره کرد؟
( مثلا .bin)
شما میتونید فایل را بصورت باینری هم ذخیره کنید و بخونید و مثلا برا یک عدد Long 4 بایت را اختصاص بدید که البته ساختار خوندنش میتونه کمی متفاوت باشه با ساختار تکست
سلام وقت بخیر.
من درایور ال سی دی ft810 تهیه کردم و میخوام با میکروکنترلر stm32f103c8t6 چند عکس نمایش بدم. درایورم از کارت اس دی پشتیبانی میکنه اما کتابخانه خوبی ندارم. میخواستم بدونم برای استفاده از کارت اس دی و نمایش عکسهای ذخیره شده در اون از طریق درایور، باید دقیقا چیکار کنم؟
ممنونم از راهنمایی شما
سلام دوست عزیز
ای کاش سوالتون رو واضح تر پرسیده بودید- چیزی که من فهمیدم اینه که میخواید یه عکس رو از روی حافظه بخونید و روی نمایشگر نمایش بدید.
برای این کار اول باید دقت کنید که کنترلر تصویر شما چه فرمت هایی رو برای نمایش پشتیبانی میکنه – فکر میکنم این کنترلر شما فایل های jpeg رو پشتیبانی بکنه – البته دقیقش رو باید توی دیتاشیتش ببینید
کاری که باید بکنید اینه که محتویات فایل رو اونطور که توی دیتاشیت توضیح داده شده برای کنترلر ارسال کنید.
ممنون از پاسخ شما. ببینید ما میخوایم مستقیم از حافظه درایور عکس رو فراخوانی کنیم و دیگه حافظه میکروکنترلر رو درگیر نکنیم. چطور میتونیم مستقیما به حافظه درایور دسترسی داشته باشیم؟ 1مگابایت حافظه داره.
کاری که ما میتونیم انجام بدیم این هست که عکس رو تبدیل به کد هگز کنیم و از میکرو منتقل کنیم. اینطوری وقتی سایز عکس رو بالا میبریم برای السیدی 7 اینچ، ارور حافظه میگیریم. اما اگر بتونیم مستقیما عکس رو به درایور بدیم، دیگه فقط کافیه که فراخوانی بشه درست میگم؟ هیچ کدی پیدا نکردیم که اینکار رو انجام بده. الان میتونیم عکسی رو که دیفالت روی درایور بوده و لوگوی ftdi هست رو نمایش بدیم، اما نمیتونیم عکس جدیدی بهش منتقل کنیم. صرفا میتونیم عکسهای با سایز و حجم کوچیک رو نمایش بدیم که مطلوب ما نیست.
خواهش میکنم
متوجه شدم منظورتون چیه – خوب اول باید بگم اون حافظه ۱ مگ داخلی کنترلر تصویر از نوع رم هست و برای شما در دسترس نخواهد بود چون در واقع ram پردازشی خود چیپ هست و وقتی چیت بخواد تصاویر رو نمایش بده اول توی این رم رندر میشه! برای همین برای کاربر در دسترس نیست – مقدار اون رم مهمه چون ماکزیمم ابعاد تصویری که چیپ میتونه پشتیبانی کنه بسته به اون رم داره.
خوب حالا از این قضیه که بگذریم شما یه تصویر ۸۰۰ در ۴۸۰ پیکسل رنگی دارید که میخواید روی نمایشگر نمایش بدید درست میگم !! اگر کیفیت تصویر شما ۱۶ بیت باشه – حجم خام عکس میشه حدود 760 کیلو بایت که اصلا منطقی نیست بخواید روی میکرو ذخیره اش کنید اما اگر شما همین تصویر رو تبدیل به jpeg کنید احتمالا حجمش به زیر ۱۰۰ کیلو میرسه و منطقی میشه این کار! البته نمیدونم از چه میکرویی با چه حافظه ای دارید استفاده میکنید.
من الان دیتاشیت ft810 رو بررسی کردم و خوشبختانه از کدک jpge پشتیبانی میکنه و از این بابت جای نگرانی نیست.
خیلی ممنون از توضیح واضح و کاملتون. دقیقا مشک ما همین بود که عکسها 768 کیلوبایت میشن حدودا و مشکل حافظه داریم. اینطور که متوجه شدم منظور شما این هست که بیایم عکس رو با همون فرمت JPEG به پروژه اضافه کنیم و با دستوری که در کتابخانه ش وجود داره صرفا لود کنیم؟
البته این دستور رو باید خودمون بنویسیم احتمالا. چون کد کتابخانه کاملی ازش موجود نیست و اکثر کدها برای اردوینو نوشته شده و ارور دارن..
خواهش میکنم دوست عزیز
بله درست متوجه شدید – من قبلا همین مشکل رو داشتم ولی از آیسی ft810 استفاده نمیکردم که بتونم با فرمت jpeg ذخیره کنم و برای همین اومده بودم عکس رو با فرمت lz فشرده میکردم روی حافظه میکرو و موقع پخش از حالت فشرده خارجش میکردم. ولی با توجه به این که چیپ ft از فرمت های jpg پشتیبانی میکنه برای شما بهترین کار همین راههه
سلام
مهندس ممنون از آموزش خوب تون
مهندس این آموزش ادامه هم داره؟
سلام دوست عزیز فعلا برنامه ای برای ادامه این آموزش نداریم و در حال تدوین آموزش های دیگری هستیم
درود به استاد گرامی
ممنون از اموزش های خوبتون
آیا کار با ماژول کارت خوان فقط با stm32 سری 4 امکان پذیره؟ من سری 1 گرفتم حجم مموری رو میتونم بخونم اما نمیتونم فایل بسازم و داخلش بنویسم. اگه راهنمایی بفرمایید ممنون میشم
حتی میشه با سری های avr کار کرد و منحصر به میکروی خاصی نیست
احتمالا که الان در نظرم هست اینه شاید کتابخانه به شکل readonly در دسترس شما باشه – این مورد رو بررسی کنید.
سلام ممنون از سایت خوبتون.
در sdio فایل ایجاد میشه ولی داخلش رایت نمیشه.
از این دوروش هم استفاده کردم.با فرکانسهای مختلف ولی مشکل حل نشد لطفا راهنمایی بفرمایید باتشکر.
if(f_printf(&MyFile,”Test \r\n”)==FR_OK)
و
if(f_write(&MyFile, wtext, sizeof(wtext)-1, (void *)&byteswritten)== FR_OK)
حتما در اتمام نوشتن باید فایل رو ببنیدید اگر این کار رو انجام ندیدن نوشتن انجام نمیشه یعنی بافر روی میکرو با سکتور های mmc سینک نمیشه
آیا این کار رو انجام میدید ؟
سلام روز همگی بخیر. ببخشید من پست اموزشی رو با عنوان مبدل دیجیتال به آنالوگ توی لیست آموزش میکروکنترلر stm32 ندیدم, بخاطر همین اینجا سوالمو میپرسم.
دوستان من با استفاده از ESP32 محصول شرکت espressif , فایل صوتی با فرمت mp3 رو از طریق یلوتوث دریافت یا از روی microSD خوندم! و از طریق رابط I2S به مبدل دیجیتال به آنالوگ pcm5102 فرستادم و خروجی خوبی دریافت کردم. ولی متاسفانه دیروز حواسم به ولتاژ منبع تغذیه نبود و ماژول pcm5102 سوخت متاسفانه. الان رفتم میبینم قیمتش آنچنان رفته بالا ک حقیقتا توان خرید این ماژول رو ندارم.
الان میخواستم ببینم از میکروکنترلرهای stm32 میشه بجای این ماژول استفاده کنم؟ و اینکه اگر امکان پذیر هس چطور باید انجامش بدم؟
لطفا دوستانی که تجربه ای دارن, کمکم کنن.
ممنون
سلام
چرا از dac داخلی خود esp32 استفاده نمیکنید ؟ کیفیت خوبی هم داره
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/dac.html
عصر بخیر… مبدل دیجیتال به آنالوگ داخلی esp32, هشت بیتی هستش. کیفیت مطلوب و خوبی نداره.
شما با رابط i2s میکروکنترلرstm32 کار کردین؟
۸ بیت که به نظر کیفیت معقولی هست
ولی به با i2s کار کردیم و به خوبی هم کار میکنه مشکل شما الان کجاست
البته stm32 هم dac داخلی فکر کنم ده بیتی یا ۱۲ بیتی هم داره.
سلام بعد از f _mount در f_open متوقف میشه .مشکل چی میتونه باشه .اس دی 8 گیگ هست و fat 32 فرمت ۲۰۴۸
سلام احتمالا نمیتونه با کارت حافظه ارتباط برقرار کنه
در حالت دستور mount فقط متغییر ها رو مقدار دهی میکنه و سعی نمیکنه که با دیسک ارتباط برقرار کنه !
برای این کار که توی همون mount دیسک رو هم چک کنه – یه پارامتر ورودی میگیره که این کار رو میکنه – اون متغییر رو ست کنید و به تابع پاس بدید
سلام
خسته نباشید
اگه بخوایم “یک” فایل با حجم بیشتر از 4 گیگابایت داشته باشیم، از فرمت fat32 نمیشه استفاده کرد، باید از exfat استفاده کرد
ولی من نمونه کدی پیدا نکردم که توش روی sd card و با این فرمت، فایلی ساخته باشن…
در واقع همه جا اومدن از متغیرای FIL استفاده کردن که f_sizeش یه عدد 32 بیتیه (همون 4 گیگ)
به جز این مجموعه دستورات، دستورای دیگه نیست برای فرمت exfat؟
سلام دوست عزیز
خوب مورد شما یه مورد خاصه :)تا حالا برای خودم پیش نیامده که چنین حجمی رو لازم داشته باشم
ولی شما میتونید از کتابخانه ELM-CHAN استفاده کنید طبق گفت های خودش این کتابخونه قادره فایل سیستم exFAT رو پشتیبانی کنه و دقیقا اشاره کرده که میتونید فایل های حجیم بزرگتر از ۴G بسازید – لینک زیر رو مطالعه کنید
http://elm-chan.org/docs/exfat_e.html
سلام به گروه سیسوگ.
انصافا یکی از چند تا سایت انگشت شمار، با محتویات راه گشاست که میشناسم. خدا قوت.
برای انتقال حجم زیاد داده 32 بیتی و با سرعت بالا به sdcard، لازمه انتقال توسط DMA و بصورت SDIO انجام بشه. ممنون میشم در ادامه آموزش ، به نحوه پیکر بندی صحیح cube برای DMA هم مطالبی اختصاص بدید و به تغییرات لازم و نکات مهم در پیکربندی و کد نویسی اشاره کنید. سعی خودم و منابع اینترنت بی نتیجه بود.
باز هم ممنون
سلام دوست عزیز
خواهش میکنم نظر لطف شماست :))
سعی میکنیم در لیست کاهامون قرار بدیم راه اندازی DMA رو
البته لازمه اشاره کنم چون fat یه فرایند نرم افزاری است به شکل کامل نمیشه از قابلیت dma برای بالابردن سرعت استفاده کرد ولی خوب راه هایی هم هست که بشه به این مهم دست پیدا کرد.
سلام.
بسیار عالی.
ببخشید قسمت 15 رو هرچه گشتم پیدا نکردم.
اصلا این سری از آموزش قسمت 15 داره؟
سلام ممنون از نظر لطفتون دوست عزیز… قسمت 15 این مجموعه هنوز منتشر نشده
سلام اقا لطفا سری اموزش بعدی بزارید شدیدا بهش احتیاج داریم اینو واقعا خواهش میکنم
اجازه بدید – در حال بررسی هستیم ؛
سلام من تقریبا تمام مقالات سیسوگ را مطاله می کنم و عالین اما این مقاه خیلی خلاصه بود ای کاش کمی توضیحات بیشتری در مورد این موضوع می نوشتید یا حداقل یک مقدمه در مورد فایها اولش می نوشتید اما منتظر ادامه این مقاله بخصوص در مورد فایل نویسی و راه اندازی SD کارت هستیم باتشکر
سلام ؛ خوب گاهی پیش میآد که مطالب نیاز به توضیح بیشتر داشته باشند ؛ سعی میکنیم اونا رو کامل کنیم.
با سلام
ممنونم از آموزش بسیار خوبتون
بنده با RTOS نتونستم SDIO رو راه اندازی کنم.
یعنی mount می کنه ولی وقتی درون تست بخوایم یه فایل رو باز کنیم خیلی طول میکشه بعدش خطای دیسک میده
ممنونم ازتون که مشکل رو شناسایی کنید
خوب یعنی بدون سیستم عامل درست کار میکنه ؟
ببینید سیستم عامل در واقع نمی تونه دخالتی توی کار کردن یا نکردن SDIO داشته باشه ؛ مگر این که روی کتابخونه خودتون Mutex یا semaphore رو فعال کرده باشید و درست مدیریتش نکرده باشید در اون صورت هم نباید خطای دیسک رو داشته باشید.
بعد این که سورس رو شما نوشتید ما که نمیتونیم متوجه بشیم مشکل از کجاست – چرا که سورس شما رو ندیدیم 😐
مدتیست با سیسوگ آشنا شدم سایت از نظر محتوا بسیار عالیست دمتون گرم
بیصبرانه منتظر قسمت 15 هستیم . مرسی
ممنون از لطف شما دوست عزیز
سلام اقا واقعا خسته نباشید و دست مریزاد هرچی بگم کم گفتم
سلام ممنون از لطف شما دوست عزیز
سلام ممنون از سایت خوبتون.
قسمت 15 کی بر روی سایت قرار میگیره؟ من شدیدا بهش نیاز دارم
سلام دوست عزیز
تا روز چهارشنبه مطمئنا منتشر میشه. ممنون از شکیبایی شما
ممنون از پاسختون
میخواستم درخواست کنم اگر امکانش هست توضیحاتی هم در مورد ساخت پوشه و زیر پوشه در sd card و خواندن آنها توسط میکرو هم داده بشه
سلام – خوب کار با پوشه خیلی ساده است مثل فایل ؛ به توابع مربوطه نگاه بندازید ؛ و البته توصیه میکنم که به سایت خود چان سر بزنید و مستندات اونجا رو مطالعه کنید
اگر سوال خاصی دارید مطرح کنید تا حد توان سعی میکنیم که جوابگو باشیم