نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
آزادی حجاز از دست نااهلان
مهدی دمیرچیلو

آموزش آرم میکروکنترلر lpc1768 جلسه 6 uart قسمت3

به نام خدا : ادامه جلسه قبلی (و جلسه پایانی uart ) از سری مطالب آموزش آرم :
آموزش آرم میکروکنترلر lpc1768 جلسه 6 uart قسمت3

آموزش آرم میکروکنترلر lpc1768 جلسه 6 uart قسمت3


(UARTn Auto-baud Control Register (UnACR

به کمک این ریجستر و فعال کردن ویژگی Auto Baud، فعال میکنیم فرایند اندازه گیری clock/data rate برای محاسبه baud rate دیتای دریافتی و تنظیم کردن ریجسترهای مربوطه، کاربرد این ریجستر و این مد جایی هستش که فرستنده baud rate اش مشخص نیست، و ما مقدارش رو نمیدونیم، به کمک این ریجستر و این مد Auto Baud میتونیم به صورت خودکار مقدار baud rate فرستنده رو مشخص کنیم و baud rate گیرنده رو با فرستنده ست(برابر/یکسان) کنیم.
توجه 0 : این رجیستر R/W هستش.
UARTn Auto-baud Control Register
بیت 0 (Start) : این بیت به صورت خودکار پاک میشه بعد از این که Auto Baud کامل شد؛ نحوه مقدار دهی این بیت به صورت زیر هستش :
0 : غیر فعال کردن ویژگی Auto Baud
1 : فعال کردن ویژگی Auto Baud
توجه مهم : با توجه به توضیحات بالا، بعد از فعال کردن این ویژگی یه حلقه while میزاریم تو کدمون و تا زمانی که این بیت 0 نشده صبر میکنیم – یعنی تا زمانی که این ویژگی کارش رو با موفقیت پایان نداده صبر میکنیم؛ حالا کی این عملیات موفیقت آمیز میشه؟ وقتی که فرستنده حداقل 1 بایت دیتا ارسال کنه؛ حالا این کار میتونه یه مشکل بزرگ ایجاد کنه : اومدیم و تا 1 ساعت فرستنده به مدار ما دیتا ارسال نکرد، خب میکرو تو اون حلقه while گیر میکنه که، برا حل این مشکل از وقفه های مربوط به Auto Baud استفاده میکنیم. ( در قسمت پروژه ها بیشتر توضیح میدم !!! )
 
بیت 1 (Mode) : انتخاب مد Auto Baud
0 : مد 0
1 : مد 1
 
بیت 2 (AutoRestart) :
0 : بدون Restart
1 : (Restart in case of time-out (counter restarts at next UARTn Rx falling edge
 
بیت 3 تا 7 : رزرو شده.
 
بیت 8 (ABEOIntClr) : بیت پاک کردن پرچم مربوط به وقفه پایان Auto Baud ( این بیت write-only هستش. )
0 : تاثیری ندارد ( بدون کاربرد )
1 : وقفه متناظر در UnIIR رو پاک میکنه ( تا در دفعال بعدی وقفه بتونه رخ بده )
 
بیت 9 (ABTOIntClr) : بیت پاک کردن پرچم مربوط به وقفه TimeOut مربوط به Auto Baud ( این بیت write-only هستش. )
0 : تاثیری ندارد ( بدون کاربرد )
1 : وقفه متناظر در UnIIR رو پاک میکنه ( تا در دفعال بعدی وقفه بتونه رخ بده )
 
بیت 10 تا 31 : رزرو شده.
 
Auto Baud
تابع Auto Baud میتواند مورد استفاده قرار بگیرد برای اندازه گیری نرخ انتقال داده (Baud Rate) بر اساس پروتکول AT ( دستورات Hayes؛ برای مطالعه بیشتر درباره این به لینک مقابل برید : Hayes AT Commands ) و بعد از اندازه گیری رجیسترهای UnDLM و UnDLL رو مقدار دهی میکنه.
توجه : رجیستر UnFDR متصل نیست در زمان عملیات Auto Baud، بنابراین مورد استفاده قرار نمیگیرد وقتی ویژگی Auto Baud مورد استفاده قرار گرفته.
Auto Baud شروع میشه به وسیله 1 کردن بیت [UnACR[0 و غیر فعال میشه به وسیله 0 کردن ( پاک کردن ) همین بیت.
بیت [UnACR[0 به صورت خودکار بعد از پایان عملیات Auto Baud مقدارش پاک میشه؛ خوندن بیت [UnACR[0 هم وضعیت فعال/غیر فعال بودن این ویژگی رو به ما میگه.
دو مد برای Auto Baud در دسترس هستش که میتونیم به کمک بیت [UnACR[1 مُد مَد نظر رو تعیین کنیم ( فتحه کسره هم عجب کاربردی داره هاااا ^_^ )؛ در مد0 Baud Rate اندازه گیری میشه در دو falling edges متوالی روی پایه RXDn ( یه falling edges بیت شروع و یه falling edges کم ارزش ترین بیت )؛ در مد1 Baud Rate اندازه گیری میشه بین یه falling edge و rising edge بعدی روی پایه RXDn ( طول بیت شروع؛ بیت شروع یه لبه بالا پاین رونده داره و یه بالا رونده )

The UnACR AutoRestart bit can be used to automatically restart baud-rate measurement if a time-out occurs (the rate measurement counter overflows). If this bit is set the rate measurement will restart at the next falling edge of the UARTn Rx pin.

تابع Auto Baud میتونه دو وقفه تولید کنه :
1) وقفه TimeOut برای Auto Baud ( پرچمش بیت ABTOIntEn از رجیستر UnIER هستش؛ این پرچم مقدارش به وسیله بیت [UnACR[9 پاک میشه. )
2) وقفه پایان موفقیت آمیز Auto Baud ( پرچمش بیت ABEOIntEn از ریجستر UnIER هستش؛ این پرچم مقدارش به وسیله بیت [UnACR[8 پاک میشه. )
 
در حالت عادی ریجستر UnFDR غیر فعال هستش (DIVADDVAL = 0) در طول Auto Baud؛ با این حال اگه ریجستر UnFDR فعال باشه (DIVADDVAL > 0)،

it is going to impact the measuring of UARTn Rx pin baud-rate, but the value of the UnFDR register is not going to be modified after rate measurement.

همچنین، وقتی Auto Baud فعال شده، هرگونه تغییر در رجیسترهای UnDLM و UnDLL باید انجام شود قبل از نوشتن رجیستر UnACR
 
کمترین و بیشترین مقدار Baud Rate که پشتیبانی میشه توسط UARTn تابعی از PCLK، تعداد بیتها دیتا، تعداد بیتهای stop و parity هستش؛ که این محدودیت به صورت فرمول زیر هستش :
UARTn auto-baud function
مدهای Auto Baud

When the software is expecting an “AT” command, it configures the UARTn with the expected character format and sets the UnACR Start bit.

مقدار اولیه ریجستر های UnDLM و UnDLM اهمیت ندارد.

Because of the “A” or “a” ASCII coding (”A” = 0x41, “a” = 0x61), the UARTn Rx pin sensed start bit and the LSB of the expected character are delimited by two falling edges.

وقتی Auto Baud فعال میشه به کمک بیت [UnACR[0، پروتکول Auto Baud دستورات زیر رو به ترتیب اجرا میکنه :

1. On UnACR Start bit setting, the baud rate measurement counter is reset and the UARTn UnRSR is reset. The UnRSR baud rate is switch to the highest rate.

2. A falling edge on UARTn Rx pin triggers the beginning of the start bit. The rate measuring counter will start counting pclk cycles optionally pre-scaled by the fractional baud-rate generator.

3. During the receipt of the start bit, 16 pulses are generated on the RSR baud input with the frequency of the (fractional baud-rate pre-scaled) UARTn input clock, guaranteeing the start bit is stored in the UnRSR.

4. During the receipt of the start bit (and the character LSB for mode = 0) the rate counter will continue incrementing with the pre-scaled UARTn input clock (pclk).

5. If Mode = 0 then the rate counter will stop on next falling edge of the UARTn Rx pin. If Mode = 1 then the rate counter will stop on the next rising edge of the UARTn Rx pin.

6. The rate counter is loaded into UnDLM/UnDLL and the baud-rate will be switched to normal operation. After setting the UnDLM/UnDLL the end of auto-baud interrupt UnIIR ABEOInt will be set, if enabled. The UnRSR will now continue receiving the remaining bits of the “A/a” character.

Auto-baud UART LPC1768
 

(UARTn IrDA Control Register (UnICR

این ریجستر عملیات فعال سازی و پیکربندی مد IrDA رو انجام میده؛ مقدار این رجیستر نباید تغییر کند در طول ارسال یا دریافت اطلاعات، که ممکن است یا اطلاعات از بین بروند یا تداخل ایجاد بشه. ( تداخل تو چی؟ )
توجه 0 : این رجیستر R/W هستند.
UARTn IrDA Control Register
بیت 0 ( IrDAEn ) : 
0 : مد IrDA در UARTn غیر فعال است؛ UARTn به عنوان یه UART استاندارد کار خواهد کرد.
1 : مد IrDA در UARTn فعال است.
 
بیت 1 ( IrDAInv ) : 
0 : وقتي که اين بيت 0 ميشه ورودي ارتباط سريال معکوس نميشه
1 : وقتي که اين بيت 1 ميشه ورودي ارتباط سريال معکوس ميشه؛ اين بيت تاثيري در خرجي سريال ندارد
 
بیت 2 ( FixPulseEn ) : وقتي اين بيت 1 ميشه IrDA داراي عرض پالس ثابتي ميشه
 
بیت 3 تا 5 ( PulseDiv ) : اگه FixPulseEn=1 باشد، به کمک اين بيت ميتونيم عرض پالس رو تعيين کنيم؛ توضیحات زیر رو بخونید.
 
بیت 6 تا 31 : رزرو شده.
 
بیتهای PulseDiv از ریجستر UnICR مورد استفاده قرار میگیرند برای انتخاب عرض pulse وقتی که مد عرض ثابت pulse انتخاب شده است ( IrDAEn = 1 و FixPulseEn = 1 )؛

The value of these bits should be set so that the resulting pulse width is at least 1.63 µs.

جدول زیر، عرض pulse های ممکنه رو نمایش داده.
IrDA Pulse Width
توجه 2 : همون طور که در جدول بالا میبینید، اگه مد عرض pulse متغییر انتخاب شده باشد ( FixPulseEn  = 0 ) فرمول محاسبه عرض پالس دیتای ارسالی (بر حسب میکرو ثانیه) از فرمول زیر به دست میاد :
IrDA Pulse Width Formula
 

(UARTn Fractional Divider Register (UnFDR

این رجیستر برا افزایش دقیق و کاهش خطای Baud Rate و پیدا کردن بهترین مقدار برای ریجسترهای مرتبط با محاسبه Baud Rate هستش.

The UART0/2/3 Fractional Divider Register (U0/2/3FDR) controls the clock pre-scaler for the baud rate generation and can be read and written at the user’s discretion.

This pre-scaler takes the APB clock and generates an output clock according to the specified fractional requirements.

This register controls the clock pre-scaler for the baud rate generation.

توجه مهم : اگه این ریجستر فعال باشد ( DIVADDVAL > 0 ) و ریجستر UnDLM = 0 باشد، مقدار رجیستر UnDLL باید بزرگتر از 2 باشد. ( چرا ؟ )
توجه مهم 2 : همون طور که در زیر میبینید مقدار اولیه رجیستر DIVADDVAL=0 و  MULVAL=1 هستش؛ لذا موقع محاسبه Baud Rate و راه اندازی UART حتی اگه نخواین نرخ داده رو دقیق تر کنید و خطا رو کاهش بدید، و میخواین کار رو ساهد و سریع انجام بدید، لازم نیست این رجیستر رو مقدار دهی کنید، چون در حالت عادی این ویژگی خودش غیر فعال هستش.
UARTn Fractional Divider Register
به کمک فرمول زیر میتونید baud rate رو حساب کنید :
UART baud rate calculation formula
که PCLK فرکانس دستگاه جانبی ( در اینجا فرکانس UARTn ) هستش و رجیسترهای UnDLL و UnDLM که ریجسترهای اصلی تولید کننده baud rate هستن ولی خب برا دقیق تر کردن baud rate میتونیم از ریجستر UnFDR هم استفاده کنیم(بیت های DIVADDVAL و MULVAL )
مقدار MULVAL و DIVADDVAL ( بیت های 0:3 و 4:7 رجیستر UnFDR ) باید مطابق شرایط زیر باشد( اگه شروط زیر رو رعایت نکنید، فرمول بالا خروجی صحیحی نخواهد داشت و UARTn عملکرد صحیحی نخواهد داشت ) :

1) 1 ≤ MULVAL ≤ 15
2) 0 ≤ DIVADDVAL ≤ 14
3) DIVADDVAL < MULVAL

مقدار رجیستر UnFDR نباید اصلاح شود(تغییر داده شود) در طول ارسال/دریافت اطلاعات، زیرا ممکن از اطلاعات از دست بروند و یا تداخل رخ بده.
اگر DIVADDVAL = 0 باشد، آنگاه fractional divider غیر فعال میشود( همون طور که در توضیح رجیستر UnFDR گفتیم )، و در تعیین Baud Rate نقشی نخواهد داشت ( البته کلا نقشش زیاد پر رنگ نیست، برا افزایش دقت و کاهش خطا استفاده میشه رجیستر UnFDR و بیت هاش در فرمول4 ).
 
محاسبه Baud rate
UARTn میتونه راه اندازی بدون با یا بدون Fractional Divider (همون رجیستر UnFDR؛ این مورد رو قبلا هم گفته بودم)؛ الگوریتم زیر شرح میشه یه راه برای پیدا کردن و اعمال مقادیر DLM, DLL, MULVAL و DIVADDVAL؛ و با خطایی کمتر از 1.1% نسبت به نرخ داده اصلی، مقادیر رو به ما میده.
Algorithm for setting UART dividers
 
 
Fractional Divider setting look-up table
 
خب قبل این که بریم سراغ مثال ها، اول مدل دوم فرمول4 رو در زیر براتون میزارم، اگه عکس زیر رو با فرمول4 که در بالا گزاشتم مقایسه کنید فرقی نمیبینید، فقط تو فرمول زیر اومدم مخرج بردم تو خروجی و خروجی رو ابردم تو مخرج، فقط همین، خب این فرمول همون طور که میدونید برا محاسبه مقدار رجیسترهای سازنده BR ( همون نرخ انتقال داده ) هستش :
UART baud rate calculation formula
خب طبق فرمول بالا، مقدار PCLK که معلومه، مقدار BR هم هر مقداری دوست داشتیم قرار میدم، بعدش مقدار رجیستر های DLM, DLL, MULVAL و DIVADDVAL رو به درست میاریم و اعمال میکنیم، به همین راحتی و خوشمزگی ^_^
 
مثال 1 : اگر PCLK = 14.7456 MHz و BR = 9600 باشد :
بر طبق الگوریتم و همچنین فرمول بالا داریم :

DLest = PCLK/(16 x BR) = 14.7456 MHz / (16 x 9600) = 96

لذا DLest = 96 ( منظور از est همون مقدار تخمینی هستش )، خب از اونجایی که DL یه عدد صحیح هستش، لذا با توجه به الگوریتم بالا داریم : DIVADDVAL=0, MULVAL=1, DLM=0 و DLL=96 خب در زیر بریم بررسی کنیم ببینیم این مقادیر از کجا اومدن و چطوری محاسبه شدن :
توجه : خب تو الگوریتم بالا هم گفته شده اگه مقدار DL عددی صحیح بود داریم : DIVADDVAL=0, MULVAL=1 حالا چرا هر دو صفر نشدن؟ خب صد دفه تا الان گفتم، MULVAL در مخرج قرار داره و نمیتونه 0 باشه، 0 هم بهش بدی انگار یک دادی چون میکرو 0 رو 1 ترجمه میکنه تا حالت پیشبینی نشده ای رخ نده.
خب با توجه به تعیین شدن دو تا از مجهولامون، و دو تا مجهل دیگه و به صورت کلی فرمول زیر رو داریم ( پس از ساده سازی) :

256×UnDLM + UnDLL = 96

خب حالا باید دو مجهول فرمول بالا رو طوری مقدار دهی کنیم که رابطه بالا برقرار باشه، ساده ترین مقادیر هم همونی هستش که حساب کردیم یعنی DLM=0 و DLL=96؛ خب در این مثال تنها حالت همین هستش، لذا الکی زور نزنید ^_^، البته در حالت های مختلف ممکنه چند تا جواب داشته باشیم و همیشه این طور نیست که فقط یه جواب داشته باشیم.
 
مثال 2 : اگر PCLK = 12 MHz و BR = 115200 باشد :
طبق فرمول و الگوریتم بالا داریم :

DLest = PCLK/(16 x BR) = 12 MHz / (16 x 115200) = 6.51

از اونجایی که مقدار عددی صحیح نیست لذا باید پارامتر های FR رو تخمین بزنیم :

سوال : این FR و BR و DL مخفف چیا هستن؟
جواب : خب شکل زیر رو ببینی متوجه میشی، منم حال توضیح دادن ندارم جان داش ( رو عکس کلیک کنید و در اندازه اصلی ببینیدش ) :
آموزش ارتباط سریال lpc1768
خب حالا بر مبنای الگوریتم بالا میایم مقدار FR=1.5 در نظر میگیریم و در فرمول4 قرار میدیم، مقدار DL=4.34 به دست میاد، که چون DL باید عددی صحیح باشه مقدارش میشه 4 و حالا DL=4 رو در فرمول قرار میدیم و FR رو حساب میکنیم، مقدار FR=1.628 به دست میاد و طبق الگوریتم بالا چون رابطه زیر برقرار است لذا به مرجله بعدی میریم(طبق الگوریتم) و مقدار MULVAL و DIVADDVAL رو طبق “جدول لوکاپ” بالا محاسبه میکنیم.

1.1 < FR < 1.9

از آنجایی که مقدار FRest = 1.628 به صورت دقیق در جدول بالا موجود نیست لذا باید نزدیک مقدار رو برای این مورد پیدا و انتخاب کرد، برای FRest = 1.628 در “جدول look-up” بالا، نزدیک ترین مقدار FR = 1.625 هستش، که این میشه DIVADDVAL=5 و MULVAL=8
بر اساس این یافته ها، پیشنهاد میشه که تنظیمات به صورت مقابل اعمال شود : DLM = 0, DLL = 4, DIVADDVAL = 5 و MULVAL = 8
بر طبق فرمول4، نرخ داده 115384 هستش یعنی این نرخ، دارای خطایی به مقدار 0.16% نسبت به نرخ اصلی 115200 دارا هستش.

سوال : این 0.16% خطا از کجا اومد؟
جواب : بابا تو که ریاضیت از من ضعیف تره ^_^، خب از شوخی بگذریم، شکل زیر رو ببینی متوجه میشی :
محاسبه خطای نرخ انتقال داده ارتباط سریال میکروکنترلر LPC1768
 
فرمولش هم به صورت زیر میشه :
فرمول محاسبه خطای تبادل داده در usart
 
خب بعد از این همه داستان و روایت!، مطمئنا مبحث انتخاب و محاسبه و به دست آبردن Baud Rate رو با تمام جزئیات یادگرفتید، برید حالشو ببرید. smile برا سلامتیم که این همه توضیح نوشتم، صلوات ok البته اینا متون دیتاشیت بود، من یکم بال و پرش دادم bomb
 

(UARTn Transmit Enable Register (UnTER

این رجیستر و بیت TXEN همون طور که از اسمش هم پیدا هستش برا فعال/غیرفعال کردن ارسال اطلاعات هستش.
توجه 0 : این رجیستر R/W هستند.
UARTn Transmit Enable Register
بیت 0 تا 6 : رزرو شده.
 
بیت 7 : هنگام ریست شدن این بیت 1 میشه ( یعنی اجازه ارسال دیتا رو میده، لذا به همین خاطر هستش که من در اول مطلب گفتم بهتره به این رجیستر بگیم غیر فعال کردن ارسال، چون در حالت عادی اجازه ارسال اطلاعات رو به ما میده)؛ اگر این بیت 0 بشه در حالی که دیتایی شروع به ارسال کرده، اون دیتا به صورت کامل ارسال میشه و بعد از اون اجازه ارسال دیتایی به هیچ کاراکتری داده نمیشه ( پارتی بازی هم نداریم ^_^) تا زمانی که این بیت دوباره 1 بشه.
0 : غیر فعال کردن ارسال داده.
1 : فعال کردن ارسال داده.
ترجمه بقیه این بیت مونده – عکس بالا
 
بیت 8 تا 31 : نمیدونم این بیت 8 بیتی هستش یا 32 بیتی، جدول مربوطه داخل دیتاشیت هم دقیقا عینا شبیه جدول بالا هستش ولی نمیدونم چرا درباره وضعیت این بیتها چیزی ننوشته، حالا شما رزرو شده فرض کنید ^_^
 

معماری UARTn

معمای UARTn در بلوک دیاگرام زیر نمایش داده شده است؛ The APB interface provides a communications link between the CPU or host and the UART.
 

The UARTn receiver block, UnRX, monitors the serial input line, RXDn, for valid input. The UARTn RX Shift Register (UnRSR) accepts valid characters via RXDn. After a valid character is assembled in the UnRSR, it is passed to the UARTn RX Buffer Register FIFO to await access by the CPU or host via the generic host interface.

The UARTn transmitter block, UnTX, accepts data written by the CPU or host and buffers the data in the UARTn TX Holding Register FIFO (UnTHR). The UARTn TX Shift Register (UnTSR) reads the data stored in the UnTHR and assembles the data to transmit via the serial output pin, TXDn.

The UARTn Baud Rate Generator block, UnBRG, generates the timing enables used by the UARTn TX block. The UnBRG clock input source is the APB clock (PCLK). The main clock is divided down per the divisor specified in the UnDLL and UnDLM registers. This divided down clock is the 16x oversample clock.

The interrupt interface contains registers UnIER and UnIIR. The interrupt interface receives several one clock wide enables from the UnTX and UnRX blocks.

پرچم های مربوط به TX و RX داخل رجیستر UnLSR قرار دارد؛ فرمت دیتا UARTn هم توسط UnLCR تعیین میشود.
UART0, 2 and 3 block diagram
 

مطالب مرتبط : ( البته با این همه توضیحاتی که من دادم و حتی از خود دیتاشیت هم بیشتر توضیح دادم، نیازی به مطالب دیگه ای ندارید ولی خب همیشه با دیدن منابع دیگه میشه چیزای جدیدی یاد گرفت و حداقلش اینه که دیدنش ظرر نداره ^_^ )
1) LPC2148 UART Programming Tutorial ( انگلیسی - البته زیاد ربطی نداره به این سری LPC که ما کار میکنیم ولی خب دیدنش ظرر نداره)
2) کار با واحد ارتباط سریال UART در ARM LPC1768 ( فارسی - مختصر و مفید )
3) LPC1768: UART Programming ( انگلیسی - حتما ببینید )
4) Embedded System Tutorial UART ( انگلیسی )
 
نکته مهم : تو میکروکنترلر آرم سری lpc17xx بر خلاف میکروکنترلر های Avr، این طور نیست که اگه وقفه ای رخ داد و ما از تابع وقفه استفاده کردیم، به صورت خودکار فلگ اون وقفه پاک بشه، تو lpc از این خبرا نیست متاسفانه یا خوشبختانه؛ اگه هم وقفه ای باشه که به صورت خودکار فلگشو پاک کنه، اگه همچین موردی باشه، قطعا در مطالب(این مطلب و مطالب آینده) ذکر خواهد شد.
 

خلاصه مطلب uart میکروکنترلر lpc176x/5x

0) تنظیم فرمت دیتا : رجیستر [UnLCR[0:5
1) ارسال اطلاعات : رجیستر UnTHR

  • توقف ارسال اطلاعات : رجیستر UnTER
  • break کردن ارسال داده : [UnLCR[6؛ سوال فرق [UnLCR[6 با UnTER ؟

2) دریافت اطلاعات : رجیستر UnRBR
3) تنظیم Buad Rate : رجیستر های UnDLL و UnDLM

  • برای کاهش خطای Buad Rate : رجیستر UnFDR
  • برای دسترسی به UnDLL و UnDLM باید بیت [UnLCR[7 یا همون DLAB مقدارش رو 1 کنید و بعد از تنظیم رجیستر های UnDLL و UnDLM سریعا مقدارش رو 0 کنید.

4) وقفه ها
الف) وقفه اطلاع یافتن از دریافت اطلاعات :

  • فعال کردن این وقفه : [UnIER[0 با نام RBR Interrupt Enable
  • پرچم این وقفه : [UnLSR[0 با نام (Receiver Data Ready (RDR
  • پاک کردن این پرچم : با خوندن اطلاعات و خالی شدن رجیستر UnRBR از اطلاعات، این پرچم به صورت خودکار پاک میشه.

توجه 1 : برا اطلاع از خالی شدن کل فیفو ارسال داده ( UnTHR و UnTSR ) از بیت [UnLSR[6 با نام (Transmitter Empty (TEMT میتونیم استفاده کنیم.
توجه 2 : برا تنظیم RxTriggerLevel ( چند تا کارکاتر دریافت شود تا وقفه دریافت اطلاعات رخ بدهد) باید به بیت های [UnFCR[6:7 مراجعه کنیم.
ب) وقفه خالی شدن بایت بالایی حافظه فیفو ارسال :

  • فعال کردن این وقفه : [UnIER[1 با نام THRE Interrupt Enable
  • پرچم این وقفه : [UnLSR[5 با نام (Transmitter Holding Register Empty (THRE
  • پاک کردن این پرچم : این بیت وقتی پاک میشه که داخل [UnTHR[0:7 دیتای ارسالی جدیدی بنویسم.

ج) وقفه Auto Baud Finish( وقفه پایان یافتن Auto Baud با موفقیت ) :

  • فعال کردن این وقفه : [UnIER[8 با نام  ABEOIntEn
  • پرچم این وقفه : [UnIIR[8 با نام ABEOInt
  • پاک کردن پرچم : [UnACR[8 با نام ABEOIntClr

د) وقفه Auto Baud TimeOut :

  • فعال کردن این وقفه : [UnIER[9 با نام ABTOIntEn
  • پرچم این وقفه : [UnIIR[9 با نام ABTOInt
  • پاک کردن پرچم : [UnACR[9 با نام ABTOIntClr

ذ) وقفه RX line status ( خطاهای دریافت اطلاعات، از جمله خطای Overrun، Parity، Framing و Break Interrupt ) :

  • فعال کردن این وقفه : [2]UnIER با نام RX Line Status Interrupt Enable
  • پرچم های این وقفه : [UnLSR[1 با نام (Overrun Error(OE؛ [UnLSR[2 با نام (Parity Error(PE؛ [UnLSR[3 با نام (Framing Error(FE؛ [UnLSR[4 با نام (Break Interrupt (BI
  • پاک کردن پرچم : با خوندن پرچم های فوق، مقدارشون پاک میشه.

توجه : به کمک بیت [UnLSR[7 میشه فهمید که آیا خطایی در دریافت اطلاعات رخ داده یا نه؛ این بیت 1 میشه وقتی که حداقل یکی از خطاهای Overrun، Parity، Framing و Break Interrupt رخ داده باشد؛ مقدار این بیت با خوندنش و عدم وجود خطایی در دیتای دریافتی پاک میشه. ( در کل درستش اینه که بگم این پرچم اصلی وقفه فوق هستش، و اون پرچم های دیگه پرچم جزئی هستن ) >>> فرق این بیت با (Receive Line Status (RLS ؟؟؟
5) IrDA Mode (بعدا آموزشش رو قرار میدم – فعلا بدردتون نمیخوره ^_^ )
6) software flow control (بعدا آموزشش رو قرار میدم – فعلا بدردتون نمیخوره ^_^ )
 

پروژه هایی که باید بعد از خوندن این 3 مطلب حتما باید برید بخونید و راه بندازید : 
پروژه arm ارتباط سریال uart میکروکنترلر lpc1768 ق1
پروژه arm ارتباط سریال uart میکروکنترلر lpc1768 ق2
 
خب این قسمت آموزش UART یه قسمتش انجام شد، حالا حالا ها کار داریم با این UATRT الکی خوشهال نشید :-D؛ تا الان 5 جلسه و حدود 10-12 هزار واژه شده – حدود 1-2 هفته هم ازم زمان گرفتم، پدرم در اومد laugh جان داش کسایی که چیزی بلدن بیان یاد بدن، من همش بخوام برم یاد بگیریم و بیام یاد بدم خیلی ستمه. shout
تا مطلب بعد اگه زنده بودیم، یا علی.

گروه پرسش و پاسخ الکترونیکی در سروش
مهدی دمیرچیلو گوگل میفرماید : إِنَّ اللّه مَعَ الساچِرین ( خداوند با سرچ کنندگان است )
ارسال دیدگاه
4

1) نظرات غیر فارسی به صورت خودکار حذف میشوند ( حداقل 5 حرف فارسی وارد کنید ).

2) به موارد درخواست پروژه/کد آماده و سوالاتی که بلد نباشم پاسخ داده نمیشه.

3) برای گزاشتن کدهاتون از این سایت استفاده کنید ( طبیعتا لینک کدتون رو باید برای من بفرستید! ) : debian

4) پسورد فایل های سایت : www.dmf313.ir

  1. Avatar

    مهمان

    aramis

    سلام خسته نباشید. ممنون از مطلبای خوبتون. من به کمک احتیاج دارم. من میخوام با استفاده از واحد IrDA میکرو stm یک پالس که خروجی گیرنده IR (مثلا TSOP) هست رو به کد هگز تبدیل کنم و این کد رو ببینم ولی دقیقا نمیدونم باید چیکار کنم. میشه لطفا راهنماییم کنید؟ سخت افزارشو چجوری ببندم؟ من خروجی گیرنده IR رو به پایه Rx میکرو وصل کردم ولی هیچ نمیبینم. ممنون از راهنماییتون

  2. Avatar

    مهمان

    مهدی

    سلام مهدی جان
    خسته نباشی من تازه میخوام arm یاد بگیرم و فقط به خاطر اموزش های کامل تو تصمیم گرفتم با lpc1768 شروع کنم ولی احساس میکنم اموزش هات یه چیزی برای تازه کار ها کم داره.
    این که به غیر از اون هدر برد با چه \روگرامری برنامه ها رو بریزیم توش و چطوری و این که چه کام\ایلر هاو چه زبان هایی براش هست و خلاصه این چنین چیزایی

    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام – چی کمه؟ بگو تا بزارم سر وقت.
      پروگرامر JLINK -فیلمشو تو آپارات تو کانالم تو دسته بندی آرم – گزاشتم.
      IAR هم هستش – زبان تا جایی که میدونم فقط C/CPP
      رجیستر محور کار کنی – جابجا شدن بین کامپایلر ها چیز خاصی نیست.

  3. Avatar

    مهمان

    محمدرضا

    خسته نباشی داداش توضیحاتت کنار دیتاشیت خیلی به کار اومد …
    موفق و پیروز باشی