بافر در USART میکروکنترلرها بافر نرم افزاری بافر سخت افزاری

توسط | 23 آذر, 1398 | AVR, lpc, STM32, آردوینو, میکروکنترلر, وبلاگ | 8 دیدگاه ها

بافر-میکروکنترلرها

آموزش STM32 یوبرد

شروع بازی ST

آموزش های رایگان STM32

فیلم های آموزش STM32

آموزش خصوصی STM32

اخبار جدید یوبرد در اینستاگرام

بافر در USART به معنای حافظۀ موقتی است که برای ذخیرۀ موقت داده های ارسال و دریافت استفاده می شود. کلاً بافر در میکروکنترلرها یک حافظۀ موقت است که می تواند داده هایی را در خود ذخیره کند. در اغلب موارد در پروتکل های ارتباطی نظیر پروتکل USART، SPI، TWI و … برای ذخیره سازی موقت اطلاعات نیاز داریم از بافر استفاده کنیم. اغلب اوقات میکروکنترلر در حال اجرای دستورهایی است و در حین دریافت داده در بخش گیرنده داده هایی که دریافت می شوند سریعاً خوانده نمی شوند. در صورت عدم وجود بافر، داده های جدید به جای داده های قدیمی قرار می گیرند و داده هایی که پیشتر دریافت شده اند پاک می شوند.

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

در میکروکنترلرها می توانیم با برنامه نویسی از بخشی از حافظۀ SRAM به عنوان بافر استفاده کنیم. در این صورت یک بافر نرم افزاری ساخته ایم. بافر نرم افزاری در واقع توسط برنامه نویس در برنامۀ میکروکنترلر به صورت متغیر نوشته می شود. داده ها پس از دریافت شدن در این متغیرها ذخیره می شوند. در ادامه به بررسی بافرهای سخت افزاری سه میکروکنترلر ATmega128، STM32F1 و LPC1768 می پردازیم و سپس دربارۀ بافر نرم افزاری توضیح می دهیم.

فیلم آموزش میکروکنترلرهای AVR مقدماتی

فیلم آموزش ARM STM32 مقدماتی

فیلم آموزش آردوینو مقدماتی

تعریف بافر

بافر یک حافظۀ موقت است که می تواند مقدار منطقی صفر یا 1 را در خود ذخیره کند. در میکروکنترلرها این حافظۀ موقت در جاهای مختلف وجود دارد. بسته به 8 بیتی یا 32 بیتی بودن میکروکنترلر بافرها نیز معمولاً 8 بیتی یا 32 بیتی هستند.

گیت-بافر

تصویر 1 – گیت بافر

بافر در USART

بافر در USART ممکن است هم در فرستنده وجود داشته باشد و هم در گیرنده. در  USART برای ارسال داده یک دادۀ (معمولاً) 8 بیتی در رجیستر ارسال USART می نویسیم. در AVR این رجیستر UDR نام دارد. بعد از نوشتن داده در رجیستر ارسال، این داده در  بافرهای ارسال قرار می گیرد. سپس از بافرهای ارسال در شیفت رجیستر ارسال قرار می گیرد. در نهایت دادۀ مورد نظر از شیفت رجیستر ارسال به پایۀ TX منتقل می شود. در دریافت نیز  ابتدا داده از پایۀ RX به شیفت رجیستر دریافت منتقل می شود. سپس از آنجا به بافرهای دریافت منتقل می شود. پس از آن در رجیستر دادۀ USART قرار می گیرد.

در واحدهای USART میکروکنترلرهای ATmega128 و STM32F1 بافر ارسال وجود ندارد. اما در واحدهای USART میکروکنترلر LPC1768 تعداد 16 بایت بافر ارسال وجود دارد. که به صورت شیفت رجیستر در کنار هم قرار گرفته اند.

بافر-uasrt-lpc1768

تصویر 2 – بافرهای ارسال در واحد UART شماره 1 میکروکنترلر LPC1768

در  بخش گیرنده در میکروکنترلر LPC1768 تعداد 16 بایت بافر و در میکروکنترلر ATmega128 تعداد یک بایت بافر وجود دارد. اگر شیفت رجیستر دریافت را هم یک بافر فرض کنیم، در ATmega128 دو بایت بافر داریم.

در برنامه ای که برای ارسال و دریافت USART نوشته می شود، تنها به رجیستر دادۀ USART دسترسی وجود دارد. و امکان خواندن داده ها از بافرها و یا نوشتن داده ها در آنها وجود ندارد.

کاربرد بافر در دریافت داده

در زمان هایی که داده دریافت می شود و وقت خواندن آن هنوز فرا نرسیده است، ابتدا داده در رجیستر USART قرار می گیرد. دادۀ بعدی نیز دریافت می شود. اگر دادۀ قبلی که در رجیستر دادۀ USART قرار گرفته است هنوز  خوانده نشده باشد، دادۀ جدید در بافر قرار می گیرد. داده های بعدی که دریافت می شوند پشت دادۀ قبلی در بایت دیگری از بافر قرار می گیرند. و به همین ترتیب داده ها در بافر ذخیره می شوند تا ظرفیت بافر پر شود. اگر ظرفیت بافر پر شده باشد، دادۀ بعدی در شیفت رجیستر دریافت باقی می ماند. داده های بعدی که روی خط RX قرار می گیرند جایگزین دادۀ موجود در شیفت رجیستر می شوند. بنابراین داده های موجود در شیفت رجیستر از بین می روند و امکان دریافت آنها وجود ندارد زیرا هم رجیستر دادۀ USART و هم بافرهای دریافت پر شده اند.

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

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

یکی از راه های به موقع خواندن دادۀ موجود در رجیستر دادۀ USART در AVR، با کار با وقفۀ USART میسر می شود. هر بار که دادۀ جدیدی در این رجیستر قرار گیرد، وقفه اتفاق می افتد و می توان مقدار رجیستر دادۀ USART را در روتین وقفه خواند.

کاربرد بافر در ارسال داده

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

بافر نرم افزاری

بافر نرم افزاری بخشی از حافظۀ SRAM میکروکنترلر است که برنامه نویس آن را توسط برنامه ای که نوشته است، به محل ذخیرۀ داده های ارسالی و دریافتی اختصاص می دهد. برنامه ای که نوشته شده به این صورت عمل می کند که هر داده ای که می خواهد بعداً ارسال شود و یا اکنون دریافت شده و قرار است بعداً استفاده شود، در جایی از حافظۀ SRAM به عنوان متغیر، متغیرهای آرایه ای، استراکچر و … ذخیره می شود.

بافر نرم افزاری در دریافت USART معمولاً به این صورت است که یک فریم از داده که دریافت شد، برنامه وارد روتین وقفۀ دریافت می شود و این بایت در یک متغیر جایگذاری می شود. دادۀ بعدی در متغیر دیگر و به همین ترتیب هر داده در یک متغیر ذخیره می شود. البته در اینجا از متغیر آرایه ای استفاده می کنند. یعنی دادۀ اول به عنوان عنصر صفرم آرایه، دادۀ دوم به عنوان عنصر یکم و … در آرایه ذخیره می شوند.

در مواردی هم از استراکچر (structure) آرایه ای و یا آرایه دوبعدی استفاده می شود. معمولاً زمانی که بخواهد چند متغیر آرایه ای را در کنار هم قرار دهند از استراکچر  و یا آرایۀ دو بعدی استفاده می کنند. برای مثال هر داده می تواند یک کاراکتر باشد این کاراکتر در یکی از اندیس های یک آرایه ذخیره می شود. چند کاراکتر در کنار هم یک کلمه را می سازند. پس یک آرایه یک کلمه است. ارایه ها در کنار هم می توانند تشکیل چند کلمه را بدهند. که قرار گرفتن آنها رد کنار هم می تواند به صورت استراکچر آرایه ای و یا آرایۀ دو بعدی باشد.

هنگام راه اندازی وقفۀ USART در کدویژن (در کدویزارد)، کدویژن به صورت خودکار یک بافر نرم افزاری به صورت یک آرایه می سازد. در کد ساخته شده می توان اندازۀ این بافر نرم افزاری را تغییر داد. با استفاده از دستورهای USART در کدویژن (و یا هر نرم افزار دیگری) و وقفۀ ارسال و دریافت، می توان برنامه ای نوشت که هیچ داده ای موقع ارسال و یا دریافت از بین نرود.

Data over run چیست؟

بحث data over run در USART در گیرنده معنی دارد. وقتی داده هایی را که از ورودی گیرنده دریافت شده اند نخوانیم و شیفت رجیستر دریافت پر شود، اگر دادۀ بعدی دریافت شود و دادۀ موجود در شیفت رجیستر را پاک کند، data over run اتفاق می افتد. Data over run در واقع یک خطاست و وقتی که اتفاق می افتد، در رجیسترهای Status موجود در بلوک USART یک بیت 1 می شود و با خواندن این بیت می توان متوجه شد که data over run اتفاق افتاده است.

تأثیر اندازۀ بافر در از دست رفتن داده ها

نکته ای که باید به آن دقت شود این است که نباید تصور کنیم میکروکنترلری که در USART (یا پروتکل ارتباطی دیگر) آن تعداد بافر بیشتری دارد حتماً داده های ارسال و دریافت آن از بین نمی روند. از بین رفتن داده های ارسال و دریافت به سرعت ارسال و دریافت و به سرعت خواندن و نوشتن داده ها در میکروکنترلر توسط برنامه نیز بستگی دارد. ممکن است در میکروکنترلری که بافر دریافت ندارد و بافر نرم افزاری برای آن نوشته نشده داده ها آن قدر کند دریافت شوند که میکروکنترلر فرصت زیادی داشته باشد آن ها را بخواند و داده ای از بین نرود. از طرفی ممکن است برای یک میکروکنترلر که هم بافر سخت افزاری و هم نرم افزاری دارد، آن قدر سرعت دریافت داده ها بالا باشد که میکروکنترلر فرصت نکند همۀ آنها را بخواند و بخشی از داده ها از بین برود.

از تعریف بافر در USART و کاربردهای آن نتیجیه می گیریم:

  1. بافر در USART هم به صورت سخت افزاری و هم به صورت نرم افزاری وجود دارد.
  2. بافرهای سخت افزاری از لحاظ ظرفیت ثابت هستند و امکان تغییر ظرفیت آنها وجود ندارد.
  3. بافرهای نرم افزاری از لحاظ ظرفیت قابل تغییر هستند.
  4. بافرها یکی از راه ها برای از دست نرفتن داده های دریافت و ارسال هستند.
  5. بافرهای نرم افزاری بخش هایی از حافظۀ دادۀ میکروکنترلر (SRAM) هستند که توسط برنامۀ نوشته شده ایجاد می شوند.
  6. از دست رفتن داده ها هم به ظرفیت بافرها و هم به سرعت خواندن و نوشتن داده ها مربوط است.
  7. Data over run در دریافت USART به معنی از دست رفتن داده های دریافتی است.
  8. با اتفاق data over run در USART، یک بیت در رجیسترهای وضعیت واحد USART یک می شود.
  9. در ارتباط سریال میکروکنترلر با کامپیوتر و یا ارسال اطلاعات بین دو میکروکنترلر و یا تبادل داده بین میکروکنترلر با هر ماژول دیگری، استفاده از بافر نرم افزاری به ویژه در دریافت داده ها اهمیت ویژه ای دارد.
  10. با فعال کردن وقفۀ سریال در کدویژن (کدویزارد)، نرم افزار کدی را در اختیار ما قرار می دهد که در آن از بافر نرم افزاری به صورت آرایه ای استفاده شده است.
  11. بافر در AVR و یا میکروکنترلرهای دیگر تنها به USART محدود نمی شود. می توان برای SPI و TWI نیز بافر نرم افزاری نوشت.

رضا اسدی

رضا اسدی

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

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

زیرساخت مطمئن صنعت

جدیدترین تاپیک های STM32

میکروکنترلر ARM

میکروکنترلر ARM چیست؟ پردازندۀ ARM

میکروکنترلر ARM ، میکروکنترلرهایی هستند که پردازندۀ آنها ساخت شرکت ARM است. شرکت ARM سازندۀ میکروکنترلر نیست. سازندۀ پردازنده (CPU) است. امروزه به میکروکنترلرهایی که پردازندۀ آنها طراحی شدۀ شرکت ARM باشد، میکروکنترلر ARM گفته می شود.

راه-اندازی-dac-stm32

راه اندازی DAC در STM32

راه اندازی DAC در STM32، ویژگی های DAC در میکروکنترلرهای STM32F1، بلوک دیاگرام DAC در STM32، اتصالات راه اندازی DAC در میکروکنترلر STM32F107VC، نمونه کد رجیستری راه اندازی واحد DAC در میکروکنترلرهای STM32F1، ساخت موج سینوسی با STM32، راه اندازی مبدل دیجیتال به آنالوگ STM32 با توابع HAL

راه-اندازی-usart-stm32

راه اندازی UART در STM32، رجیستری و HAL

راه اندازی UART در STM32، اتصالات و نرم افزار مورد نیاز، نمونه کد USART در STM32 به صورت رجیستری، نمونه کد رجیستری USART با وقفۀ دریافت، نمونه کد HAL برای راه اندازی USART در STM32، نمونه کد HAL با وقفۀ دریافت، نحوه محاسبه Baud rate در USART میکروکنترلرهای STM32F1

برنامه-نویسی-میکروکنترلر-ویژوال-استودیو

برنامه نویسی میکروکنترلرها با ویژوال استودیو

نصب VisualGDB روی ویژوال استودیو، ساخت پروژه برای برنامه نویسی میکروکنترلرها با ویژوال استودیو، ساخت پروژه برای STM32 در ویژوال استودیو، کدنویسی STM32 در ویژوال استودیو، ساخت پروژه برای AVR در ویژوال استودیو، ساخت پروژه برای LPC در ویژوال استودیو، ساخت پروژۀ آردوینو در ویژوال استودیو

8 دیدگاه ها

  1. سلام و تشکر بابت توضیحات شفافتون. اگر در مورد استفاده از بافر نرم افزاری و یا حتی بافر سخت افزاری مطلبی قرار بدید ممنون میشم.

    پاسخ
    • سلام. خواهش میکنم. تو نوشته های آینده نمونه کدهایی رو در قالب آموزش توضیح میدیم. همچنین دربارۀ بافر نرم افزاری و بافر سخت افزاری تو پروتکل های USART و SPI و … صحبت خواهیم کرد و پروژه هایی هم انجام میدیم.

      مبحث بافر توی کاربردهای حساس مثل کاربردهای خودروی برقی امروزی خیلی پیچیده تره و سازمان هایی هستند که برای انتقال داده و بافر و … نمونه کدها و قالب هایی رو میسازن و هر شرکت یا سازمانی به روش خاصی این کار رو انجام میده. در کل بحث بافر طولانیه و ما تا جایی که بتونیم از بافر نرم افزاری و سخت افزاری مطلب قرار میدیم. ولی برای رسیدن به این هدف که بخوایم خیلی به موضوع بافر بپردازیم، نیاز به دورۀ آموزشیه و خارج از حوصلۀ یک نوشته و چند نوشته س.

      پاسخ
  2. سلام آقای اسدی. پس توی نرم افرار کدویژن برای AVR توی قسمت کدویزارد توی پنجره مربوط به USART اون گزینه ای که بافر رو فعال می کنه و میتونیم براش سایز تعیین کنیم، بافر نرم افراری هست. درسته؟

    پاسخ
    • سلام بله دقیقاً. کدی که CodeWizard ایجاد میکنه، یه بافر نرم افزاری رو به صورت آرایه ای تعریف میکنه. ما توی بررسی نمونه کدهامون توی آموزش ماژول های SIM800، یه پله بالاتر رفتیم و بافر نرم افزاری رو از آرایه به استراکچر ارتقا دادیم. این کار باعث میشه میکروکنترلر به بهترین نحو داده های ارسالی ماژول های SIM800 رو دریافت کنه و تقریباً میشه گفت هیچ داده ای از دست نمیره.

      پاسخ
      • سلام ممنون از مطالبتون. انکانش هست توضیحات و نمونه کد برای گرفتن داده از sim800 رو جایی قرار بدین

        پاسخ
  3. مطلب کامل و عالی بود فقط حیف که مثالی برای هر بخش نیاوردید

    پاسخ
    • سلام. خیلی ممنون. لطف دارید. این نوشته در آینده ویرایش میشه و مباحث دیگه ای بهش اضافه میشه.

      پاسخ
  4. آیا برای ارتباط مدباس با ATMEGA16که فریم دیتایی دریافتی بیشتر از یک بایت است، باید اندازه بافر دریافتی را در کدویزارد تغییر داد ؟ و یا میتوان 8بیت 8بیت دیتا را به کمک UDR دریافت و در وقفه دریافت در یک آرایه ریخت ؟ آیا این دو یکسان هستند ؟

    پاسخ

یک دیدگاه بنویسید

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

دیگر آموزش های یوبرد

آموزش TFT LCD با TouchGFX و STM32 یوبرد

گرافیک کاربرپسند با میکروکنترلر ST

آموزش FreeRTOS یوبرد

زمان واقعی در میکروکنترلر و پردازنده های کوچک با FreeRTOS

آموزش طراحی PCB و نویز یوبرد

تجسم دنیای الکترونیک

آموزش زبان C و MISRA-C یوبرد

گام نخست دنیای میکروکنترلر

آموزش لحیم کاری و IPC-A-610 یوبرد

ساخت دنیای الکترونیک

آموزش آردوینو یوبرد

جادۀ آسفالت میکروکنترلر

آموزش ماژول های SIM800 یوبرد

تلفن همراه صنعت

آموزش زبان ++C و ++MISRA-C یوبرد

لمس شی گرایی در میکروکنترلرها

آموزش میکروکنترلرهای AVR یوبرد

شاهکار 8 بیتی Atmel

آموزش میکروکنترلرهای LPC یوبرد

یادگار فیلیپس

آموزش های شاخص

دانلود

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

زمان هر پیام صوتی 4 دقیقه است