آموزش STM32 با توابع LL قسمت شانزدهم: استفاده از DMA برای ارسال اطلاعات از حافظه توسط واحد USART

آموزش STM32 با توابع LL قسمت شانزدهم: استفاده از DMA برای ارسال اطلاعات از حافظه توسط واحد USART

آموزش STM32 با توابع LL قسمت شانزدهم: استفاده از DMA برای ارسال اطلاعات از حافظه توسط واحد USART
آموزش STM32 با توابع LL قسمت شانزدهم: استفاده از DMA برای ارسال اطلاعات از حافظه توسط واحد USART

همانطور که میدانید استفاده از DMA برای انتقال اطلاعات بین وسایل جانبی میکروکنترلر (Peripheral) و حافظه موجب تسریع عملکرد میکروکنترلر خواهد شد. در این بخش مثل بخش قبلی میخواهیم از DMA برای ارتباط بین وسایل جانبی و حافظه استفاده کنیم. اما این بار برای ارسال اطلاعات از حافظه به واحد USART.

با سیسوگ همراه باشید.

 

مرحله اول) ایجاد پروژه در محیط STM32CubeMX

همانند قبل مراحل ایجاد پروژه را طی می‌کنیم و تنظیم دیباگ و کلاک را انجام میدهیم. سپس در منوی Connectivity، واحد USART1 را انتخاب کرده و پس از تنظیم پارامترهای این واحد مانند بخش قبلی، از تب DMA Setting کلید Add را می‌زنیم. از منوی کشویی Select، USART1_TX را انتخاب می‌کنیم. این بار DMA را در حالت Normal mode و جهت انتقال اطلاعات را Memory to peripheral انتخاب می‌کنیم. اکنون به تب Project Manger رفته و بقیه تنظیمات را مثل گذشته انجام می‌دهیم و در آخر GENERATE CODE را زده تا به محیط برنامه نویسی وارد شویم.

تنظیم DMA

تنظیم DMA

 

مرحله دوم) نوشتن کد پروژه

در این بخش نیز مثل قبل ابتدا باید به تنظیم واحد DMA بپردازیم. چون از واحد USART تنها برای ارسال اطلاعات استفاده می‌کنیم نیاز به نوشتن کد برای تنظیم آن وجود ندارد و با تنظیماتی که در محیط CubeMX انجام دادیم کدهای مورد نیازی برای این واحد، در پروژه ما ایجاد شده است.

قبل از هر چیز متغیرهای مورد استفاده را به کد اضافه می‌کنیم:

سپس درون int main (بعد از SystemClock_Config) و یا در بدنه تابع MX_DMA_Init، کد زیر را اضافه می‌کنیم :

در آخرین خط، اجازه درخواست ارسال اطلاعات به DMA داده می‌شود. در این پروژه نیازی به نوشتن هیچ کدی در حلقه while(1) نیست و با تنظیماتی که انجام دادیم واحد DMA اطلاعات نوشته شده در حافظه را از طریق USART ارسال خواهد کرد. نتیجه اجرا را می‌توانیم در ترمینال پورت سریال مشاهده کنیم :

در بخش بعدی در مورد واحد SPI و نحوه ارسال اطلاعات توسط آن، صحبت خواهیم کرد.

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

حمایت از سیاوش

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

0 نفر

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

توجه

سیاوش
سیاوش

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

دیدگاه ها

5 دیدگاه

  • Mohsen
    ۹ دی ۱۴۰۰

    با سلام. من خاستم از dma برای حالت rx در usart استفاده کنم ولی موفق نشدم . آیا نکته ای وجود داره

    • سیاوش ایرانپاک
      سیاوش
      ۲۶ دی ۱۴۰۰

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

  • محسن
    ۶ دی ۱۴۰۰

    سلام بازم ممنون از اطلاعاتی که به اشتراک میزارید . اگه من در حالت ارسال circular رو انتخاب نکنم . بعد هر وقت خاستم با dma ارسال کنم همون نوشتن خط اخری تو برنامه بالا کافیه ؟ ممنون

    • سیاوش ایرانپاک
      سیاوش
      ۸ دی ۱۴۰۰

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

      • Mohsen
        ۸ دی ۱۴۰۰

        سلام ممنون بله ابهام برطرف شد . فقط جهت اطلاع اینکه چه اینتراپت فعال باشه چه غیره فعال در حالت normal برای استفاده مجدد از دستورات بالا باید پرچم اتمام ارسال حتما پاک بشه . در غیره این صورت ارسالی صورت نمی‌گیرد. من با stm32f205rbt تست کردم‌.همچنین در این میکرو کنترلر خط سوم دستورات بالا به این صورت تغییر کرد
        ll_dma_enablestream(dma2,ll_dma_stream_0);

پر بحث ترین ها

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Mahdi.h   Mahdi.h  
  • 2 سال پیش
سیـــســـوگ

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