گفتن مثال برای قسمتهای راه اندازی شده
ادامه بحث و راه اندازی قسمتهای راه اندازی نشده
مطالب 5 صفحه اخیر در مورد توضیحات دستورات cmsis را به صورت pdf برای دوستان آماده کردم.
تایمر کانترهای lpc1768 در cmsis
توضیحات اولیه:
در این خانواده از میکروکنترلرها تعداد 4 تایمر کانتر 32 بیتی وجود داره که بر حسب تنظیمات میتوانند در 2 مد تایمر یا کانتر کار کنند.همچنین هر تایمر/کانتر دارای 4 رجیستر مقایسه ای ایست که در صورت برابری مقدار تایمر کانتر با محتویات هر یک از این رجیسترها
بسته به تنظیمات شما امکان ایجاد رخدادهای زیر وجود دارد
1-وقوع وقفه تایمر/کانتر
2-ریست شدن تایمر/ کانتر
3-متوقف شدن تایمر/ کانتر
نام این رجیسترها,رجیسترهای match میباشد.
همچنین هر یک از این رجیسترها دارای یک پین خروجی هستند که بسته به تنظیمات در هنگام برابری محتوای رجیستر با تایمر /کانتر وضعیت این پین میتواند
1-یک شود
2-صفر شود
3-toggled شود
علاوه بر پینهای match که به رجیسترهای match تایمر /کانتر متصل هستند هر تایمر کانتر دارای 2 پینن دیگر به نام های CAPx.0 و CAPx.1 میباشند که بسته به تنظیمات شما میتوانند به عنوان ورودی کلاک کانتر یا ورودی CAPTURE استفاده شوند.
با توجه به اینکه هر یک از این پایه ها میتوانند به عنوان ورودی CAPTURE باشند لذا برای هر تایمر /کانتر 2 رجیستر CAPTURE در نظر گرفته شده که در صورت بروز کلاک CCAPTURE بر روی هر پایه مقدار تایمر کانتر در رجیستر CAPTURE مربوط به خودش قرار میگیرد.
اگر شما تایمر را برای کپچر تنظیم نمایید در صورت آمدن کلاک کپچر میتوانید تنظیم کنید که
1-عمل CAPTURE بر روی لبه ی بالا رونده اتفاق افتد
2-عمل CAPTURE بر روی لبه پایین رونده اتفاق افتد
3- 1-عمل CAPTURE بر روی هر دو لبه باشد
4 -با آمدن کلاک کپچر وقفه فعال شود یا خیر
انشالله از پست بعد برنامه نویسی رو شروع میکنم
ویرایش توسط esi_52000 : 27-02-2012 در ساعت 13:41
آقا خدا قوت ..
ميدونم كه اومدن ديدن پيغامهاي استقبال چقدر دلگرمي هست .. و البته ميدونم كه شما يه فيدبك داخلي داري كه روحيه ميده به خودت و اون پشتكارت هست
من هم يه زماني ميخواستم nxp1700 رو شروع كنم اما خب به دليل كار خيلي خيلي خاصي ( كه شايد اشتباه از طرز فكر من باشه) و البته مشغول شدن به كار ديگه نشد
الان هم كه با st شروع كردم ميدونم كه nxp بسيار قدرت مند هست و سايتش هم نابع خيلي زيادي داره
اميدوارم از علمت لذت ببري چه معنوي چه مادي ..
راستي پيشنهاد ميكنم كه به جاي يادگيري سريعتر مطالب روي انجام مثالهاي بيشتر حركت كنيم .. با اينكار هم افراد بيشتري درگير ميشن هم مطلب كاربرديتر ميشه و هم زمان بيشتري در ذهن ميمونه
پيشرفت براي افرادي هست كه در يك رشته پايداري ميكنند و شناخته ميشوند .. افرادي كه شاخه به شاخه ميپرند فقط زمان را پشت سر ميگذارند ... بسياري از پروژه هاي ما با حداقل امكانات قابل انجام هست..
من تهرانم ..اگر چيزي خواستي بگو برات ميگيرم ميفرستم .. خدا قوت
ویرایش توسط alishekarriz : 27-02-2012 در ساعت 15:34
سلام جناب مهندس.
آقا ما خدمت بزرگانی چون شما ارادت خاصی داریما.
واسه راه اندازی st خیلی زحمت کشیدین داداش.خدا قوت عزیز.
با نظرتون کاملا موافقم مهندس جان که به جای گفتن سریع مطالب بایست تمرکز روی گفتن مثالها و نمونه برنامه باشه.اما مهندس جان مشکل اینجاست که من برد ندارم و نمیتونم برنامه هامو تست کنم(راستش اصلا تا حالا lpc1768 یا هر lpc دیگه ای رو ندیدم).
واسه همین نمیخوام با گذاشتن برنامه هایی که تست نشده شرمنده دوستان باشم.کاش دوستانی که تونستن برد خداتومنی رو بخرن همکاری کنن و مثالای تست شده رو بزارن .البته جدیدا همه به سمت st دارن میرن.جالب اینجاست که این دو نوع میکرو هیچی از هم کم ندارن .ولی دوستان چرا همه میخوان st کار بشن نمیدونم.یا علی داداشم
سلام خیلی ممنون که شروع کردید.
دوستان من میخواستم rit رو راه بندازم اما با ارور های زیر مواجه شدم
فایل پروژه هم پوست هست.ممنون میشم کمک کنیدکد:Build target 'Target 1' assembling startup_LPC17xx.s... compiling ali.c... C:\Keil\ARM\INC\NXP\LPC17xx\lpc17xx_rit.c(180): warning: #188-D: enumerated type mixed with another type linking... 1.axf: Error: L6218E: Undefined symbol CLKPWR_ConfigPPWR (referred from ali.o). 1.axf: Error: L6218E: Undefined symbol CLKPWR_GetPCLK (referred from ali.o). 1.axf: Error: L6218E: Undefined symbol check_failed (referred from ali.o). Target not created
سلام برنامه بدون خطا کامپایل شد .مشکل یک هیدر بود که باید به پروژه اضافه میشد
اینم یک برنامه برای rit
برنامه تغییر یافته:
[PHP]#include "LPC17xx.H"
#include "SYSTEM_LPC17xx.C"
#include"lpc17xx_rit.c"
#include"lpc17xx_rit.h"
#include"lpc17xx_clkpwr.c"
#define LCD_PORT_0
#define LCD_RS 0
#define LCD_E 1
#define LCD_DB4 2
#define LCD_DB5 3
#define LCD_DB6 4
#define LCD_DB7 5
#include "lcd.h"
int i;
void RIT_IRQHandler(void)
{ i++;
lcd_gotoxy(2,1);
lcd_puts(i);
RIT_GetIntStatus(LPC_RIT);
}
int main()
{
lcd_init();
lcd_clear();
cursor_off();
lcd_gotoxy(1,1);
lcd_putsf("rit");
RIT_Init( LPC_RIT );
RIT_TimerConfig(LPC_RIT,100) ;
RIT_Cmd(LPC_RIT,ENABLE);
NVIC_EnableIRQ(RIT_IRQn);
while(1);
} [/PHP]
ویرایش توسط hunybal : 27-02-2012 در ساعت 23:32
داداش hunybal خوشحالم که زود مشکلت حل شد.شما فیلهای درایور میکرو رو کجا اضافه کزدی.راحت بگم
میتونی نحوه ی نوشتن برنامه رو توضیح بدی.از صفر بگی ممنون میشم داداش.
یعنی از اونجایی که یه file میسازی و کتابخونه ها رو بهش منتقل میکنی و نحوه ی اضافه کردن به برنامه و.....
بخدا خودم نمیرسم و بعضی دوستان مثل همون error که واست اتفاق افتاده واسشون پیش اومده
خوب با اجاز هبریم سراغ برنامه و توضیح دستورات
قبل از هرچیزی بگم که درتایمر کانتر برای هر یک از قسمتهایتایمر
کانتر
رجیسترهای MATCH
CAPTUREبایستی متغیری متناسب با اون تعریف بشه که همگی از نوع STRUCT هستند(همون ساختار در زبان C++
در این قسمت تک تک این متغیرها رو توضیح میدم//-------------------------------------------------------------------------------------------//نحوه ی پیکر بندی تایمر کانتر در مد تایمر1-ابتدا باید متغیری از نوع تایمر تعریف بشه2-فیلدهای این متغیر مقدار دهی بشن.-این نوع متغیر دارای 2 فیلد مجزا هستش که یکی منبع کلاک تایمر رو مشخص میکنه و دیگری prescaler تایمر رو (یعنی به ازای هر چند کلاک یکی بشماره)پس اول یه متغیر تعریف میکنیم:TIM_TIMERCFG_Type timercfg ;متغییری که ایجاد کردین 2 تا فیلد داره.1-PrescalerOption که منبع کلاک سیستم رو مشخص میکنه2-prescalerValue که مقدار prescaler رو مشخص میکنهحالا فیلد اول رو مقدار دهی میکنیم.Timercfg .PrescalerOption = TIM_PRESCALE_TICKVal /TIM_PRESCAL_USValاگه کزینه اول رو قرار بدین (TIM_PRESCALE_TICKVal )منبع کلاک تایمر از کلاک سیستم گرفته میشه که اصلا جایی ندیدم استفاده بشه.اگه کزینه دوم رو قرار بدین (TIM_PRESCAL_USVal) این گزینه باعث میشه کلاک سیستم به صورت مضربی از میکروثانیه توسط شما تعیین بشه که در ادامه توضیح میدم.حالا فیلد دوم متغیر تایمرTimercfg .PrescalerValue = VALUEدر این فیلد شما PRESCALE تایمر رو مشخص میکنید.اگه در فیلد قبلی از TIM_PRESCAL_USVaLاستفاده کرد ه باشین اونوقت PRESCAL برحسب میکرو ثانیه میشه.واسه اینکه متوجه بشین مثال میزنم/-------------------------------------------------------------------------------------------------------------مثال : میخواهیم تایمر 1 رو بگونه ای پیکربندی کنیم که هر 1 ثانیه یکی به آن اضافه شود.TIM_TIMERCFG_Type timercfg ;timercfg .PrescalerOption = TIM_PRESCAL_USVal ;Timercfg .PrescalerValue = 1000 ;
نحوه ی پیکربندی رجیستر match یک تایمر1-ابتدا باید متغیری از نوع match تعریف بشه2-فیلدهای این متغیر مقدار دهی بشن.TIM_MATCHCFG_Type matchcfg ;این متغیر 5 فیلد داره که داریم.matchcfg.Channel = 0.....3matchcfg.IntOnMatch = ENABLE / DISABLEmatchcfg.ResetOnMatch = ENABLE / DISABLEmatchcfg.StopOnMatch = ENABLE / DISABLEmatchcfg.MatchValue= valueفیلد اول مشخص میکنه که میخواین کدوم یک از رجیسترهای 4 گانه match رو پیکربندی کنین.فیلد دوم میگه که وقتی مقدار تایمر کانتر با مقدار رجیست match برابر شد وقفه اتفاق بیفته یا نهفیلد سوم میگه که وقتی مقدار تایمر کانتر با مقدار رجیست match برابر شد تایمر ریست بشه یا نهفیلد دوم میگه که وقتی مقدار تایمر کانتر با مقدار رجیست match برابر شد تایمر از کار بیفته یا نهمقدار عددی که میخوایین توی این رجیستر قرار بگیره رو مشخص میکنهمثال:رجیستر match3 تایمر رو بگونه ای پیکر بندی کنین که در صورت برابری تایمر با عدد 3000000 تایمر ریست بشه اما از کار نیفته و وقفه هم اتفاق بیفتهmatchcfg.Channel = 3matchcfg.IntOnMatch = ENABLEmatchcfg.ResetOnMatch = ENABLEmatchcfg.StopOnMatch = DISABLEmatchcfg.MatchValue= 3000000
نحوی پیکربندی واحد capture در تایمر کانتر1 -ابتدا باید متغیری از نوع match تعریف بشه2-فیلدهای این متغیر مقدار دهی بشن.TIM_CAPTURECFG_Type capturecfg ;این متغیر 4 فیلد داره که داریم.Capturecfg.CaptureChannel = 0 / 1 ;Capturecfg.RisingEadge = ENABLE / DISABLECapturecfg.FallingEdge = ENABLE /DISABLECapturecfg.IntOnCaption= ENABLE /DISABLEفیلد اول نشون میده که شما میخوایین از CAPn.0 به عنوان ورودی CAPTIUR استفاده کنین یا CAPn.1فیلد 2 نشون میده که عمل کپچر روی لبه بالارونده پالس اعمالی به پین کپچر اتفاق بیفته یا خیرفیلد 3 نشون میده که عمل کپچر روی لبه پایین رونده پالس اعمالی به پین کپچر اتفاق بیفته یا خیرفیلد 3 نشون میده که با وقوع پالس کپچر وقفه فعال بشه یا نهمثال: کپچر رو به گونه پیکر بندی کنین که با اعمال پالس به پایه CAPn.1 در لبه بالارونده کپچر فعال و وقفه نیز اتفاق بیفته.Capturecfg.CaptureChannel = 1 ;Capturecfg.RisingEadge = ENABLECapturecfg.FallingEdge = DISABLECapturecfg.IntOnCaption= ENABLE-----------------------------------------------------------------------------------------------------------------نحوی پیکربندی واحد تایمر کانتر در مد کانتر1 -ابتدا باید متغیری از نوع کانتر تعریف بشه2-فیلدهای این متغیر مقدار دهی بشن.TIM_COUNTER CFG_Type countercfg ;این متغیر 2 فیلد داره که داریم.countercfg.CounterOption =TIM_COUNTER_INCAP0 / TIM_COUNTER_INCAP1 ;countercfg.CountInputSelect =فیلد اول نشون میده که وروی کلاک کانتر از پین CAP0 باشه یا CAP1فیلد دوم رو نمیدونم چیکار میکنه شرمنده کسی فهمید یه ندا بدهمثال: کپچر رو به گونه پیکر بندی کنین که با اعمال پالس به پایه CAPn.1 در لبه بالارونده کپچر فعال و وقفه نیز اتفاق بیفته.Capturecfg.CaptureChannel = 1 ;Capturecfg.RisingEadge = ENABLECapturecfg.FallingEdge = DISABLECapturecfg.IntOnCaption= ENABLE
این قسمت همچنان ادامه دارد دوستان
--------------------------------------------------------------------------------
سلام دوستان توی این قسمت یه چیزایی از قلم افتاده که الان بهش اضافه کردم.
1-بعد معرفی یک متغیر از نوع match_type و دادن مقادیر به فیلد های مربوطه با تابع زیر config دهایی انجام میشه
(matchcfg&, شماره تایمر مورد نظر)TIM_ConfigMatch
2-همین مورد رو درباره capyureداریم که
(capturecfg&, شماره تایمر مورد نظر)TIM_ConfigCapture
ویرایش توسط esi_52000 : 03-03-2012 در ساعت 11:07
سلام دوستان اول درایور های زیر رو دانلود کنید
NXP Semiconductors - ICs [Home]
توی پوشه driver دو تا پوشه دیگه هست یکی include و یکی source .بهتون پیشنهاد میکنم که تمام محتویات این دو پورو (فایل های h. و c.) رو توی
C:\Keil\ARM\INC\NXP\LPC17xx
کپی کنید که نیازتون میشه.
حالا این برنامرو کپی کنید
[PHP]#include "LPC17xx.H"
#include "SYSTEM_LPC17xx.C"
#include"lpc17xx_rit.h"
#define LCD_PORT_0
#define LCD_RS 0
#define LCD_E 1
#define LCD_DB4 2
#define LCD_DB5 3
#define LCD_DB6 4
#define LCD_DB7 5
#include "lcd.h"
int i;
void RIT_IRQHandler(void)
{ i++;
lcd_gotoxy(2,1);
lcd_puts(i);
RIT_GetIntStatus(LPC_RIT);
}
int main()
{
lcd_init();
lcd_clear();
cursor_off();
lcd_gotoxy(1,1);
lcd_putsf("rit");
RIT_Init( LPC_RIT );
RIT_TimerConfig(LPC_RIT,100) ;
RIT_Cmd(LPC_RIT,ENABLE);
NVIC_EnableIRQ(RIT_IRQn);
while(1);
} [/PHP]
میبینید که کلی ارور داد چرا؟
چون درواقع فایل های c. و h. مکمل هم هستند و اگر برای مثال h. فراخوانی بشه اما c. وجود نداشته باشه ارور میده مثلا با نوشتن این خط #include"lpc17xx_rit.h" هیدرش به پروژه اضافه میشه اما چون فایل c. نیست ارور میگیره این قضیه برای تمامی هیدر ها صادق هست.بخاطر همین من پیشنهاد میکن برین توی تمامی هیدر ها و c. همون هیدرو اینکلود کنید برای مثال من میرم توی هیدر #include"lpc17xx_rit.h" و یک خط برنامه دیگه به صورت#include"lpc17xx_rit.c"
اولش مینویسم .WARNING
حتما برای تمامی کتابخانه ها اینکار انجام بدین
حالا باز پروژرو کامپایل کنید و میبینید که دیگه ارور نمیده
سلام به همه دوستان گرامی .
دوستان یه پیشنهاد دارم اونم اینکه ب هجای اینکه برای برنامه نویسی با cmsis بخواهین از keil استفاده کنین
نرم افزار CoIDE زو از سایت COOCOX.ORG دانلود کنین و با اون نرم افزار کار کنین .استفاده از اون بسیار ساده و خیلی کاربدی تر از KEIL هستش(البته برای تراشه های مبتنی بر CORTEX M3/M0)
با سلام
ضمن تشکر برادر گرامی در صورت امکان لطفا منیع انگلیسی ترجمه های خود را نیز معرفی نمایید
خوب دوستان من به وعده خودم عمل کردم .
توی فایل زیر میتونید تمام دستورات تایمر کانتر رو با توضیحات ببینید اگه مشکلی بود من در خدمت دوستان هستم
یا مولا علی گفتن یادتون نره
سلام
آقا راستش من نمیونم این cmsis چیه دقیقا؟!؟ یکی میشه برام توضیح بده؟؟ ممنون میشم
میکروکنترلر STM32103-RBT6 بطور کامل راه اندازی شد !!!
مرحله بعدی اتصال TFT 3.2 به میکرو و بوت کردن UC-OS II + GUI !!!
.
سلام مهندس منم نمیدونم این cmsis دقیقا چیه میشه توضیح بدین؟؟؟
برای هر میکروئی هدر جدا داره و اگه بخواهیم پیدا میشه؟؟
کجا شم میشه بگید ؟؟؟
لطفا
*** اللّهم عجّل لولیک الفرج ***
مهندس حسینیا و مهندس do loop ما خدمتون خیلی ارادت داریم دوستان .
ببینید عزیزان .شما وقتی میخواین با arm کار کنین مجبورین چندین رجیستر رو دستکاری کنین تا یک قسمت از میکرو مثلا تایمر رو بکار بندازین.به عنوان مثال بایست ابتدا power رو برای تایمر فعال کنین بعد کلاک اون رو فعال کنین و ...... اما در cmsis شما اصلا نیازی به این کار ندارین وتنها با یک دستور TIM_INTI() همه ی این کارا انجام میشه .
خوب ممکنه بگین این دقیقا مثل بسکام و کدویژن و بقیه کامپایلر هاست و باعث میشه ما به یکسری کتابخانه محدود بشیم.اما اینطور نیست دوستان .در CMSIS شما میتونید تک تک کارهایی که با رجیستر انجام میدادین رو انجام بدین و به هیچ وجه از قدرت برنامه نویسی شما کم نمیکنه اما حتما اون رو ساده تر میکنه. از طرف دیگه با توجه به اینکه هسته ARM در تمامی شرکتها یکسان هستش, CMSIS به شما این امکان رو میده که با نوشتن برنامه برای یه میکرو ی NXP ,همون برنامه رو برای میکرو ی ساخت ST استفاده کنین البته با کمترین تغییر.
به عبارت دیگه برای NXP برنامه بنویس برای ST LM یا هر شرکت دیگه استفاده کن.واقعا دوستان بهتون توصیه میکنم اون رو بخونین قول میدم عاشقش بشین
خب اينكه چيزي نيست .. من هم نميدونم CMSIS چيه
Cortex™ Microcontroller Software Interface Standard
CMSIS - Cortex Microcontroller Software Interface Standard - ARM
با اين روش احتمالا وقتي يك برنامه اي براي يك ميكرو كرتكس 3 نوشته ميشه .. در تمام ميكروهاي شركتهاي مختلف كه از هسته كرتكس 3 استفاده ميكنند بايد اجرا شود.
ویرایش توسط alishekarriz : 03-03-2012 در ساعت 00:19