STM32, پروژه, توصیه شده, کتابخانه برنامه نویسی, مقاله های سیسوگ

همه چیز درباره دیکد نرم‌افزاری MP3 به کمک میکروکنترلر – سورس کد – شماتیک

همه چیز درباره دیکد نرم‌افزاری MP3 به کمک میکروکنترلر - سورس کد - شماتیک

مقدمه

در مقاله‌ی پیشین (فایل MP3 چیست و از کجا آمده است)، به چگونگی پیدایش فایل های MP3  ، مزیت‌ها و قابلیت‌های آن پرداختیم. در این مقاله قصد داریم که ساز و کار و نحوه دکد و پخش فایل های MP3 را تشریح کنیم. همانطور که در مقاله‌ی قبلی اشاره شد، فایل mp3 بر خلاف فایل های wav جهت کاهش حجم فایل صوتی، دست به فشرده‌سازی و رمزگذاری صدا می‌زند و آن را به بخش‌ها‌ی کوچکی که فریم نام دارد می‌شکند.

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

یکی از شرکت‌های شناخته‌شده در خصوص تولید چیپ های دکدر، شرکت VLSI است که به واسته چیپ VS1003 در ایران محبوبیت زیادی پیدا کرد. با استفاده از این چیپ، پخش‌کننده همراه و غیرهمراه بسیاری طراحی شد.

به عنوان نمونه عکس زیر که به کمک همین چیپ و میکروکنترلر AVR ، یک پخش‌کننده MP3 قابل‌حمل ساخته شده است.

با این وجود، این گونه طراحی، مشکلات خاص خودش را به همراه داشت. از جمله حجیم شدن مدار، مصرف انرژی بیشتر، بالا رفتن قیمت تمام‌شده و ….. اما چاره‌ی دیگری وجود نداشت و استفاده از این نوع چیپ ها اجتناب‌ناپذیر بود.

تا این که میکروکنترلرهای ARM معرفی شدند که علاوه بر مصرف پایین، سرعت پردازشی به مراتب بالاتر داشتد. میزان حافظه و سرعت پردازش بالای این خانواده از میکروکنترلر، امکان دکد و پخش مستقیم فایل mp3 را ایجاد کرد؛ به نحوی که برای دکد و پخش، نیاز به هیچ المان خارجی نباشد و تمام فرایندها در درون خود میکروکنترلر میسر باشد.

استخراج فریم‌ها

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

همان‌طور که در عکس بالا مشاهده می‌کنید، هر فریم داده دارای هدری است که علاوه بر مشخص کردن شروع یک فریم، مجموعه‌ای از اطلاعات در خصوص آن فریم را نیز دارد. برای روشن‌تر شدن موضوع به عکس زیر دقت کنید:

هر فریم دارای جزئیات فوق است که 32 بیت (4 بایت) اول اطلاعات سینک و هدر را در خود دارد. 16 بیت (2 بایت) بعد، حاوی اطلاعات اعتبار سنجی است که به صورت اختیاری است، یعنی ممکن است وجود نداشته باشد.  136/256 بیت بعدی حاوی اطلاعات مربوط به کانال صوتی است؛ (همان‌طور که میدانید یک فایل صوتی ممکن است منو یا استریو باشد) و مابقی داده‌ها مربوط به داده‌های صوتی است.

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

دکد Mp3 – رمز‌گشایی هدر MP3

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

AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM

  •  11 بیت (A)  (از بیت 21 تا 31) : بیت‌های شناسایی (همه 1 هستند) که برای تشخیص شروع یک فریم به کار برده می‌شوند.
  • 2 بیت (B) (بیت 20 و 19) : ورژن هدر که حاوی 4 حالت است:
    • 00 – MPEG Version 2.5
    • 01 – reserved
    • 10 – MPEG Version 2
    • 11 – MPEG Version 1
  • 2 بیت (C) (بیت 18 و 17): توضیح دهنده لایه:
    • 00 – reserved
    • 01 – Layer III
    • 10 – Layer II
    • 11 – Layer I
  • 1 بیت (D) (بیت 16): بیت اعتبار‌سنجی
    • 0 : قسمت CRC وجود خواهد داشت.
    • 1 : قسمت CRC وجود نخواهد داشت.
  • 4 بیت (E) (از بیت 12 تا 15) : بیت‌ریت خروجی (مطابق جدول زیر)

  • دو بیت (F) (بیت 10 و 11) : سمپل‌ریت مطابق جدول زیر.

  • بیت (G) (بیت شماره 9) : Padding bit
    • 0 – frame is not padded
    • 1 – frame is padded with one extra slot
  • بیت (H) (بیت 8) : Private bit. This one is only informative.
  • 2 بیت (I) (بیت 6 و 7) : Channel Mode
    • 00 – Stereo
    • 01 – Joint stereo (Stereo)
    • 10 – Dual channel (2 mono channels)
    • 11 – Single channel (Mono)
  • 2 بیت (J) (بیت 4 و 5) : Mode extension (Only used in Joint stereo)
  • بیت (K) (بیت 3) : Copyright
    • Audio is not copyrighted
    • Audio is copyrighted
  • بیت (L) (بیت 2) : Original
    • 0 – Copy of original media
    • 1 –  Original media
  • 2 بیت (M) (بیت 0 و 1) : Emphasis

 

بعد از چهار بایت توصیف‌کننده هدر، بنا به وضعیت بیت D در این توصیف‌کننده، ممکن است که یا 2 بایت CRC وجود داشته باشد یا نه. بعدازاین دو بایت اختیاری، طبق فریم که تک کانال باشد یا دو کانال (دو بیت 6, 7)، 17 یا 32 بایت اطلاعات مربوط به کانال‌ها وجود خواهد داشت و بعدازآن داده‌های صوتی قرار خواهند داشت. دقت داشته باشید در شرایط خیلی نادر ممکن است که فریم دارای داده‌های صوتی نباشد. در عکس زیر یک فریم را درون یک فایل MP3 مشخص کرده‌ایم که 4 بایت قرمزرنگ، هدر و 32 بایت آبی‌رنگ، اطلاعات کانال می‌باشد. بقیه‌ی بایت‌ها هم داده‌های صوتی هستند. توجه داشته باشید که بایت‌های مربوط به خطایابی وجود ندارند.

 

دکد Mp3 – رمز‌گشایی داده‌ها‌ی صوتی

برای رمزگشایی داده‌های موجود در این قسمت اول لازم است با الگوریتم هافمن آشنایی داشته باشیدِ؛ روش کدگذاری هافمن یک روش فشرده‌سازی داده است که توسط دیود هافمن پایه‌گذاری شد. در روش هافمن داده‌ها 20 الی 90 درصد فشرده می‌شوند. در الگوریتم هافمن از ساختمان داده‌ی صف اولویت استفاده می‌شود. توضیح نحوه‌ی عملکرد الگوریتم هافمن در این مقاله نمی‌گنجد و علاقه‌مندان جهت یادگیری می‌توانند به وب‌سایت های مربوطه مراجعه کنند.

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

 

نحوه ساخت یک ماژول MP3 Player

توضیح سخت‌افزار

همان‌طور که در تصویر زیر مشخص شده است، سخت‌افزار مورداستفاده جهت دکد فایل MP3، یک سخت‌افزار بسیار ساده است که جزء اصلی آن را یک میکروکنترلر STM32F103RET تشکیل داده است. تمام اتفاقات درون میکروکنترلر رخ می‌دهد.

برای تبدیل داده‌های دیجیتال از مبدل‌های دیجیتال به آنالوگ (DAC) داخلی میکروکنترلر استفاده شده که قادر است نرخ یک مگاسمپل بر ثانیه و دقت 12 بیت را ارائه نماید. کارت حافظه هم با استفاده از رابط SPI به میکروکنترلر وصل شده است. درواقع تلاش شده که تا جای ممکن مدار، ساده و قابل‌فهم باشد.

نرم‌افزار

نرم‌افزار توسط کامپایلر کیل نوشته شده و قادر است فایل‌های MP3 تا بیت ریت 320 کیلو و فایلهای Wav را تا بالاترین بیت‌ریت ممکن پخش نماید. برای سرعت عمل بیشتر در دکد فایل‌های MP3، بخشی از کد به زبان اسمبلی نوشته شده است. تا حد ممکن سعی شده که از منابع موجود بهترین استفاده برده شود. برای انتقال داده‌های صوتی به مبدل‌های DAC، از واحد DMA استفاده شده تا CPU کمترین درگیری را در این انتقال داشته باشد.

مطابق برنامه‌ی فوق، بعد از نصب و پیکربندی کارت حافظه، برنامه ابتدا به دنبال فایل start.mp3 درون کارت حافظه می‌گردد. در صورت وجود چنین فایلی آن را اجرا کرده و بعد از اتمام، به دنبال فایل start.wav می‌گردد تا آن را پخش نماید.

شما به‌راحتی با اضافه کردن توابع و بخش‌های موردنظر خود، می‌توانید این کد را تبدیل به یک Mp3 Player  همراه کنید.

 

دانلود سورس کد دکدر MP3

Sisoog_STM32_Mp3Player

دانلود فایل PDF این متن

MP3_Player


 

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

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

135 دیدگاه در “همه چیز درباره دیکد نرم‌افزاری MP3 به کمک میکروکنترلر – سورس کد – شماتیک

  1. Avatar for حسین حسین گفت:

    سلام.. اگه خروجی میکرو رو نخوایم به اسپیکر وصل کنیم و بخوایم با چند تا شیپور آهنگ رو پخش کنیم امکانش هست؟ به این صورت که هر شیپور رو برای مدت خاص سوئیچ کنیم و همین طور ریتم آهنگ رو درست کنیم. خروجی صفر و یک نیاز دارم برای سوئیچ کردن شیپورها

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

      بله چرا که نه
      امکانش هست و فکر کنم نمونه مشابه دیدم البته با آردوینو

  2. Avatar for سعید سعید گفت:

    با چه مدار واسطی می توان dac خروجی را به میکروفن m66 متصل کرد که در صورت زنگ زدن به ماژول میکرو فایل صوتی را پخش کند.

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

      چون بحث نوز مطرح میشه توصیه نمیکنم که این کار رو انجام بدبد
      بهتره فایل صوتی رو داخل خود ماژول قرار بدید روب حافظه داخلی یا sd کارت و از اونجا فایل رو پلی کنید که دستور هم برای کار داره

  3. Avatar for Omid Azadeh Omid Azadeh گفت:

    سلام و خسته نیاشی … یه سوال .. از گجای یه فایل mp3 چطوری میشه فهمید زمان اون آهنگ چقدره ….

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

      سلام دوست عزیز
      باید زمان هر بلاک رو محاسبه کنید فکر نمی‌کنم توی هدرش باشه

  4. Avatar for Omid Azadeh Omid Azadeh گفت:

    با سلام و خسته نباشید و تشکر بابت این همه زحمات … یه سوال فرض‌کنید روی همین ۱۰۳ یه. Rtos دارید … با توجه به اینکه دیکد فایل نرم افزاریه چقدر از سی‌پی‌یو اسغال میسه … منظورم cpu usage هستس … ممنون

    1. Avatar for zeus zeus گفت:

      سلام و متشکرم
      باید بگم خوب با توجه به بیت ریت مورد دیکد احتمالا جواب متفاوت خواهد بود
      چیزی که یادم هست حدود 70 تا 80 درصد قدرت پردازشی یک چیپ 103 مورد استفاده قرار میگیره

      1. Avatar for Omid Azadeh Omid Azadeh گفت:

        چقدر زیاد … هیچی از میکرو نمیمونه … هرچند روی F4 احتمالا این عدد روی 30 تا 40 و روی یه چیزی مثل H7 روی 5 تا 10 باشه …. به هر حال ممنون بابت جوابتون …

  5. Avatar for م.الهی م.الهی گفت:

    سلام، وقتتون بخیر، ممنون میشم اگر سوالم رو جواب بدین
    من میخوام به دیتایی که داره به DAC میره دسترسی داشته باشم…
    چیزی که داره به تابع DAC میره که از DMA ارسال بشه (uint32_t*)((s8 *)AudioBuffer هستش…
    این آرایه به اندازه 4608 تعریف شده،
    ایا توی هر لحظه کل این ارایه پر هستش؟ و ایا به ترتیب پر شده یعنی مکان اول با دیتایی که اول میاد پر میشه و همین طور میره جلو…
    به طور کلی اگر بخوام به دیتای که در هر لحظه به DAC میره دسترسی داشته باشد باید چه کار کنم؟
    ممنونم

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

      سلام دوست عزیز
      خوب راه حل اول اینه که خود dma رو تنظیم کنید که داده ها رو جایی که دوست دارید منتقل کنه – مثلا میخواید از dac خارجی که spi هست استفاده کنید میتونید به dma بگید که به جای dac داخلی داده ها رو به spi تحویل بده مثلا
      راه دوم اینه که داده ها موقع دکد توی بافری که دوست دارید بریزید – یه حلقه داریم که داده ها رو دیکد میکنه – اونجا میتونید به جای آدرس این بافر آدرس بافر دلخواه تون رو بدید.
      ساز و کار هم اینطوری که همیشه کل این بافر حاوی داده درست نیست – این بافر به دو قسمت پایین و بالا تقسیم میشه وقتی قیمت پایین در حال پخش هست (داره به dac ) منتقل میشه داده های جدید که در حال دیکد هستند توی قسمت بالا کپی میشن تا اختلالی توی پخش پیش نیاد (وقفه نیفته) و این سیکل تا تمام شده کل آهنگ ادامه پیدا میکنه.

      1. Avatar for م.الهی م.الهی گفت:

        ممنون، میخوام در حقیقت هم به DAC بره هم من بتونم بهش دسترسی داشته باشم و از طریق usart ارسال کنمش، یعنی میخوام هر لحظه دیتایی که داره به DAC میره همون دیتا رو بعد از یک انالیز با از طریق سریال انتقال بدم

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

          سلام خوب پس شما با توجه به وضعیت dma ببینید که الان کدوم تیکه از بافر فعال هست (تیکه پایین یا بالا) و اون تیکه رو به پورت سریال ارسال کنید.
          شاید ساده تر باشه که یه بافر دیگه درست کنید و بعد از استخراج اطلاعات از اون دو تا کپی بگیرد یکی برای dac و یکی برای پورت سریال

  6. Avatar for م.الهی م.الهی گفت:

    سلام مجدد
    میدونم خیلی سوال میپرسم 🙁 اما متاسفانه کارم گیر کرده و نمیدونم مشکل از کجاست
    من میخوام همین پروژه رو با stm32f429 دیسکاوری انجام بدم و خوب دارم پله پله میروم جلو… ( چون کل برنامه رو که تغییر دادم جواب نگرفتم)
    الان میخوام یک فایل صوتی ویو رو از حافظه میکرو با استفاده از DMA پخش کنم؛ تنظیماتم به این صورت هستش:
    تنظیمات DMA:
    DMA_InitTypeDef DMA_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    /* DMA IRQ Channel configuration */
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    /* DMA1 channel7 configuration */
    DMA_DeInit(DMA1_Stream5);
    DMA_InitStructure.DMA_Channel = DMA_Channel_7;

    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) data;
    DMA_InitStructure.DMA_BufferSize = sizeof(data);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &DAC->DHR8R1; // 8Bit Reg
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    // DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA1_Stream5->CR = (0UL << 14) ; // Memory to memory mode

    DMA_Init(DMA1_Stream5, &DMA_InitStructure);
    /* Enable DMA21 Channel7 */
    DMA_Cmd(DMA1_Stream5, ENABLE);
    /* Enable DMA for DAC Channel1 */
    DAC_DMACmd(DAC_Channel_1, ENABLE);
    که خوب DMA1Stream5 Channel7 برای DAC1 هستش
    تنظیمات DAC:
    GPIO_InitTypeDef GPIO_InitStructure;
    DAC_InitTypeDef DAC_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
    DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
    DAC_Init(DAC_Channel_1, &DAC_InitStructure);
    /* DAC channel2 Configuration */
    DAC_Init(DAC_Channel_2, &DAC_InitStructure);
    /* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is
    automatically connected to the DAC converter. */
    DAC_Cmd(DAC_Channel_1, ENABLE);
    /* Enable DAC Channel2: Once the DAC channel2 is enabled, PA.05 is
    automatically connected to the DAC converter. */
    DAC_Cmd(DAC_Channel_2, ENABLE);
    و تنظیمات تایمر:
    TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;

    TIM_DeInit( TIM2);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    TIM_BaseInitStructure.TIM_Period = 3600;
    TIM_BaseInitStructure.TIM_Prescaler = 1-1;
    TIM_BaseInitStructure.TIM_ClockDivision = 0;
    TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM2, &TIM_BaseInitStructure);

    // TIM_ClearFlag(TIM2, TIM_FLAG_Update);
    //
    // TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);

    TIM_Cmd(TIM2, ENABLE);
    که خوب البته من بدون استفاده از DMA یعنی با استفاده از وقفه تایمر و همین تنظیمات تایمر، فایل رو پخش کردم، اما نمیدونم مشکل از کجاست که با استفاده از DMA نمیتونم….
    خیلی خیلی ممنون میشم راهنمایم کنید

  7. Avatar for م.الهی م.الهی گفت:

    سلام ممنون که پاسخگوی سوالات هستید
    من به یه سوال اساسی برخوردم توی کد، عملکرد تایمر 2 که در زیربرنامه DAC_Set_Reat فعال شده چیه؟ میدونم که این تایمر داره زمان پخش هر سکشون رو مرتب میکنه براساس فرکانسی که از دیکود اول هر آهنگ میخونه؛ اما درست متوجه نشدم چطور اینکار رو میکنه، چون اینتراپ براش تعریف نشده، از طرف دیگه DAM هم برای ADC تعریف شده، این تایمر کجا خودشون نشون میده…
    همین طور سوال دیگم اینه، توی اینتراپ DMA چه اتفاقی داره می افته؟
    if(DMA_GetITStatus(DMA2_IT_HT4)) /* LOW_EMPTY */
    {
    DMA_ClearITPendingBit(DMA2_IT_GL4|DMA2_IT_HT4);
    audio_buffer_fill |= LOW_EMPTY;
    }

    if(DMA_GetITStatus(DMA2_IT_TC4)) /* HIGH_EMPTY */
    {
    DMA_ClearITPendingBit(DMA2_IT_GL4|DMA2_IT_TC4);

    audio_buffer_fill |= HIGH_EMPTY;
    }
    ممون

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

      سلام دوست عزیز
      عملکرد این تایمر دقیقا همین چیزی هست که گفتید اما چرا تایمر نداره – خوب مساله ساده است – چون برای انتقال داده ها از توی رم به واحد dac از cpu استفاده نشده بلکه از dma استفاده شده برای همین نیازی به وقفه نبوده.
      وقتی تایمر و فعال میکنیم – بهش میگیم موقع سر ریز به جای وقفه یه تریگر برای dma ایجاد کنه که dma یک ردیف داده ای از داده ها رو منتقل کنه با استفاده از این روش دیگه cpu درگیر نمیشه.
      اما در مورد وقفه dma ، ما دوتا وقفه از dma رو فعال کردم – یکی وقتی که dma به وسط بافری که داره منتقل میکنه رسید و یکی وقتی به آخر بافر رسید. عملکرد dma رو هم به شکل گردشی گذاشتیم. یعنی وقتی به اخر بافر رسید برگیر به اول بافر.
      خوب حالا چرا این کار رو کردیم ؟ ساده است، ما در شروع کل بافر رو پر میکنیم و منتظر میشیم (یا هر کار دیگه ای لازمه انجام میدیم) تا dma به وسط بافر برسه وقتی این انتراپت آمد یکی بخش اول داده ها پخش شده و لازمه اطلاعات جدید رو توش قرار بدیم تا اماده پخش باشه بعد که وقفه انتهای بافر آمد یعنی اون بخش از اطلاعات پخش شده و لازمه داده جدید رو توش قرار بدیدم – این عمل رو تا تمام شدن فایل صوتی انجام میدیم.
      این کار باعث میشه موقع دکد کردن فایل mp3 که زمانبر هم هست وقفه ای توی شنیدین اون نداشته باشیم چون بخش دیگه ای که قبلا آماده کردم داره پخش میشه به همین خوشمزگی

      1. Avatar for م.الهی م.الهی گفت:

        خیلی خیلی ممنون

      2. Avatar for م.الهی م.الهی گفت:

        یه سوال دیگه، توی تنظیمات DMA کجا این تریگر تایمر تعیین شده؟
        برای DAC :
        DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
        هست اما برای DMA متوجه نمیشم..
        باز هم از پاسختون ممنون کلی سوال های ذهنم جواب داده شد.

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

          سلام
          خوب این یه سیکله
          dma به dac وصل شده و وقتی دک تریگش کنه یک بایت در اختیارش میذاره و خود دک هم توسط تایمر تریگ میشه 🙂
          خواهش میکنم

  8. Avatar for م.الهی م.الهی گفت:

    سلام وقتتون بخیر
    ببخشید من اگر بخوام همین برنامه رو برای stm32f429 تغییر بدم، با توجه به اینکه پایه های dac در دو میکرو یکسان هستش و همین طور پایه های SPI(MISO,MOSI,NSS,SCK) (B12,B13,B14,B15) .
    باید توی برنامه تغییراتی بدم؟ به چه صورت؟
    چون متاسفانه نتونستم، و اینکه برنامه جایی که باید فایل رو از SD کارت open کنه گیر میکنه
    ممنون میشم راهنمایی کنید…

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

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

  9. Avatar for محمد محمد گفت:

    درود
    من این پروژه رو با استفاده از حافظه spi flash و با cubeMX انجام دادم و آهنگ ها با استفاده از usart و نرم افزار Realterm به حافظه spi flash انتقال داده شد .
    توابع مربوط به FATFS کلا تو این پروژه حذف شد و آهنگ ها بایت به بایت توی تابع اصلی fill_buffer() از روی spi flash خونده میشد.
    البته با با نرخ باود 115200 و DMA حدود بیست دقیقه زمان برد که یک آهنگ از کامپیوتر روی حافظه spi flash ریخته بشه. :-/ که این از معایب اصلی این پروژه بود.

    1. Avatar for Sisoog Os Sisoog Os گفت:

      خیلی هم عالی تمایل داشتید میتونید سورس این را هم با دوستانتون به اشتراک بگذارید

  10. Avatar for سعید سعید گفت:

    سلام
    من هرکاری کردم نشد با stmcubeMX‌و توابع HAL راش بندازم
    کسی کار نکرده با این ؟ خیلی رو مخه که نمیشه

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

      من با HAL کار نکردم اگر نه کمک میکردم
      ولی به نظرم چیز چنین پیچیده ای نداره

  11. Avatar for م.الهی م.الهی گفت:

    سلام وقتتون بخیر، ممنون بابت اطلاعات و کدی که گذاشتید
    من میخوام وقتی داره اهنگ پخش میشه، به یک برد دیگه با استفاده از rs485 دیتا ارسال کنم، اما وقتی دستور ارسال دیتا رو توی While اجرای اهنگ میزارم، صدا کاملا خراب میشه و دیگه اصلا هیچی معلوم نیست از اهنگ، ممنون میشم راهنماییم کنید..

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

      احتمالا دلیلش اینه که پردازنده رو خیلی درگیر میکنید و فرصت لازم برای دیکد آهنگ رو از دست میده – بهترین راه حل استفاده از اینتراپت هست – به نحوی که پردازنده منتظر خالی شدن بافر uart برای ارسال نشده
      احتمالا از این روش استفاده کنید مشکل حل میشه

  12. Avatar for سعید سعید گفت:

    سلام
    ممنون از پست خوبتون
    دو تا سوال:
    1. این کد رو چجوری میشه برای میکرو STM32f103VET6 استفاده کرد؟
    2. میشه از یک DAC استفاده کرد؟

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

      سلام خوشحالم که از مطلب خوشتون اومده 🙂
      ۱. به سادگی فقط با تغییر نوع میکروکنترلر میتونید انجامش بدید – اگر این میکرو قسمت dac داخلی رو نداره که باید تنها کد اون قسمت رو عوض کنید توی برنامه
      ۲. اگر منظورتون اینه که به شکل منو پخش بشه صدا – بله میشه – داده های کانال دیگه رو باید در نظر نگیرید.

      1. Avatar for سعید سعید گفت:

        ببخشید یک سوال دیگه:
        1. تنظیمات تایمر ها و DMA که در کتابخونه استفاده شده رو خود کتابخونه انجام میده یا ما باید کاری بکنیم جایی؟
        2. قابلیت ساخت mp3 پلیر رو داره؟ منظورم اینه آهنگ که پخش شد میره تو پخش آهنگ گیر میکنه یا میشه در حین پخش کار دیگه هم (مثلا استپ کردن در حین پخش) میشه انجام داد؟

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

          امم – بله دیگه خودش انجام میده – فقط چک کنید تایمر ها و کانال های مورد استفاده dma روی میکروی جدید در دسترس باشند
          ۲. خوب تا اونجا که خاطرم میآد دکد یه فایل با بیت ریت ۳۲۰ حدود ۸۰ درصد پردازنده رو درگیر میکنه – از اون ۲۰ درصد دیگه میتونید استفاده کنید موقع پخش که فکر میکنم کفایت خیلی از کارها رو میده

          1. Avatar for سعید سعید گفت:

            بسیار خوب
            من سعی میکنم اینو با CubeMX و توابع HAL تست کنم، اگه به نتیجه مثبتی رسیدم همینجا میذارم بقیه هم استفاده کنن، چون سوال بعضیای دیگه هم بود

          2. Avatar for زئوس Zeus زئوس Zeus گفت:

            بسیار عالی – متشکرم 🙂

  13. Avatar for مژده مژده گفت:

    سلام ممنون از اطلاعات مفیدی که قرار دادین
    ببخشید من طبق همین فرمت مدار رو بستم و برنامه رو کامپایل کردم اما متاسفانه اجرا نشد
    ممنون مبشم راهنماییم کنید
    فقط میکروی من 103vet هستش که البته فک نمیکنم تفاوتی داشته باشه چون پایه های رو چک کردم و توی هر دو‌میکرو‌ یکسان بودش

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

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

      1. Avatar for مژده مژده گفت:

        سلام بله ممنونم مشکل حل شد و تونستم فایل رو با موفقیت پخش کنم 🙂
        فقط میخواستم بدونم امکانش هست که خواندن اهنگ از sd هم با استفاه از Dma باشه، یعنی از dma دو جا استفاده بشه هم برای خواندن اهنگ از sd و هم برای پخش اهنگ
        اگر امکان پذیر هست چطور باید انجام بدم
        ایا کدی در این زمینه ندارید که بتونه راهنمایی کنه
        خیلییی خیلیی ممنون

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

          سلام
          خوشحالم که مشکل حل شده – خوب برای این که از واحد dma برای خواندن اطلاعات از روی حافظه sd استفاده کنید شدنی هست ولی به شرط این که از واحد SD میکرو استفاده کرده باشید.
          وقتی از spi برای خواندن sd استفاده می کنید نیاز به تبادل بایت های کنترلی زیادی دارید که گاها یکی دو بایت بیشتر نیستند ! البته اینطور هم نیست که نشه هیچ کاری کرد مثلا میتوانید قسمت خواندن اطلاعات سکتور رو با dma انجام بدید به این شکل که بایت های کنترلی رو که ارسال کردید برای خواندن اطلاعات یک یا چند سکتور از dma برای کپی دیتای آن سکتور ها استفاده کنید.
          البته بهینه ترین روش استفاده از واحد سخت افزاری sd روی میکرو است

  14. Avatar for Emid Emid گفت:

    سلام، سورس کد قابل دانلود نمی باشد. لطفا اصلاح نمایید.
    با تشکر.

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

      سلام دوست عزیز
      لینک بررسی شد مشکلی نداشت

  15. Avatar for موسوی موسوی گفت:

    ممنون از مطلب مفیدتون. فکر کنم بعد از مدت ها این مطلب بهترین پاسخ و راه کار برای انتقال صوت بی سیم در بستر NRF24L01 باشه.

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

      خواهش میکنم دوست عزیز
      اگر به دنیال انتقال صوت از بستر nrf هستید شاید این بهترین راه نباشه –
      پروژه ای در دست دارم (واکی تاکی) که اگر صبر کنید منتشر بشه خواهید دید راه بهتری نیز هست 🙂

      1. Avatar for حمید حمید گفت:

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

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

          سلام خواهش میکنم دوست عزیز
          نظر لطف شماست
          آماده بشه منتشرش میکنیم 🙂

  16. Avatar for نسا نسا گفت:

    ممنون از راهنمایی تون دقت نکرده بودم در همون تابع همه توابع استفاده شدند .
    شرایط پروژه طوری هست که نمی تونم فایل فایل اجرا کنم یک فایل با قسمت های مختلف ریخته میشه و هر سخت افزاری که اتفاق می افته بخشی از فایل mp3 اجرا میشه ممنون میشم اگر روش های دیگری هم برای این کار وجود داشت من رو راهنمایی کنید.

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

      سلام خواهش میکنم
      خوب با توجه به محدودیتی که دارید کارای متفاوتی میشه کرد
      اولین روش همونی هست که توی کامنت قبل توضیح دادم
      روش دیگه اینه که مثلا طول فایل های رو یکی در نظر بگیرید،مثلا هر فایل صد کیلو بایت باشه – بعد فایل ها رو کپی کنید پشت سر هم اگر ۱۰ تا فایل مختلف باشه میشه یک فایل ۱ مگابایتی !
      در صورتی که شما میدونید ۱۰ تا فایل صد کیلو بایتی دارید 🙂
      اگر نمیشه طول یکسان داشت میتونید اول فایل یه جدول گذاشت که طول قسمت ها رو توش نوشته باشه – قبلا این کارو من کردم چون میخواستم اطلاعات رو از روی یه spi flash بخونم و فایل سیستم نداشتم برای همین مجبور شدم این کار رو انجام بدم.

  17. Avatar for نسا نسا گفت:

    سلام امکان داره کاربرد توابع موجود در فایل mp3.cرو مختصر توضیح بدید .یک تابع که استفاده کردید ۵ تابع دیگه باقی می مونه .ممنون

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

      بگید کدوم تابع مدنظرتونه تا بیشتر توضیح بدم ولی احتمالا باقی توابع تو اون یک تابع استفاده شده اند 🙂

  18. Avatar for نسا نسا گفت:

    سلام در پخش mp3از روی sdکارت ها به نظرتون چگونه میتونیم با هر دستور(مثلا فعال شدن یک سخت افزار ) بخشی از این فایل رو پخش کنیم؟

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

      فکر میکنم بهتره باشه برای این موضوع فایل های جداگانه داشته باشید – یعنی ساده ترین روش ممکن همین هست
      اگر بخواید دقیقه خاصی رو پلی کنید باید فایل رو دکد کنید و میکروفیم ها رو برید جلو تا به اون دقیقه خاص برسید.

  19. Avatar for نسا نسا گفت:

    سلام چرا از هردو dacبرای اتصال استفاده کردید اگر من بخوام به بلند گو وصل کنم ایا یک dacکافیه ؟ممنون می شم داهنمایی کنید

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

      سلام دوست عزیز
      خوب وقتی قرار باشه که موزیک های stereo رو پخش کنیم نیاز به دو کانال صوتی داریم ِ برای همین هم هست که توی این کد از دو کانال dac استفاده شده
      اگر نه به راحتی میتونید یکی از کانال ها رو بی خیال بشید و فقط از یک کانال استفاده کنید.

  20. Avatar for reza reza گفت:

    عرض سلام وخسته نباشید خدمت جناب زئوس
    من سعی کردم این برنامه رو با توابع HAL پیاده سازی کنم اما ارور گرفت،شمابا توابعHAL این برنامه رو پیاده دسازی نکردین.

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

      سلام – دوست عزیز
      خوب این برنامه مروبط به 5 سال پیش است حدودا و اون موقع خبری از HAL نبود – هرچند اگر میخواستم دوباره این برنامه رو بنویسم فطعا از HAL استفاده نمی کردم یا با همین SPL رو استفاده میکردم یا از LL استفاده میکردم
      HAL سربار زیادی میذاره روی پردازنده باری به هر جهت ؛ فکر نمیکنم برای استفاده از HAL مشکلی وجود داشته باشه ؛ فقط کافیه توایع رو بازنویسی کنید.

  21. Avatar for سام سام گفت:

    سلام لطفا لینک را تصحیح کنید تا 26% دانلود میشه بعد ارور data corruption میده!

    1. Avatar for سام سام گفت:

      درست شد با IDM مشکل داشت !

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

        ممنون برای اطلاع رسانی تون ؛ IDM همیشه دردسر ساز بوده :/

    2. Avatar for زئوس Zeus زئوس Zeus گفت:

      سعی کنید بدون استفاد از دانلود منیجر دانلود کنید با کمک خود مرورگر

  22. Avatar for مهدی مهدی گفت:

    سلام و سپاسگزاری از نوشته های خوبی که به اشتراک می گذارید
    لینک دانلود “سورس کد دکدر MP3” مشکل دارد و کامل دانلود نمی شود .

    1. Avatar for Sisoog OS Sisoog OS گفت:

      سلام و ممنون از شما
      لینک مشکلی نداره بررسی شد
      البته دو بار زیپ شده که لازمه دوبار باز بشه و با نرم افزار 7zip میتونید باز کنید

  23. Avatar for rezanaghshiy rezanaghshiy گفت:

    سلام ممنون میشم در مورد استفاده از DMA و نحوه استفادش در این مثال بیشتر توضیح بدین.

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

      در واقع DMA بایت های صدا رو از حافظه RAM برمیداره و توی DAC قرار میده ؛ ریت کپی دیتا هم توسط یه تایمر مشخص میشه !
      برای شروع لازم نیست که از dma استفاده کنید و این کار رو میتونید توسط یه تایمر و اینتراپت اون انجام بدید ؛ من از DMA استفاده کرد تا لود روی CPU کاهش پیدا کنه ولی خوب برای شروع میشه ازش صرف نظر کرد.

  24. Avatar for rezanaghshiy rezanaghshiy گفت:

    سلام،با تشکر از مطالب مفیدتون
    می خواستم در مورد ارسال فایل صوت به واحدDACتوضیحی بدین، وچرا داخل پروژه فایل STM32 Cube mx نیست
    تا بدونم چه پایه هایی رو استفاده کردین.
    واین که صوت رو به چه صورت به کد تبدیل کردین ونحوه استفاده از این کد ها به چه صورته.

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

      سلام و درود
      کتابخانه های مورد استفاده در این پروژه SPL هست که احتمالا دیگه توسط st پشتیبانی نمیشه ؛ البته من این پروژه رو بدون استفاده از Cube Mx نوشتم برای همینه که توابع مورد نظرتون رو نمیتونید پیدا کنید.
      صوت بعد از دکد توی یه بافر توی رم نگه داری میشه و با ریت مشخصی به DAC توسط DMA ارسال میشه ؛ یعنی یه بافر الاکلنگی توی رم داریم که متناوبا داره توسط dma به dac منتقل میشه و با خالی شدن هر بخش ؛ اون بخش توسط CPU و دکدر صوت مجددا پر میشه

  25. Avatar for rezanaghshiy rezanaghshiy گفت:

    یه دار تقویت صوت با lm386گذاشتم به پایه دک ولی میکروم سوخت.

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

      😐 ؛ نمیتونه دلیل سوختن میکرو اتصال آمپلی فایر باشه ؛ آمپلی فایر روی ورودی خودش خازن داره !
      احتمالا مشکل از جای دیگه ای باشه ؛ مدارتون رو قرار بدید تا بتونم نظر بهتری بدم

  26. Avatar for rezanaghshiy rezanaghshiy گفت:

    سلام،ممنون میشم یه مدار پخش صوت مناسب بهم معرفی کنید وبه چه صورت به میکرو وصل بشه که خروجی صدا داشته باشم.

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

      الان ماژول های پخش صوت زیادی به صورت آماده در بازار موجود است که ابعاد کوچکی دارند
      البته به شخصه باهاشون کار نکردم ولی فکر نمیکنم کار کردن باشون خیلی سخت باشه
      مثلا ماژول DFPlayer

  27. Avatar for احمد ربانی احمد ربانی گفت:

    سلام
    با توجه به این که dac در lpc1768 فقط یک خروجی دارد و حداکثر update rate آن ۱مگاهرتز است و همچنین ۱۰بیتی است مشکلی در کدگشایی و پخش صدا به وجود نمی‌آید؟

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

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

  28. Avatar for rezanaghshe rezanaghshe گفت:

    وچرا سر مدار بلند گو تعبیه نشده

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

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

  29. Avatar for rezanaghshe rezanaghshe گفت:

    سلام
    سوالی برام پیش اومده
    ممنون میشم در مورد قسمت بوت بیشتر توضیح بدید.

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

      بوت ، تنها کاربردش پروگرام کردن میکروکنترلر STM32 هست اگر بخوایم از پروگرارم SWD استفاده نکنیم و از طریق پورت سریال پروگرام رو انجام بدیم

  30. Avatar for rezanaghshiy rezanaghshiy گفت:

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

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

      نه لذوما ؛ این کار باعث میشه شما قادر باشید برنامه رو از طریق Uart هم آپلود کنید برای مواقعی که نخواید از SWD استفاده کنید یا در دسترستون نباشه

  31. Avatar for محمد محمد گفت:

    درود
    من سورس این mp3 player رو با آی سی dac به شماره pt8211 که یه مبدل r2r ladder هستش تست کردم با i2s و dma … بعد تو فایل mp3.c این خط باید حذف میشد تا برنامه به درستی کار میکرد
    AudioBuffer[j]=(unsigned short)AudioBuffer[j] ^ (unsigned short)0x8000;
    در کل کیفیتش از dac خود میکرو بهتر هست ولی اگه راهی بود که نمونه های خروجی تابع mp3decode از 16 بیت بیشتر میشد اون موقع با یه dac با رزولوشن 24 بیت میشد ازش خروجی با کیفیت بالا گرفت .

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

      بسیار عالی 🙂
      خوب البته خیلی بهتر میشد ولی کیفیت 16 بیت هم کیفیت بالایی هست 🙂 ؛ متاسفانه میکروی 103 دیگه توان پردازشی لازم برای دکد صوت 24 بیت رو نداره البته فکر میکنم ram لازم رو هم نداشته باشه.
      متشکر برای اطلاع رسانیتون ^_^

  32. Avatar for احمد ربانی احمد ربانی گفت:

    سلام
    چطور میتونم از این کد برای lpc1768 استفاده کنم؟

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

      سلام دوست عزیز
      با سادگی تمام ! تنها کافیه که قسمت های ارتباط با سخت افزار رو تغییر بدید ؛ مثل قسمت خوندن از کارت حافظه و البته پخش فایل های صوتی که از DMA و DAC استفاده شده ؛ باقی قسمت ها به سادگی فایل کامپایل هستند و جای نگرانی نیست

      1. Avatar for احمد ربانی احمد ربانی گفت:

        میشه کد lpc1768ش را هم بگذارید؟

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

          والا برد راه انداز برای LPC1768 ندارم اگر نه تبدیلش کار چندانی نداره.

      2. Avatar for احمد ربانی احمد ربانی گفت:

        سلام
        میشه کد lpc1768ش را هم بگذارید؟
        اگر نمیشه لطفا دقیق تر توضیح دهید که کدام قسمتها را باید تغییر بدهم. (فقط قسمت DAC.c را باید تغییر بدهم؟) با stm32 هم آشنایی ندارم.

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

          سلام ، اگر بتونم یه برد راه انداز برای LPC1768 پیدا کنم ؛ تبدیلش کاری نداره
          شما باید تمام قسمت هایی که با سخت افزار در ارتباط هست رو باز نویسی کنید
          ولی هسته دکدر نیاز به تغییر خاصی نخواهد داشت و به شکل کامل کار خواهد کرد.

          1. Avatar for احمد ربانی احمد ربانی گفت:

            میشه دقیقتر توضیح بدید؟
            دقیقا از کجا شروع کنم و چطوری برم جلو؟
            لطفا جوری توضیح بدید که من هم که مبتدی هستم بتونم در عمل پیاده کنم…

          2. Avatar for زئوس Zeus زئوس Zeus گفت:

            خوب شما باید شروع کنید تا متوجه منظورم بشید ؛
            ببیند بخش هایی که به وابسته به سخت افزار هست توی کد به خوبی مشخص هست ؛ یخش هایی مثل راه اندازی کارت حافظه – مبدل های دیجیتال به آنالوگ – تایمر ها و کنترل پورت ها مثل سریال و GPIO این بخش ها رو که تغییر بدید کلید کد به خوبی کار خواهد کرد و احتمالا دغدغه ای نمی مونه 🙂

  33. Avatar for محمد محمد گفت:

    درود
    برنامه روی میکروی stm32f105rbt6 اجرا شد و کیفیتش در حد قابل قبول هست البته اگه از یک dac به دقت 16 بیت با dma استفاده میشد با ارتباط i2s کیفیت خیلی بالاتر از این بود.امکانش هست که این کدها رو روی سری stm32f207 که cortex m3 هم هستن اجرا کرد یا کد اسمبلی باید تغییر کنه.
    با تشکر

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

      خیلی هم عالی 🙂 ؛ خوب بله البته همینطوره که میگید ولی سعی کردم تا جای ممکن از امکانات خود میکرو استفاده کنم تا ساخت نمونه اولیه خیلی ساده بشه
      در مورد این که روی میکروی مورد نظرتون بخواید ران کنید ؛ باید بگم که هیچ مشکلی نیست چون هسته ها یکی هستند مشکلی پیش نمیآد

  34. Avatar for میثم رستم زاده میثم رستم زاده گفت:

    سلام با تشکر از مطالب خوبتون. بنده هم با دو اینترنت مختلف ایرانسل و adsl چک کردم سورس کد دانلود نمیشد لطفا بررسی کنید با تشکر فراوان…

    1. Avatar for Sisoog OS Sisoog OS گفت:

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

  35. Avatar for دانیال دانیال گفت:

    سلام وقت بخیر ، ظاهرا لینک دانلود سورس کد خرابه

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

      سلام دوست عزیز
      هم اکنون دو لینک موجود در پست چک شد و مشلی مشاهده نشد.

  36. Avatar for احسان عسگری احسان عسگری گفت:

    سلام
    با تشکر از مطالب خوب و کاربردیتون
    من پروژه رو مطابق شماتیک بستم
    اما پیغام زیر رو میده
    àZeus@sisoog.com
    Play:start.mp3
    –Faild
    Try Play:start.wav –Faild
    فرمت میکرو اس دی fat32 هستش
    و داخل اون هم فرمت wav هستش و هم mp3

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

      سلام دوست عزیز
      اول این که اسم فایل ها رو باید start.mp3 و start.wav بگذارید
      فایل های mp3 تا بیت ریست 128 کیلو پشتیبانی میشه
      به غیر از این دو مساله – نکته دیگه ای وجود نداره ، فقط ممکنه قسمت sd کارت درست نباشه و فایل sd رو نشناسه

      1. Avatar for علی علی گفت:

        سلام . ممنونم بابت پست خوبتون .
        من هم همین مشکل رو دارم ، اسم فایل ها درست هستن ، هرکاری کردم جواب نگرفتم.
        ممنون میشم راهنمایی کنید

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

          فکر کنم برنامه رو دیباگ کنید زودتر به نتیجه میرسید – خیلی دلیل میتونه وجود داشته باشه و حدس زدنش کار سختیه

          1. Avatar for علی علی گفت:

            دقت نکرده بودم که تابع init_DAC در تابع wave کامنت هست ، اون رو برداشتم mp3 رو پلی کردم ، ولی بازم تو پلی کردن wave مشکل هست … ممنون از پاسخگوییتون ، موفق باشید.

          2. Avatar for زئوس Zeus زئوس Zeus گفت:

            خواهش میکنم – خوشحالم که مشکل حل شده
            فکر کنم قسمت ویو رو تغییر دادم – درست حضور ذهن ندارم

  37. Avatar for علی علی گفت:

    درود بر شما مهندس
    من یه مشکلی با رنگ نوشته های سایت دارم خیلی کم رنگ هست وبیشتر وقتها خواندن مطالب سخت هست البته نمیدونم شاید چون با موبایل وارد سایت میشوم اینطوری هست!
    در هر صورت مطالب سایت شما واقعا غنی میباشد.

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

      سلام دوست عزیزم
      ممنونم برای نظر سازنده شما ، تا حالا به این موضوع دقت نکرده بودیم ، توی موبایل نوشته های سیاه کامل نیستند و بیشتر خاکستری هستند ، این موضوع رو بررسی و رفع خواهیم کرد.
      انتقادات و نظرات شما ، باعث دلگرمی و ارتقاء ما خواهد شد.

      1. Avatar for محمد محمد گفت:

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

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

          سپاس دوست عزیز – حتما این مساله رو بررسی و رفع خواهیم کرد.

  38. Avatar for علی علی گفت:

    سلام
    خیلی عالی بود اگه میشه لطف کنید درباره ی اینکه چطور mp4 رو میشه دیکد کرد توضیح بدید

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

      سلام متشکرم
      بله حتما توی دستور کار قرار می دیم

  39. Avatar for اسی اسی گفت:

    سلام
    من با کیوب کار میکنم . زیاد از برنامه تون سر در نیاوردم راستش . ولی تو شماتیک دیدم که دو تا dacفعال هست . یعنی اینکه دوتا کانال دارید که همزمان میتونه دوتا صدا رو پخش کنه؟
    ای کاش وقت داشتید با توابع حال این برنامه رو انجام میدادید.
    امیدوارم موفق باشید

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

      سلام دوست عزیز
      بله هر دور DAC فعال است که برای پخش صوت های stereo لازم است که دو کانال چپ و راست را به صورت مجزا پخش نماییم ؛ در واقع یعنی همون دو صوت مختلفی که فرموردید
      خوب توابع HAL به لحاظ پرفرمنسی مقداری کند هستند البته نمی دونم سرعت لازم برای این برنامه رو فراهم می کننده یا خیر
      متاسفانه فرصت چنین کاری رو فعلا نداریم !

      1. Avatar for اسی اسی گفت:

        من میخوام این برنامه رو با توابع hal بنویسم , اگر موفق بشم در اختیارتون قرار میدهم که در سایت قرار دهید . فقط یه لطفی کنید کتابخانه ها را به ایمیلم بفرستید که من بتونم روش کار کنم ./ البته برنامه رو دانلود کردم کتابخانه ها رو دیدم ولی متوجه نشدم کدوم برای cimsis میباشد . و کدوم برای دیکدmp3نوشته شده است
        با تشکر فراوان

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

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

  40. Avatar for علی زارع علی زارع گفت:

    سلام
    میشه لطف کنید یه کم درباره ی دیکد کردن فایل های ویدئویی مثل mp4 h264 توضیح بدید

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

      کدک h264 یه کدک سنگین هست که فکر نمیکنم دکد اون با ریت بالا از عهده یه پردازنده M4 هم بر بیاد
      معمولا برای دکد این کدک های پیچیده ، از واحد های سخت افزاری استفاده می کنند
      شاید با سری های M7 چنین امکانی وجود داشته باشه که واحد Jpeg رو به صورت داخلی پشتیابنی می کنند.

  41. Avatar for سینا ج سینا ج گفت:

    سلام
    خیلی ممنون بابت پست های عالی ای که میذارید!
    یک سوال داشتم!
    من در حال حاضر دارم از لینوکس با توزیع debian استفاده میکنم. تونستم با موفقیت STM32Cube و gcc arm و پکیج های مورد نیاز برای کامپایلر رو نصب کنم. اما نمیدونم از چه IDE برای برنامه نویسی استفاده کنم (طبق پرس و جو هایی که کردم گفتن Eclipse خوبه اما نمیدونم از کجا باید دانلود کنم) و چطور تنظیمش کنم که به کامپایلر لینک بشه. همچنین نمیدونم برای ارتباط STLink با لینوکس باید درایوری نصب کنم یا نه. اگر ممکنه راهنمایی کنید. ممنون.

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

      سلام و درود خدمت شما دوست عزیز
      خوب برای نصب Eclipse دو راه هست یکی این که از مخازن debian استفاده کنید که معمولا ورژن های قدیمی قابل نصب هستند از این طریق ، و یا این که اخرین ورژن رو دانلود کنید و با استفاده از Openjre نصب کنید ، از اونجایی که STM32Cube رو باز کردید پس ابزار Open-jre بر روی سیستمتون نصب هست.
      برای دانلود آخرین ورژن Eclispe می تونید به این آدرس مراجعه کنید. فقط دقت داشته باشید اگر با لینوکس برید لینک دانلود لینوکسی بهتون میده و این که حتما ورژن C/C++ رو دانلود کنید.
      بعد از حالت فشرده خارج کنید و اجرا کنید به همین راحتی
      برای استفاده از ابزار های Programmer می تونید از Openocd استفاده کنید که تقریبا همه پروگرامر های موجود را پشتیبانی میکنه.
      اگر سوالی بود باز مطرح کنید حتما

      1. Avatar for سینا ج سینا ج گفت:

        آهان. ممنون از جوابتون. خودم یکم تحقیق کردم و دیدم شرکت st یه ide برای لینوکس تولید کرده به اسم system workbench که الان آخرین نسخش ۶ هست (البته دقیق نمیدونم خود st تولید و طراحیش کرده باشه یا نه ولی همه جاش لوگوی شرکتشون هست).اون رو نصب کردم و داخل خودش toolchain های آرم رو هم داشت و با موفقیت کد رو کامپاید و با stlink آپلود کرد. احتمالا وقتی رفتم سراغ lpc دوباره بیام دنبال نصب eclipse … بازم ممنون از کمکتون.

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

          خواهش میکنم ، خوب ادیتور ارائه شده از سمت شرکت ST پایه Eclipse هست و یه سری تنظیمات و شخصی سازی ها برای سادگی کار انجام دادن
          فکر کنم شرکت NXP هم همین کارو کرده و اونم ادیتوری با همین شکل داده باشه
          ولی اگر از Eclipse استفاده کنید ، قادر به کامپایل برای تمام خانواده آرم هستید.

  42. Avatar for محمد محمد گفت:

    فقط احتمالا برای حمل بر روی میکروی M4 شاید نیاز باشه برخی بخش ها رو که اسمبلی نوشته شده باز نویسی کنید.
    =============
    درود بر شما
    دقیقا مشکل من هم همین قسمت هستش.الان اگه کد اصلی رو از helix دانلود کنم کد اسمبلی دارن یا نه؟ اصلا این کدی که به صورت اسمبلی نوشته شده مربوط به چه قسمتی هستش .
    با تشکر

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

      خوب دوست عزیز ، من کمی اینترنت رو جستجو کردم ، خوشبختانه این همین کتابخونه برای میکروی 407 موجود هست و میتونید از این لینک دانلود کنید.
      خوب البته برنامه با GCC نوشته شده 🙂
      قسمتی که اسمبلی نوشته شده برای دکد هافمن هست و برای سرعت بالاتر با اسمبلی باز نویسی شده ، فکر کنم سورس اصلی به زبان سی موجود باشه ولی دقت داشته باشید ممکنه سورس سی سرعت لازم برای پخش بدون وقفه رو نداشته باشه ، و باز ممکنه توی میکروی 407 مشکل سرعت وجود نداشته باشه.
      اگر موفق شدید دانسته هاتون رو با ما به اشتراک بذارید.

  43. Avatar for محمد محمد گفت:

    درود
    کیفیت صدای ایجاد شده از این mp3 پلیر اونهم با dac 12 بیت خود میکرو چطور هست یعنی میتونه آهنگای با کیفیت 320 رو هم پخش کنه.راستی امکانش هست این برنامه رو روی میکروی stm32f205 یا stm32f405 با همین سورس کد اجرا کرد.

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

      سلام دوست عزیز
      دقت 12 بیت ، برای صوت دقت خوبی هست و شاید هر کسی قادر به شناسایی اختلاف بین 16 بیت و 12 بیت نبااشه ، در ضمن بیشتر صوت های موجود 8 بیتی هستند.
      این کد با بیت ریت 320 مشکلی نداره و به خوبی کار میکنه ، تا اونجا که خاطرم هست و این که وقتی این کد با میکروی 103 داره کار میکنه به راحتی قادره توی سری های بالاتر اجرا بشه و مشکلی وجود نداره ، فقط احتمالا برای حمل بر روی میکروی M4 شاید نیاز باشه برخی بخش ها رو که اسمبلی نوشته شده باز نویسی کنید.

  44. Avatar for سجاد سجاد گفت:

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

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

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

      1. Avatar for سعید حقیقی پور سعید حقیقی پور گفت:

        سلام مهندس وقت بخیر
        برای خروجی dac و اتصالش به اسپیکر درایورخاصی نیازه یا مستقیم وصلش کنم به بلندگو؟

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

          سلام – dac میکرو قادر نیست که جریان لازم برای راه اندازی یه بلندگو رو تامین کنه – برای همین اگر قصد اتصال اونو به بلندگو دارید بهتره که به یه آمپلی فایر وصلش کنید تا میکرو هم صدمه نبینه

  45. Avatar for سجاد سجاد گفت:

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

    با سپاس فروان و آرزوی موفقیت برای تیم سیسوگ

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

      به چند روش میشه انجام داد این کارو !
      روش پیشنهادی من اینه که از یه کانال دیگه برای پخش شماره ها استفاده کنید ، بعد خروجی ها رو با هم میکس کنید که صدای اعلام گر بر روی صدای موزیک بیفته
      البته راه دیگه ای هم هست و اون این که پخش mp3 رو که با یه تایمر زمان بندی شده متوقف کنید و صوت مورد نظرتون رو پخش کنید بعد دوباره تایمر رو اجرا کنید.
      اگر شماره ها به صورت Wav ذخیره شده باشند آسون تره ولی اگه mp3 باشن ، باید موقعیت موزیک در حال رو ذخیره کنید ، بعد دوباره از همون محل شروع به پخش کنید ، قبلا توضیح دادیم که فایل فریم فریم هست ، شماره فریم جاری رو ذخیره می کنید ، فایل مورد نظرتون رو پخش می کنید ، دوباره از همون فریم پخش رو ادامه می دهید.

      1. Avatar for علی علی گفت:

        سلام
        اگر امکانش هست ،روش دومی که گفتین با تایمر زمان بندی شده میشه این انجام داد و…رو بیشتر توضیح بدین .فایل های من همه wav هستن .تشکر بابت وقتی که میذارین

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

          خوب ببینید ما dac داریم که داده های دیجیتال رو به آنالوگ تبدیل میکنه – برای پخش فایل های wav هم یه تایمر داریم که داده ها رو از روی بافر رم میذاره توی dac – توی کد من تایمر dma رو تریگ میکنه و dma داده رو منتقل میکنه – خوب این تایمر رو که متوقف کنید پخش فایل متوقف میشه و فعالش کنید از همون جا شروع میشه به همین سادگی
          حالا وقتی متوقف شد شما dac رو با مقادر مورد نظر خودتون هندل کنید تا صدای مد نظرتون پخش بشه به همین خوشمزگی

  46. Avatar for بهروز بهروز گفت:

    ممنون عالی بود

    1. Avatar for زئوس زئوس گفت:

      خواهش میکنم دوست عزیز

  47. Avatar for سجاد سجاد گفت:

    یه سوال آیا خروجی ما در اینجا فقط حاوی نیم موج مثبته ؟ نمیشه هر دو نیم موج رو داشت ؟

    1. Avatar for زئوس زئوس گفت:

      خیر، خروجی به صورت تمام موج هست ، در واقع برای این که تمام موج رو داشته باشیم ما ولتاژ 1.65 رو به عنوان صفر در نظر گرفتیم که ولتاژ خروجی به صورت تمام موج وجود داشته باشه
      و برای حذف ولتاژ DC از یک خازن استفاده میکنیم

      1. Avatar for سجاد سجاد گفت:

        خوب اگر بخوام نیم موج منفی رو هم داشته باشم باید با یک OPAMP ولتاژ رو شیفت بدم درسته ؟ راه دیگه ای نیست ؟

        1. Avatar for زئوس زئوس گفت:

          نه دوست عزیز نیازی نیست ! اگر قصد تقویت سیگنال رو داشته باشید نیاز به آپمپ هست
          در غیر این صورت خروجی DAC شکل موج کامل رو خواهد داشت
          روی این لینکخروجی DAC موج سینوسی کلیک کنید.

          1. Avatar for سجاد سجاد گفت:

            خیلی ممنون من میدونم خروجی نیم موج منفی رو با آفست میبینیم اما من میخوام نیم موج منفی واقعا منفی باشه نمیدونم میتونم درست منظورم رو برسونم

          2. Avatar for زئوس زئوس گفت:

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

  48. Avatar for سجاد سجاد گفت:

    مرسی مرسی عالی بود

    1. Avatar for زئوس زئوس گفت:

      خواهش میکنم دوست عزیز

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

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