ARM, STM32, آموزش STM32 با توابع LL, توصیه شده

لیست پخش در wave player با STM32 | قسمت سی‌ و سوم آموزش STM32 با توابع LL

لیست پخش در wave player با STM32 | قسمت سی‌ و سوم آموزش STM32 با توابع LL

در قسمت قبل در مورد جزییات فرمت فایل صوتی wav و نحوه پیاده‌سازی یک wave player ساده صحبت کردیم. در این بخش می‌خواهیم یک لیست پخش به wave player اضافه کنیم، پس با سیسوگ همراه باشید.

لیست پخش wave player

لیست پخشی که در نظر داریم به این صورت است که میکرو تمامی فایل‌های wav موجود روی کارت حافظه را پیدا کند و پس از پخش هرکدام به سراغ فایل بعدی برود. یک کلید برای رفتن به آهنگ بعدی نیز در این پروژه تعریف می‌کنیم که در صورت فشرده شدن، پخش فایل فعلی متوقف‌شده و برنامه فایل بعدی را پخش کند. پس برای شروع کار، مثل گذشته به سراغ ایجاد پروژه می‌رویم.

 

ایجاد پروژه

برای سهولت کار و عدم نیاز به‌اضافه کردن همه فایل‌های موردنیاز از ابتدا، فایل‌های مربوط به پروژه قبلی را کپی می‌کنیم و سپس تغییرات موردنیاز را در آن اعمال می‌کنیم. پس از کپی کردن پروژه wave player، فایل IOC آن را باز می‌کنیم تا نرم‌افزار Cube MX اجرا شود (البته تغییر پروژه بدون این نرم‌افزار نیز امکان‌پذیر است و انجام این عمل تنها به‌منظور یکپارچه بودن روند آموزش‌هاست). تنها تغییر که می‌خواهیم ایجاد کنیم، تعریف یک پایه ورودی برای وصل کلید مربوط به آهنگ بعدی است. این کار را مانند تصویر زیر انجام می‌دهیم؛

لیست پخش wave playerبرای کلید، پایه PC0 را در نظر گرفتیم و همان‌طور که در تصویر مشخص است، این پین را در حالت pull-up تنظیم کردیم. حالا تغییرات را اعمال می‌کنیم و به سراغ کد می‌رویم.

 

نوشتن کد پروژه

در این پروژه به تابعی نیاز داریم که فایل‌های روی کارت حافظه را چک کند، اگر پسوند فایل wav بود آن را از طریق تابع wave play که قبلا نوشتیم پخش کند و سپس به سراغ فایل بعدی برود. برای نوشتن این تابع به فایل WAV_Handler.c می‌رویم. تابع scan_files را مشابه مثال خود elm chaN می‌نویسیم؛

طبیعتاً این تابع را در فایل WAV_Handler.h نیز اعلان می‌کنیم که بتوانیم از آن استفاده کنیم. در ادامه برای تعریف کردن کلید آهنگ بعدی و همچنین امکان پخش آهنگ بعد پس از اتمام یک آهنگ، دو متغیر بولین گلوبال زیر را تعریف می‌کنیم؛

اکنون باید به ترتیب تغییرات زیر را در توابع wave-start، wave_EndofFile_Callback و wave_play اعمال کنیم؛

کار تقریباً تمام است، تنها بخش باقی‌مانده استفاده از تابع جدیدی است که تعریف کردیم. در فایل main.c کد زیر را می‌نویسیم؛

در صورت درست انجام دادن همه مراحل، لیست پخش wave player باید به‌درستی کار کند و فایل‌های wav رو کارت حافظه را حتی در پوشه‌های تودرتو پیدا و پخش کند.

کپی کردن کانال Mono

برای بهتر شدن عملکرد پروژه در پخش موسیقی تک کاناله یا Mono برای پخش با هندزفری، می‌توانیم این نوع فایل را جوری پخش‌کنیم که روی هر دو کانال صدا داشته باشیم. برای کپی کردن کانال، لازم است تغییراتی در کد اعمال کنیم که در ادامه، این تغییرات را بررسی می‌کنیم.

در مرحله اول، مجدداً فایل IOC را باز می‌کنیم تا کانال DMA مربوط به خروجی دوم DAC را تنظیم کنیم؛

لیست پخش wave player

در کد پروژه نیز باید تابع تنظیم DMA را تغییر دهیم اما قبل از آن در فایل WAV_Handler.h اسم کانال جدید DMA را تعریف می‌کنیم؛

تغییر مورد نظر در تابع wave_DMAConf :

همچنین تابع wave_DACConf را به صورت زیر تغییر می‌دهیم؛

دو خط کد کامنت شده (با توضیح for copy mono channel section) در تابع wave_Play نیز از حالت کامنت خارج می‌کنیم.

اکنون هنگام پخش فایل‌های mono، صدا از هر دو بلندگو پخش خواهد شد.

 

لینک فایل این پروژه در گیت‌هاب

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

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

1 دیدگاه در “لیست پخش در wave player با STM32 | قسمت سی‌ و سوم آموزش STM32 با توابع LL

  1. Avatar for نیهاد نیهاد گفت:

    سلام وقت بخیر
    ممنون از مطالب مفیدتون.
    ممنون میشم برنامه ADC+DMA+timer رو هم بذارید.

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

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