همانطور که میدانید استفاده از DMA برای انتقال اطلاعات بین وسایل جانبی میکروکنترلر (Peripheral) و حافظه موجب تسریع عملکرد میکروکنترلر خواهد شد. در این بخش مثل بخش قبلی میخواهیم از DMA برای ارتباط بین وسایل جانبی و حافظه استفاده کنیم. اما این بار برای ارسال اطلاعات از حافظه به واحد USART.
با ما همراه باشید.
مرحله اول) ایجاد پروژه در محیط STM32CubeMX
همانند قبل مراحل ایجاد پروژه را طی میکنیم و تنظیم دیباگ و کلاک را انجام میدهیم. سپس در منوی Connectivity، واحد USART1 را انتخاب کرده و پس از تنظیم پارامترهای این واحد مانند بخش قبلی، از تب DMA Setting کلید Add را میزنیم. از منوی کشویی Select، USART1_TX را انتخاب میکنیم. این بار DMA را در حالت Normal mode و جهت انتقال اطلاعات را Memory to peripheral انتخاب میکنیم. اکنون به تب Project Manger رفته و بقیه تنظیمات را مثل گذشته انجام میدهیم و در آخر GENERATE CODE را زده تا به محیط برنامه نویسی وارد شویم.
مرحله دوم) نوشتن کد پروژه
در این بخش نیز مثل قبل ابتدا باید به تنظیم واحد DMA بپردازیم. چون از واحد USART تنها برای ارسال اطلاعات استفاده میکنیم نیاز به نوشتن کد برای تنظیم آن وجود ندارد و با تنظیماتی که در محیط CubeMX انجام دادیم کدهای مورد نیازی برای این واحد، در پروژه ما ایجاد شده است.
قبل از هر چیز متغیرهای مورد استفاده را به کد اضافه میکنیم:
uint8_t message1[] = "\r\n Hey! This is a test message\r\n"; uint8_t ARRAYSIZE = sizeof(message1);
سپس درون int main (بعد از SystemClock_Config) و یا در بدنه تابع MX_DMA_Init، کد زیر را اضافه میکنیم :
LL_DMA_ConfigAddresses(DMA1, LL_DMA_CHANNEL_4, (uint32_t)message1, LL_USART_DMA_GetRegAddr(USART1), LL_DMA_DIRECTION_MEMORY_TO_PERIPH); LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_4, ARRAYSIZE); LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_4); LL_USART_EnableDMAReq_TX(USART1);
در آخرین خط، اجازه درخواست ارسال اطلاعات به DMA داده میشود. در این پروژه نیازی به نوشتن هیچ کدی در حلقه while(1) نیست و با تنظیماتی که انجام دادیم واحد DMA اطلاعات نوشته شده در حافظه را از طریق USART ارسال خواهد کرد. نتیجه اجرا را میتوانیم در ترمینال پورت سریال مشاهده کنیم :
در بخش بعدی در مورد واحد SPI و نحوه ارسال اطلاعات توسط آن، صحبت خواهیم کرد.
منبع:سیسوگ