به نام خدا : قبلا مطالب آموزش و پروژه lpc1768 رو تو سایت میزاشتم، بعد رفتیم سمت آردوینو و یکم جذبش شدیم و بد نبود یه چیزایی یاد گرفتیم، دوباره برگشتیم سر خونه اول؛ قبلا آموزش و پروژه هایی درباره uart میکروکنترلر lpc1768 گزاشته بودم؛ آموزش ها که هیچی، همون ترجمه دیتاشیت بودن، اما پروژه ها و کتابخونش یکم جالب نبود و خوب نوشته نشده بود، تصمیم گرفتم یه کتابخونه درست و حسابی بنویسم برا تمام 4 تا uart های میکرو lpc1768 ( یوزارت 0 تا 3 ) البته این کتابخونه فقط rs232 هستش و همون طور که میدونید uart1 دارای rs485 هم هستش که خب این کتابخونه توی این مطلب فقط فقط مختص rs232 برا 4 تا تایمر میکرو هستش و تمام.
کتابخانه راه اندازی uart میکروکنترلر lpc1768
قبلا مطالبی درباب uart میکروکنترلر lpc1768 گزاشته بودم که در زیر میبینید :
- آموزش آرم میکروکنترلر lpc1768 جلسه 4 uart قسمت1
- آموزش آرم میکروکنترلر lpc1768 جلسه 5 uart قسمت2
- آموزش آرم میکروکنترلر lpc1768 جلسه 6 uart قسمت3
- پروژه arm ارتباط سریال uart میکروکنترلر lpc1768 ق1
- پروژه arm ارتباط سریال uart میکروکنترلر lpc1768 ق2
تو عکس زیر پایه های uart میکروکنترلر lpc1768 رو میبینید :
تو این کتابخونه از وقفه استفاده کردیم، وقفه دریافت، وقفه ارسال، و…؛ البته از ویژگی autobaud دیگه استفاده نکرد، نیازی نی بهش زیاد!؛ تقریبا سعی کردم تا حدودی شبیه کتابخونه سریال آردوینو باشه؛ اندازه بافرهای سریال رو میتونید تعیین کنید که برا این کار میرید تو فایل uart.h و کدهای زیر رو تغییر میدید :
1 2 3 4 |
#define UART0_BUFFER_SIZE 256 #define UART1_BUFFER_SIZE 256 #define UART2_BUFFER_SIZE 256 #define UART3_BUFFER_SIZE 256 |
کتابخونه به زیون ++C هستش لذا حتما باید پروژتون هم ++C باشه از کلاس استفاده کردم در نوشتن کتابخونه، کلاس هایی با نام های UART0, UART1, UART2, UART3 که برای استفاده از توابع هر کدوم از کلاس ها باید اول یه شیء از اون کلاس بسازید ( که خب میدونید اینو )؛ توابع تمام 4 تا سریال مث هم هستن.
من توابع یکی از کلاس ها ( UART0 ) رو توضیح میدم، برا بقیه UART ها هم عینا همینه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class UART0 { public : UART0(); void begin( uint32_t baudrate ); void begin( uint32_t baudrate, char NumberCharRxTrigger ); void end(); void SetBaudRate( uint32_t baudrate ); #if UART0_BUFFER_SIZE <= 256 // 8bit uint8_t available(); #elif UART0_BUFFER_SIZE <= 65536 // 16bit uint16_t available(); #else // 32bit uint32_t available(); #endif void write(uint8_t data); //--- void print(uint8_t *data); void println(uint8_t *data); //--- void printNumber(int32_t data, uint8_t base=10); void printFloat(double NumberSend_Float, uint8_t FloatDigit); uint8_t read(); void clear(); }; |
خب همونطور که میبینید یه سری توابع داریم که از اسمشون کارون معلومه، لذا دیگه توضیحی نمیدم خخخ فقط اینو بگم که همیشه قبل از خوندن ( استفاده از تابع read ) قبلش از تابع available استفاده کنید ببینید چند تا دیتا برای خوندن وجود داره بعد از تابع read استفاده کنید تا مشکلی رخ نده.
آلبته کتابخونه مشکلاتی هم داره، مثلا حتی اگه شیء یی هم از کلاس ها ایجاد نکنید باز آرایه دریافت سریال ( UARTn_Buffer_Read ) ایجاد میشه چون داخل کلاس تعریف نشده چون هر چی خواستم داخل کلاس تعریفش کنم نتونستم که خب کدنویسی ما هم همین قدره دیگه خخخ سعی هم کردم ولی خب نشد دیگه این مورد دست اونایی که ++C شون خوبه رو میبوسه ( بزگترین مشکلش همینه بنظرم )
خب یه تقدیر و تشکری کنیم از نویسنده مطلب مقابل که منو از الافی 1روزه در ابرد با این مطلب خوبش، موردی که هستش بحث نوشتن وقفه ها در زبون ++C هستش که یکم با C فرق داره که برا این مورد مطلب مقابل رو بخونید که دونستش ظرر نداره براتون : نوشتن روتین وقفه در زبان C++ برای میکروکنترلر
این کتابخونه رو من تست کردم کار میده، سعی کنید فرکانس میکرو روی 100 میگ تست کنید – من روی این فرکانس تست کردم مشکلی نبود، هر چند که برا فرکانس های دیگه هم نباید موردی باشه؛ امیدوارم این کتابخونه مفید باشه براتون؛ پروژه هم نمیزارم چون حسش نی – چیز ساده ای هستش – پروژه نمیخواد خداییش خخخ – فعلا یا علی.
============================
بروزرسانی در پنج شنبه – ۱ آذر ۱۳۹۷
تغیراتی در کتابخونه قبلی دادم که میتونید از زیر دانلود کنید ( البته این کتابخونه فعلا نیاز به ویرایش و اصلاح شدن داره )
در فایل h. هم در آخر هر کلاس یه شیء استاتیک تعریف کردم تا دیگه مشکل استفاده از مثلا UART0 تو چند تا فایل جدا رو نداشته باشید، البته اگه نیاز نداشتید به این مورد میتویند شیء های استاتیک فوق رو حذف کنید.
1 2 3 4 |
static uart0 static uart1 static uart2 static uart3 |
که مثلا میخواین تو پروژتون از UART0 برا LCD استفاده کنید میاید ماکرو زیر رو اول پروژتون ( بعد از تعریف کتابخونه سریال! ) تعریف میکنید برا ترتمیز شدن پروژه و راحتی کار، که دیگه ماکرو lcd همون شیء شما هستش و ازش استفاده میکنید :
1 |
#define lcd uart0 |
مهمان
سلام
ببخشید من یه نیازی به تابع printf دارم میشه از این تابع تو نرم افزار کیل و به خصوص stm32 استفاده کرد اگه میشه میتونم ازتون بخوام کمکم کنید
مهمان
سلام و خسته نباشید خدمت آقا مهدی. من تازه شروع کردم به استفاده از زبان c++ برای میکروکنترلر بهمین خاطر زیاد مسلط نیستم سوالم اینکه من یه کتابخونه بزبان c++ نوشتم حالا میخوام از توابع عمومی اون توی یک کتابخونه دیگه استفاده استفاده کنم با اینکه هدر کتابخونه اول رو در کتابخونه دوم اضافه می کنم بازم توابع کتابخونه رو نمیشناسه. ممنون میشم راهنماییم کنید. یا یه لینکی چیزی برام بزارید.