به نام خداوند بخشنده و مهربان!

عزیزان و هموطنان گلم، سلام...!

یه نکته جالب میخوام براتون بزارم انشالله که به کارتون میاد و قطعا میتونید با این نکته کتابخونه هاتون رو سروسامون بدید و تنظیمات اولیه و اتصالات پایه ها مثلا برای یه ماژول رو به شدت آسان و بدون درگیری با کد بنویسید!

راسش کسایی که قبل از اینکه بیان توی ARM از میکروکنترلر های AVR استفاده میکردند یادشون هست که توی CodeVision برای برنامه نویسی میکرو یه قسمت به نام CodeWizard داشت که وقتی میخواستی بخش های مختلف میکرو از جمله UART و PWM و... رو راه اندازی کنی به صورت بسیار ساده و به صورت گرافیکی مقدار های مورد نظر رو در قسمت CodeWizard قرار میدادیم و خود برنامه کدش رو برامون میساخت و کار کردن با واحد های جانبی avr دیگه خیلی آسون میشد و فکر کردن به راه اندازیش دیگه ترس نداشت چون دیگه ما رو با رجیستر های مختلف و زیاد درگیر نمیکرد!

شاید با خودتون گفته باشید ای کاش برنامه کیل یوویژن (میکرو ویژن) هم این ویژگی رو داشت! یه مژده کیل علاوه بر این ویژگی به شما این اجاره رو میده که خودتون صفحه ی ویزارد (Wizard) رو طراحی کنین یعنی توی Codevision برنامه میکروکنترلر های AVR یه چیز ثابت بود! مثلا شما فقط میتونستید بخش جانبی PWM رو راه اندازی کنید ولی اگه میخواستید مثلا یه ماژول بلوتوث رو راه اندازی کنید باید خودتون برنامه اش رو مینوشتید و دیگه مثل PWM نمیتونستید از زیرش در بریدs14 ولی توی کیل شما خودتون میتونید هرچی میخواید به ویزاردتون اضافه کنید و برای هر کتابخونه و ماژولی یه ویزارد بنویسید تا دیگه با نوشتن یه کتابخونه با ویزارد دیگه توی همه پروژه هاتون ازش استفاده کنید و حتی توی اینترنت برای دوستانتون هم به اشتراک بگذارید! خوب شاید بپرسید قبلش هم میتونستیم همه ی این کارا رو بکنیم! باید بگم که نه، قبلش چون مثلا پایه ها رو دیفاین (define#) کرده بودیم واقعا خوانایی کد به شدت پایین بود! و مشکلاتی از این قبیل ولی حالا شما میتونید با این ویژگی کیل از این مشکلات رهایی یابید!

خوب بریم سر بحث اصلی: راستش اگه الان شما یه پروژه ی کیل رو باز کنید و فایل system_LPC17xx.c رو به عنوان مثال بازکنید Configuration Wizard  رو در پایین صفحه میبینید

خوب اگه برید توی اون قسمت با چیزی مثل شکل زیر مواجه میشید!

خوب این همون چیزیه که دو ساعت راجع بهش حرف میزدیم!

الان من میخوام آموزش اینو بدم که چطور میشه همچین چیزی برای کتابخونه یا لایبراری خودمون ایجاد کنیم! فقط در اول کار یه نکته بگم: بهترین مثال برای یادگیری این ویژگی همین فایل هست یعنی فایل system_LPC17xx.c که خوب هرچی بخواید رو میتونید توی این ببینید و کد مربوطه اش رو کپی کنید و توی کتابخونه خودتون ازش استفاده کنید!

راهنمایی: برای یادگیری بهتر این موضوع میتوانید در قسمت Configuration Wizard گزینه Help را کلیک کنید و درباره این موضوع اطلاعات بیشتری کسب کنید!

اگه از قسمت Configuration Wizard به Text Editor برید کد هایی میبینید که معمولا سبز رنگ هست یعنی میشه گفت اینا کامنت هستن چون همه با // شروع شدن! خوب همونطور که میبینید برای ساخت ویزارد باید یه سری کد نوشت! ولی این کد ها به زبان C نیستند پس به چه زبونی هستن؟ راستش من فک میکنم که زبان خاصی نباشه چون اصلا چیزه خاصی نداره! برای نوشتن اینجور کد ها باید به نکات زیر دقت کنید!

1- حتما باید برای شروع از کد زیر استفاده بشه

// <<< Use Configuration Wizard in Context Menu >>>

2- برای پایان هم حتما باید از کد زیر استفاده بشه

// <<< end of configuration section >>>

خوب برای شروع خوبه ابتدا به یک نمونه توجه کنیم!

// <e> Clock Configuration

خوب اون متنی که نوشته چیزه خاصی نیست میتونید عوضش کنید! نکته مهم اون <e> هست که اولش اومده! کارش اینه که یه هدر درست کنه با قابلیت تیک فعال/غیر فعال کردن! و اگه توی ویزارد هم برید میتونید اینو ببینید!

خوب به نمونه ی بعدی توجه کنید!

//   <h> System Controls and Status Register (SCS)

خوب دوباره چیزی که مهم <h> هست. کار h دقیقا مثل e میمونه و فرقش با e اینه که h دیگه تیک فعال کردن و غیر فعال کردن نداره! (توی عکس بالا این موضوع مشخصه)

راستی نکته ای که باید بهش توجه کنید اینه که خوب همونطور که <h> یا <e> از یه جایی شروع میشن خوب باید یه جایی هم تموم بشن دیگه! (مثل برنامه نویسی) خوب پس باید برای تموم شدنشون قبل از h یا e حرف / رو بزاریم! مثل زیر:

</h> or </e>

بریم سراغ نمونه ی بعدی! به کد زیر توجه کنید!

//     <o2.0..1>   CLKSRC: PLL Clock Source Selection
//                     <0=> Internal RC oscillator
//                     <1=> Main oscillator
//                     <2=> RTC oscillator

خوب توی کد بالا چند تا نکته وجود داره!

1- حرف <o> نشونه ی چیه؟ خوب این حرف هم مثل حروف قبلی یه کاری انجام میده ولی خوب این دفعه این حرف عوض یه کار دو تا کار انجام میده کار اولش قابلیت انتخاب از منو هست و کار دومش ورودی عدد هست! در تصویر زیر دو نمونه رو مشاهده میکنید!

هر دو با حرف o درست میشه فقط توی کد نویسی اش فرق داره! برای ساخت منوی انتخاب کشویی از کد بالا استفاده میشه! خوب شاید بپرسید دیگه o2 یعنی چی؟ راستش برای اینکه بفهمیم کی به کیه نیاز برای هر کدوم به ترتیب یه عدد بزاریم که از صفر شروع میشه دو کد قبلی هم 0 و 1 بودن و این 2 میشه یعنی سومیشه!

خوب احتمالا سوال بعدیتون اینه که o2.0..1 دیگه یعنی چی؟ خوب راستش اگه در کد بالا به گزینه های زیرش نگاه کنید نوشته 0 و 1 و 2 یعنی به باینری میشه 00 و 01 و 10 خوب اگه دقت کنید هر سه گزینه کلا 2 بیت میشه و اگه بخوایم مثلا توی متغییر بریزیم کافیه بیت 0 و 1 رو استفاده کنیم! یعنی فقط به دو بیت اول و دوم که میشه بیت 0 ام و 1 ام نیاز داریم! پس کا نوشتیم از بیتم 0 ام تا 1 ام یعنی میتونستیم بنویسیم 0 تا 4 یا اصلا 1 تا 2 مشکلی پیش نمی اومد فقط در آخر میگم چرا اینکار رو نکردیم!

برای حالت دوم یعنی بخ صورت ورودی عدد (مثل عکس بالا اون مربع پایینی) از کد زیر استفاده میکنیم!

//     <o7.0..7>  CCLKSEL: Divide Value for CPU Clock from PLL0
//                     <3-256><#-1>

خوب o که همون قبلیه هست.  <256-3> هم یعنی حداقل 3 تا حداکثر 256. و اون <1-#> هم یعنی عددی که اون توی کادر وارد میکنه رو منهای 1 کن و به من بده! حالا اینکه چطور میتونیم این عدد بدست آمده رو بگیریم رو باید وایسید تا آخر من بگم!

نکته : اگه دقت کنید اینجا ما حداکثر تا 256 داریم که منهای 1 میشه 255 یعنی ما برای ذخیره این عدد به 8 بیت نیازمنیدم، بنابراین خط اول نوشته از 0 تا 7 یعنی هشت بیت!

و برای آخرین بحث به کد زیر توجه کنید!

//     <o11.3>      PCUART0: UART 0 power/clock enable

خوب جالب اینه که o کاربرد سومی هم داره! خوب حالا کاربرد این چیه؟ به عکس زیر توجه کنید!

همونطور که میبینید کاربرد دیگر o فقط یک تیک هست! یعنی فعال و غیر فعال کردن یک حالت..! که کد آن به صورت بالا نوشته میشه.

خوب اگه دقت کنید اینجا داریم <o11.3> خوب گفتیم 11 یه دلیل داره حالا میخوام اینجا کامل توضیح بدیم که عدد 11 و 3 چه معنی رو در این کد ها میدن!

ببینید ما باید بتونیم نتیجه ویزارد رو بگیریم! یعنی بدونیم که کدوم قابلیت فعال هست یا مثلا برای فلان چیز چه عددی وارد شده! کلا میخوایم بفهمیم چطوری باید از اینا استفاده کرد! حیلی ساده است! با define# همون چیز هایی که اول کار گفتم!

بعد از پایان کامل این کدها (کدهای ویزارد) باید برای بدست آوردن نتیچه ی ویزارد چند تا چیز تعریف کنیم تا بتونیم اونا رو بدست بیاریم! مثلا به کد زیر توجه کنید!

#define CLOCK_SETUP           1
#define SCS_Val               0x00000030
#define CLKSRCSEL_Val         0x00000001
#define PLL0_SETUP            1
#define PLL0CFG_Val           0x00050063
#define PLL1_SETUP            1
#define PLL1CFG_Val           0x00000023
#define CCLKCFG_Val           0x00000003
#define USBCLKCFG_Val         0x00000000
#define PCLKSEL0_Val          0x00000000
#define PCLKSEL1_Val          0x00000000
#define PCONP_Val             0x042887DE
#define CLKOUTCFG_Val         0x00000000

در همون فایل که اول معرفی شد اگه برید پایان ویزارد این دیفاین ها رو میبینید! خوب سوالی که پیش میاد اینه که هر ویژگی و کدی مه ما نوشتیم روی کدوم از اینا تاثیر میزاره! آهان حالا رسیدیم به اون 11 که گفتم چرا نوشته <o11.3> . عدد 11 یعنی دوازدهمین دیفاین (چون از 0 شروع میشه) یعنی میشه PCONP_Val به عبارتی اگه ما اون تیک مربوطه رو برداریم این عدد تغییر میکنه!

خوب حالا میمونه اون 3 که چرا نوشته<o11.3> خوب ببینید اون تیک که گفتم دو تا حالت بیشتر که نداره! یا فعال هست یا غیر فعال پس یا 0 هست یا 1 خوب پس میتونه یک بیت باشه! خوب میتونیم بگیم اگه فعال باشه مثلا کد زیر رو داشته باشیم! 

#define PCLKSEL1_Val          0x1 // 0b001

و اگه غیر فعال باشه خط زیر رو داشته باشیم

#define PCLKSEL1_Val          0x0 // 0b000

خوب مثلا اگه بخوایم چند تا تیک مربوط به هم رو توی ویزارد قرار بدیم باید برای هر کدوم یه دیفاین بزاریم! مثلا به عکس زیر توجه کنید!

همه ی تیک های بالا مربوط به هم هست و برای یه رجیستر هست (رجیستر کنترل توان) و مثلا ما باید با هر واحد جانبی که کار داشتیم اونو فعال کنیم! خوب اگه بخوایم از روش بالا استفاده کنیم و برای هر تیک یه دیفاین بزاریم قطعا کار بیهوده و سختی الکی هست! پس باید چه کار کنیم! خوب میایم برای هر کدوم از این ها یه بیت رو در نظر میگیریم و میایم مثلا میگیم خوب تیک اول برای بیت اول  و تیک دوم برای بیت دوم و تیک سوم برای بیت سوم و....!

فک کنم حالا فهمیده باشید منظور از 3 توی کد <o11.3> چی بود! اگه هنوزم نفهمیدید باید بگم که این میگه تیک مربوطه فقط روی بیت سوم تاثیر بزاره و اونو تغییر بده! برای مثال اگه این تیک فعال باشه خواهیم داشت!

#define PCLKSEL1_Val          0x8 // 0b01000

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

فقط یه نکته این که فقط <h> و <e> نیازمند پایان (بستن) هست و بقیه لازم نیست!

بازم اگر سوالی بود در خدمتم همه ی دوستای گلم هستم!

امیدوارم به دردتون خورده باشه! 

موفق باشید!

یا علی مدد...!