همه چیز درباره دیکد نرم‌افزاری 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


 

حمایت از Zeus ‌

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

Zeus ‌

زئوس هستم ساکن المپ

دیدگاه ها

131 دیدگاه

  • Omid Azadeh
    Omid Azadeh
    ۲۸ آذر ۱۴۰۰

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

    • Zeus ‌
      Zeus ‌
      ۱ اردیبهشت ۱۴۰۱

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

  • Omid Azadeh
    Omid Azadeh
    ۲۶ اسفند ۱۳۹۹

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

    • Zeus ‌
      zeus
      ۵ خرداد ۱۴۰۰

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

      • Omid Azadeh
        Omid Azadeh
        ۱۷ خرداد ۱۴۰۰

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

  • م.الهی
    ۱۷ دی ۱۳۹۹

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

    • Zeus ‌
      زئوس Zeus
      ۱۷ دی ۱۳۹۹

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

      • م.الهی
        ۱۷ دی ۱۳۹۹

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

        • Zeus ‌
          زئوس Zeus
          ۲۰ دی ۱۳۹۹

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

  • م.الهی
    ۱۷ آبان ۱۳۹۹

    سلام مجدد
    میدونم خیلی سوال میپرسم 🙁 اما متاسفانه کارم گیر کرده و نمیدونم مشکل از کجاست
    من میخوام همین پروژه رو با 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 نمیتونم….
    خیلی خیلی ممنون میشم راهنمایم کنید

  • م.الهی
    ۱۰ آبان ۱۳۹۹

    سلام ممنون که پاسخگوی سوالات هستید
    من به یه سوال اساسی برخوردم توی کد، عملکرد تایمر 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;
    }
    ممون

    • Zeus ‌
      زئوس Zeus
      ۱۱ آبان ۱۳۹۹

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

      • م.الهی
        ۱۱ آبان ۱۳۹۹

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

      • م.الهی
        ۱۱ آبان ۱۳۹۹

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

        • Zeus ‌
          زئوس Zeus
          ۱۳ آبان ۱۳۹۹

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

  • م.الهی
    ۲۸ مهر ۱۳۹۹

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

    • Zeus ‌
      زئوس Zeus
      ۳۰ مهر ۱۳۹۹

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

  • محمد
    ۱۴ مهر ۱۳۹۹

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

    • Sisoog Os
      Sisoog Os
      ۲۲ مهر ۱۳۹۹

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

  • سعید
    ۱۳ مهر ۱۳۹۹

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

    • Zeus ‌
      زئوس Zeus
      ۲۳ آبان ۱۳۹۹

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

  • م.الهی
    ۷ مهر ۱۳۹۹

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

    • Zeus ‌
      زئوس Zeus
      ۱۳ مهر ۱۳۹۹

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

  • سعید
    ۵ مهر ۱۳۹۹

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

    • Zeus ‌
      زئوس Zeus
      ۶ مهر ۱۳۹۹

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

      • سعید
        ۶ مهر ۱۳۹۹

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

        • Zeus ‌
          زئوس Zeus
          ۶ مهر ۱۳۹۹

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

          • سعید
            ۶ مهر ۱۳۹۹

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

            0
          • Zeus ‌
            زئوس Zeus
            ۶ مهر ۱۳۹۹

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

            0
  • مژده
    ۳ مهر ۱۳۹۹

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

    • Zeus ‌
      زئوس Zeus
      ۶ مهر ۱۳۹۹

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

      • مژده
        ۷ مهر ۱۳۹۹

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

        • Zeus ‌
          زئوس Zeus
          ۱۳ مهر ۱۳۹۹

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

  • Emid
    ۲۱ اسفند ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۲۲ اسفند ۱۳۹۸

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

  • موسوی
    ۵ آبان ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۵ آبان ۱۳۹۸

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

      • حمید
        ۱۸ بهمن ۱۳۹۸

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

        • Zeus ‌
          زئوس Zeus
          ۳۰ بهمن ۱۳۹۸

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

  • نسا
    ۲۶ مهر ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۳۰ مهر ۱۳۹۸

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

  • نسا
    ۲۶ مهر ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۲۶ مهر ۱۳۹۸

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

  • نسا
    ۲۳ مهر ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۲۶ مهر ۱۳۹۸

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

  • نسا
    ۱۹ مهر ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۲۰ مهر ۱۳۹۸

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

  • reza
    ۲ مرداد ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۷ مرداد ۱۳۹۸

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

  • سام
    ۳۰ تیر ۱۳۹۸

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

    • سام
      ۳۰ تیر ۱۳۹۸

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

      • Zeus ‌
        زئوس Zeus
        ۳۰ تیر ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۳۰ تیر ۱۳۹۸

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

  • مهدی
    ۲۵ تیر ۱۳۹۸

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

    • Sisoog Os
      Sisoog OS
      ۲۵ تیر ۱۳۹۸

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

  • rezanaghshiy
    ۲۵ تیر ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۲۹ تیر ۱۳۹۸

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

  • rezanaghshiy
    ۲۱ تیر ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۲۳ تیر ۱۳۹۸

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

  • rezanaghshiy
    ۱۱ تیر ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۱۶ تیر ۱۳۹۸

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

  • rezanaghshiy
    ۱۱ تیر ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۱۶ تیر ۱۳۹۸

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

  • احمد .
    احمد ربانی
    ۱۱ تیر ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۱۶ تیر ۱۳۹۸

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

  • Rezanaghshe
    rezanaghshe
    ۶ خرداد ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۹ خرداد ۱۳۹۸

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

  • Rezanaghshe
    rezanaghshe
    ۶ خرداد ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۹ خرداد ۱۳۹۸

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

  • rezanaghshiy
    ۳۰ اردیبهشت ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۳۰ اردیبهشت ۱۳۹۸

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

  • محمد
    ۱۲ اردیبهشت ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۱۵ اردیبهشت ۱۳۹۸

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

  • احمد .
    احمد ربانی
    ۹ فروردین ۱۳۹۸

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

    • Zeus ‌
      زئوس Zeus
      ۱۱ فروردین ۱۳۹۸

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

      • احمد .
        احمد ربانی
        ۲ تیر ۱۳۹۸

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

        • Zeus ‌
          زئوس Zeus
          ۵ تیر ۱۳۹۸

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

      • احمد .
        احمد ربانی
        ۲ تیر ۱۳۹۸

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

        • Zeus ‌
          زئوس Zeus
          ۵ تیر ۱۳۹۸

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

          • احمد .
            احمد ربانی
            ۵ تیر ۱۳۹۸

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

            0
          • Zeus ‌
            زئوس Zeus
            ۹ تیر ۱۳۹۸

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

            0
  • محمد
    ۱۲ بهمن ۱۳۹۷

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

    • Zeus ‌
      زئوس Zeus
      ۱۳ بهمن ۱۳۹۷

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

  • میثم رستم زاده
    ۲۴ دی ۱۳۹۷

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

    • Sisoog Os
      Sisoog OS
      ۲۴ دی ۱۳۹۷

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

  • دانیال
    ۷ آبان ۱۳۹۷

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

    • Zeus ‌
      زئوس Zeus
      ۷ آبان ۱۳۹۷

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

  • احسان عسگری
    ۲۳ شهریور ۱۳۹۷

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

    • Zeus ‌
      زئوس Zeus
      ۲۳ شهریور ۱۳۹۷

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

      • علی
        ۲۷ دی ۱۳۹۸

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

        • Zeus ‌
          زئوس Zeus
          ۲۹ دی ۱۳۹۸

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

          • علی
            ۲۹ دی ۱۳۹۸

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

            0
          • Zeus ‌
            زئوس Zeus
            ۲۹ دی ۱۳۹۸

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

            0
  • علی
    ۱۹ تیر ۱۳۹۷

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

    • Zeus ‌
      زئوس Zeus
      ۱۹ تیر ۱۳۹۷

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

      • محمد
        ۱۳ شهریور ۱۳۹۷

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

        • Zeus ‌
          زئوس Zeus
          ۱۵ شهریور ۱۳۹۷

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

  • علی
    ۲۲ خرداد ۱۳۹۷

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

    • Zeus ‌
      زئوس Zeus
      ۲۳ خرداد ۱۳۹۷

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

  • اسی
    ۱۶ خرداد ۱۳۹۷

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

    • Zeus ‌
      زئوس Zeus
      ۱۹ خرداد ۱۳۹۷

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

      • اسی
        ۱۹ خرداد ۱۳۹۷

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

        • Zeus ‌
          زئوس Zeus
          ۲۳ خرداد ۱۳۹۷

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

  • علی زارع
    ۲۰ اسفند ۱۳۹۶

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

    • Zeus ‌
      زئوس Zeus
      ۲۶ اسفند ۱۳۹۶

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

  • سینا ج
    ۲ مهر ۱۳۹۶

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

    • Zeus ‌
      زئوس Zeus
      ۵ مهر ۱۳۹۶

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

      • سینا ج
        ۵ مهر ۱۳۹۶

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

        • Zeus ‌
          زئوس Zeus
          ۵ مهر ۱۳۹۶

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

  • محمد
    ۲۶ مرداد ۱۳۹۶

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

    • Zeus ‌
      زئوس Zeus
      ۲۶ مرداد ۱۳۹۶

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

  • محمد
    ۲۵ مرداد ۱۳۹۶

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

    • Zeus ‌
      زئوس Zeus
      ۲۶ مرداد ۱۳۹۶

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

  • سجاد
    ۲۶ تیر ۱۳۹۶

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

    • Zeus ‌
      زئوس Zeus
      ۲۶ تیر ۱۳۹۶

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

      • سعید حقیقی پور
        ۲۹ تیر ۱۳۹۹

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

        • Zeus ‌
          زئوس Zeus
          ۲۹ تیر ۱۳۹۹

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

  • سجاد
    ۲۳ تیر ۱۳۹۶

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

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

    • Zeus ‌
      زئوس Zeus
      ۲۳ تیر ۱۳۹۶

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

      • علی
        ۱۳ بهمن ۱۳۹۸

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

        • Zeus ‌
          زئوس Zeus
          ۱۳ بهمن ۱۳۹۸

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

  • بهروز
    ۵ تیر ۱۳۹۶

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

  • سجاد
    ۱ تیر ۱۳۹۶

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

    • Zeus ‌
      زئوس
      ۲ تیر ۱۳۹۶

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

      • سجاد
        ۳ تیر ۱۳۹۶

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

        • Zeus ‌
          زئوس
          ۴ تیر ۱۳۹۶

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

          • سجاد
            ۴ تیر ۱۳۹۶

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

            0
          • Zeus ‌
            زئوس
            ۴ تیر ۱۳۹۶

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

            0
  • سجاد
    ۱ تیر ۱۳۹۶

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

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش

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

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

Zeus ‌ Zeus ‌
  • 5 سال پیش

همه چیز درباره ریموت کنترل‌های هاپینگ

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

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 10 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

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

Zeus ‌ Zeus ‌
  • 3 سال پیش

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

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

Mahdi.h   Mahdi.h  
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

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

Zeus ‌ Zeus ‌
  • 1 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک