اطلاعیه

Collapse
No announcement yet.

آموزش کامل و جامع طراحی سیستم با میکروکنترلر ARM LPC176X Cortex-M3

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    آموزش کامل و جامع طراحی سیستم با میکروکنترلر ARM LPC176X Cortex-M3

    [glow=red,2,300]با عرض سلام و خسته نباشید خدمت همه ی دوستان عزیزم ! قبل از شروع کار تو همین تاپیک ازتون خواهش میکنم که نظراتتونو در تاپیک زیر ارسال کنید تا مطالب بصورت پیوسته با نظم خاصی ارائه بشه که مطمئناً نظر خیلی از دوستان هم همینه ... نظر یادتون نره، نظر دادن شما میتونه تو کیفیت مطالب ارائه شده موثر باشه..... یا علی !!!! http://www.eca.ir/forum2/index.php?topic=105090.0[/glow]
    از موضوع تاپیک پیداست که قراره با هم آموزش کامل برنامه نویسی میکروکنترلر ARM LPC176X Cortex-M3 رو که ساخت شرکت NXP هستش و امروزه در بسیاری از پروژه های صنعتی به کار گرفته میشه رو بصورت تخصصی و حرفه ای دنبال کنیم. یکی از دلایلی که باعث شد تا این تاپیک رو ایجاد کنم در واقع پراکنده بودن مطالب آموزشی و نبود مطالب مهم و پیشرفته در رابطه با این سری از میکروکنترلرها بود و از طرفی در بسیاری از انجمن ها به فراخورد میدم که بعضی ها با مشکلات اساسی در کار کردن با این تراشه قدرتمند روبرو میشدند و به ندرت میتوانستند بدون منابع آموزشی اونو رفع کنند ، اما من در این اینجا قصد دارم از 0 تا 100 مباحث مربوط به این تراشه رو براتون بصورت آموزشی در طی جلسات متعدد قرار بدم و شما رو از هرگونه منابع آموزشی بی نیاز کنم ، مطالبی رو که من براتون قرار میدم همشونو بصورت عملی تجربه کردم و همه مباحث رو بصورت تکنیکی و کاربردی - مهندسی براتون میزارم . اما بریم سراغ تهیه تجهیزات سخت افزاری و نرم افزاری :

    1 - سخت افزار
    شاید برای شروع کار براتون مشکل باشه که خودتون بخواین PCB برد رو پیاده سازی کنید، اما نگران نباشید ، واسه این سری از میکروکنترلرها اونقدر برد داخلی و خارجی وجود داره که شما رو از این جهت بی نیاز کنه ، اما اینکه کدوم برد رو واسه کارتون ( آموزشی - صنعتی ) انتخاب کنید خیلی مهمه !!!
    اگه واقعاً می خواین بصورت حرفه ای با این میکرو کار کنید و بر روی تمام امکاناتش تسلط کامل داشته باشین پیشنهاد من به شما برد شرکت ECA هستش که میدونم خیلی هاتون اون خریداری کردین اما دلیل من در انتخاب این برد اینه که این برد در واقع تنها برد آموزشی و حرفه ای هستش که از واحد پردازش صدای دیجیتال I2S پشتیبانی میکنه و هم ماژول های متنوعی رو ساپورت میکنه و مورد مهم دیگه اینه که هسته مرکزی که خود LPC1768 هستش بصورت هدربرد روی برد قراره داره که میتونید در کاربردهای دیگه ازش استفاده کنید و ...
    اگه هم توان خرید برد رو ندارید میتونید هدربرد رو خریداری کنید و در طی جلسات متعدد قطعات مورد نیاز رو تهیه و روی بردبرد پیاده سازی کنید >>>

    2 - پروگرامر
    برنامه ریزی تراشه های ARM یکی از مهم ترین قسمت های کاره ، کلاً شما دو راه بیشتر پیش روتون نیست ، راه اولش اینه که از Bootloder برای پروگرام کردن استفاده کنید که بیشتر برای افراد مبتدی مناسبه و راه دوم استفاده از پروگرامر قدرتمند JLINK که مطمئناً بهتر از این پروگرامر نمیتونید گیر بیارید ، اگه میخواین حرفه ای کار کنید و کارتون طوری هستش که باید دائماً برنامه رو میکرو پروگرام کنید بهتره از JLINK استفاده کنید که میتونید از ECA اونو خریداری کنید البته میتونید از دیباگر و پروگرامر Wiggler هم استفاده کنید که امکان پروگرام کردن میکرو رو از طریق پورت LPT براتون ممکن میکنه که آلان کمتر کسی از این پروگرامر استفاده میکنه ولی به هر حال نظر خودتونه >>>

    3 - نرم افزار
    بعد از تهیه سخت افزار و پروگرامر باید نرم افزار یا به اصطلاح کامپایلر رو تهیه کنیم ، کامپایلر در واقع نرم افزاری هستش که امکان کدنویسی رو برای میکرو توسط کاربر فراهم میکنه ، بهترین کامپایلر در این زمینه کامپایلر Keil هستش که اکثر مهندسین ، طراحان و دانشجویان چه در امور آموزشی و چه صنعتی از اون استفاده میکنند ، هر چند نسخه اورجینالشو به دلیل تحریم شدن ایران نمیتونیم تهیه کنیم ولی در کل مثل Codevisionavr کارمونو راه میندازه و از طرفی با همکاری بچه های بالا :biggrin: میتونیم بعضی از کتابخونه های مهم و کاربردی رو هم تهیه کنیم . آخرین نسخه این نرم افزار در روزی که این مطلب نوشته شد Keil 5.13 بود ، در این نسخه کمپانی Keil تغییرات اساسی رو لحاظ کرده و حجم نرم افزار کم شده و ما میتونیم کتابخانه های مورد نیاز رو از سایت Keil بصورت Pack دریافت کنیم اما چون این نسخه کامل نشده و از طرفی یه خورده هم میره رو اعصاب آدم ( چون کامل نیست یه خورده قاطی داره ، الکی به تابع ها گیر میده و ... ) من بهتون پیشنهاد میکنم که تا زمان کامل شدن این نسخه از نسخه Keil 4.74 استفاده کنید . در این تاپیک ما آموزش رو با نسخه 4.74 دنبال می کنیم و به امید خدا بعد از اتمام مرحله ی آخر آموزش کار با آخرین نسخه Keil رو براتون میزارم . حالا مباحثی که قراره بصورت جلسه ای بهتون آموزش بدم رو زیر عنوان کردم :

    جلسه 1 : مقدمه ای بر میکروکنترلرهای ARM ، واحد حافظه ، مختصری از تاریخچه ARM ، معماری پردازنده های ARM ، هسته های Cortex-M3 ، معرفی قابلیت های تراشه ARM LPC176X CM3 ، نحوه ایجاد پروژه و شبیه سازی در Keil ، برنامه ریزی تراشه در محیط Keil با پروگرامر JLINK ، اصول طراحی برنامه نویسی C ( انتشار یافت )

    جلسه 2 : باس های AHB و APB ادوات جانبی متصل شده به آنها ، کنترل منابع Reset ، کنترل منابع کلاک ، فعال سازی قفل حافظه Flash ،تنظیم فرکانس میکروکنترلر ( 100MHZ , 120MHZ , 150MHZ ) ( انتشار یافت )

    جلسه 3 : پورت های ورودی / خروجی ( GPIO ) - وقفه های GPIO ( معرفی NVIC اختصاصی جلسه 3 ) ( در حال تألیف )

    جلسه 4 : نامشخص

    جلسه 5 : نامشخص

    جلسه 6 : بررسی رجیسترهای PINSEL و PINMODE

    جلسه 7 : وقفه های خارجی ( External Interrupts ) - کنترل توان ( PWR )

    جلسه 8 : راه اندازی و کنترل نمایشگرهای LCD کاراکتری

    جلسه 9 : راه اندازی و کنترل نمایشگرهای گرافیکی مُدل GLCDKS0108

    جلسه 10 : راه اندازی و کنترل نمایشگرهای سون سگمنت و دات ماتریس

    جلسه 11 : اسکن صفحه کلید ماتریسی 4 * 3 - 4 * 4

    جلسه 12 : راه اندازی و کنترل نمایشگر های TFTLCD از سایز 2.8 تا 9 اینچی

    جلسه 13 : راه اندازی و کنترل تاچ اسکرین نمایشگرهای TFTLCD با تراشه درایور مخصوص تاچ

    جلسه 14 : مبدل آنالوگ به دیجیتال ( ADC )

    جلسه 15 : مبدل دیجیتال به آنالوگ ( DAC )

    جلسه 16 تا 18 : تایمر و شمارنده ها ( Timer / Counter )

    جلسه 19 : تایمر سگ نگهبان ( WDT )

    جلسه 20 : تایمر وقفه تکرار شونده ( RIT )

    جلسه 21 : تایمر System Tick

    جلسه 22 : مدولاسیون پهنای پالس ( PWM )

    جلسه 23 : واحد کنترل موتور سه فاز ( MCPWM )

    جلسه 24 : واحد زمان سنج دقیق ( RTC )

    جسله 25 تا 27 : ارتباط سریال UART

    جلسه 28 : ارتباط سریال کامپیوتری ( RS232 )

    جلسه 29 : شبکه سریال RS485

    جلسه 30 : تبادل دیتا از طریق Blurtooth با ماژول HC-05 و مدل های مشابه

    جلسه 31 تا 33 : ارتباط سریال دو سیمه ( TWI - I2C )

    جلسه 34 : خواندن و نوشتن دیتا بر روی حافظه سریال EEPROM مدل AT24CXXXX

    جلسه 35 ت 36 : ارتباط جانبی سریال ( SPI )

    جلسه 37 تا 40 : ارتباط سریال آسنکرون ( SSP )

    جلسه 41 تا 42 : خواندن و نوشتن دیتا ، خواندن فایل و حذف آن ، ایجاد پوشه و حذف آن و ... بر روی حافظه MMC/SD

    جلسه 43 : عکسبرداری و فیلمبرداری با دوربین رنگی OV7670 و ذخیره بر روی مموری کارت MMC/SD

    جلسه 44 : ضبط و پخش فایل های صوتی با فرمت MP3

    جلسه 45 تا 47 : واحد پردازشگر سیگنال های دیجیتالی صوت ( I2S )

    جلسه 48 : واحد GPDMA

    جلسه 49 تا 60 : پیاده سازی کامل شبکه Ethernet با ارائه مثال های جامع

    جلسه 61 : پروتکل ارتباط صنعتی CAN

    جلسه 62 تا 70 : پیاده سازی کامل ارتباط USB Device - Host - OTG و مدهای مربوطه

    جلسه 71 : اتصال کیبورد کامپیوتر ، دوربین دیجیتالی به میکرو از طریق پورت USB Host

    جلسه 72 تا 80 : برنامه نویسی تحت سیستم عامل RTX

    جلسه 81 تا 90 : پیاده سازی کامل سیستم عامل گرافیکی Emwin بر روی تراشه ARM LPC1768 - 69 Cortex-M3 و بررسی توابع کاربردی

    جلسه 91 تا 95 : برنامه نویسی تحت سیستم عامل بصورت ترکیبی با RTX و Emwin

    جلسه 96 تا 98 : کار با برخی از توابع DSP

    جلسه 99 : ارتباط میکرو با ماژول SIM908 و پیاده سازی کامل شبکه GSM / GPRS / GPS با نمایشگر رنگی TFTLCD 5Inch

    جلسه 100 : واکی تاکی با ماژول مخابراتی NRF24L01


    ********* آموزش کار با آخرین نسخه نرم افزار Keil

    { دوستان فقط برام دعا کنید تا مشکلم حل بشه :sad: }

    #2
    پاسخ : آموزش کامل و جامع طراحی سیستم با میکروکنترلر ARM LPC176X Cortex-M3

    سلام
    ان شاالله که مشکلتون حل بشه.
    کاری که میخاین شروع کنین خیلی عالیه ، البته اگه تا آخرش پیش بره. چون غالبا کم پیش میاد که یه تاپیک تا پایان ادامه پیدا کنه ...
    البته اون چیزایی که من بنظرم میرسه رو میگم. چیزی که اول کار مهمه اینه که شما یه مدت زمان برای این اموزشا در نظر بگیرین ، که باعث یه نظمی میشه.
    دوما بهتره که شما فقط مطالب اموزشیتونو اینجا قرار بدین و تاپیک پرسش و پاسخ و تبادل نظر جدای از این تاپیک باشه ، تا دسترسی به مطالب به راحتی صورت بگیره .
    سوما بیان کنین که مبنای اموزشیتون بر اساس کار با رجیستر هست یا توابع CMSIS .
    ان شاالله که هرچه زودتر شروع کنین و تا انتها هم ادامه بدین.
    درنهایت ارزوی موفقیت میکنم براتون.
    یاعلی مدد
    در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

    دیدگاه


      #3
      پاسخ : آموزش کامل و جامع طراحی سیستم با میکروکنترلر ARM LPC176X Cortex-M3

      قبل از اینکه وارد مباحث جلسه اول بشیم باید به چند نکته اشاره کنم :

      1 - مبنای آموزشی براساس کار با رجیستر هستش چون امکانات بیشتری رو در اختیارمون قرار میده ، در آموزش هایی که ارائه میدم سعی می کنم تمامی رجیسترها را بصورت کاربردی توضیح بدم ، ارائه مثال های متنوع پس از بررسی هر رجیستر ، برنامه نویسی با رجیستر رو شیرین میکنه بنابراین از این بابت خیالتون راحت باشه !!!!!!

      2 - سعی می کنم در پایان هر جلسه ، زمان جلسه بعدی رو هم اعلام کنم که در زمان فوق بتونید بازدید کنید و از مطالب ارائه شده بهره شین !!!


      جلسه 1 : مباحث مقدماتی برای شروع کار با میکروکنترلرهای ARM

      قبل از شروع بحثم اینو میدونم که همه شما با تعاریف میکروکنترلر ، واحد حافظه و ... آشنا هستید ، بنابراین نمیخوام زیاد سرتونو درد بیارم و وقتمون هدر بره ، مباحثی همچون معماری و تاریخچه پردازنده های ARM آنقدر زیاد هست که تو این تاپیک نمیتونم جاش بدم پس الزماً برای اینکه کیفیت آموزشی حفظ بشه باید مختصراً یه توضیحاتی رو بصورت کلیدی ارائه بدم ، اگه حاضرین یه یا علی بگین و ....

      تعریف میکروکنترلر و کاربردهای آن
      میکروکنترلرها در واقع جزء نسل های تکمیل شده میکروکامپیوتر می باشند ؛ بدین صورت که ابتدا میکروپروسسورها ساخته می شوند و سپس با قرار گیری ادوات جانبی از جمله حافظه ، پورت ورودی و خروجی و ... در کنار میکروپروسسور یک میکروکامپیوتر شکل میگرد ، زمانیکه ادوات میکروکامپیوتر در یک تراشه سیلیکونی ارزان قیمت قرار میگرند یک میکروکنترلر ساخته میشود . انواع مختلفی از میکروکنترلرها در بازارهای جهان به فروش میرسند که از آن جمله می توان به خانواده های AVR - PIC و ARM اشاره کرد . این سه خانواده جزء پرکاربردترین میکروکنترلرها می باشند که اکثر طراحان و مهندسین آنها را مدنظر خود قرار دادند . از میان میکروکنترلرهای خانواده ARM بدلیل ماهیت 32 بیتی و بهره گیری از معماری توسعه یافته RISC در اکثر پروژه های تجاری و صنعتی مورد استفاده قرار میگرند . یکی از کاربردهای اصلی این دسته از میکروکنترلرها استفاده آنها در سیستم های Embedded ( به سیستمی گفته میشود که برخلاف کامپیوتر برای هدف خاصی طراحی و برنامه ریزی میشوند ) می باشد . سیستم های مانیتورینگ و اندازه گیری پزشکی ، سیستم های صنعتی کنترل دور موتور و شبکه برق رسانی ، سیستم های مخابراتی از قبیل GSM , WIFI و ... نمونه ای از سیستم های Embedded هستند . علاوه بر این استاندارد بودن تراشه ARM ، امکان نصب سیستم عامل های WINCE - LINUX - ANDROID و ... ARM را به یک هسته ی قدرتمند تبدیل کرده است .

      واحد حافظه
      به طور کلی حافظه ها به دو دسته فرّار و غیرفرّار تقسیم بندی میشوند .

      1 - حافظه های فرّار ( غیر دائمی ) : حافظه های فرّار به حافظه هایی گفته می شود که بتوانند اطلاعات داده شده را نگه دارند اما بر خلاف حافظه های ماندگار ، اگر تغذیه آنها قطع شود اطلاعات نیز پاک می شود . حافظه های فرّار به دو شکل کلی استاتیک و دینامیک مورد استفاده قرار می گیرند . زمان دسترسی به حافظه در انواع استاتیک بر خلاف دینامیک کمتر است ، اما در حافظه های دینامیک با حجم بیشتری روبرو خواهیم بود . حافظه های فرّار نیز خود به چند دسته تقسیم بندی میشوند که عبارتند از :
      حافظه RAM : این بخش از حافظه برای ذخیره سازی متغیرها و داده هایی است که در طول اجرای برنامه مقدار دهی و تعریف می شوند . RAM یک حافظه با سرعت دسترسی تصادفی است و دارای سرعت خواندن و نوشتن بالایی است . اطلاعات و داده های این حافظه با قطع برق از بین می روند و حافظه RAM خالی می شود . قطعه نیمه هادی مورد استفاده در سلول این حافظه یک ترانزیستور می باشد .
      حافظه SRAM : این نوع حافظه از نوع Static یا پایدار است . منظور از پایداری این است که نیازی به تازه سازی ( Refresh ) ندارد زیرا در سلول های این حافظه به جای یک ترانزیستور از چهار یا شش ترانزیستور استفاده شده است و همچنین تا وقتی که تغذیه آن برقرار است می تواند اطلاعات داده شده را حفظ نماید . از طرفی به علت Refresh نشدن اطلاعات این حافظه ، حافظه های SRAM جزء حافظه های سریع محسوب میشوند و از آنها به عنوان حافظه های نهان CPU به نام حافظه Cache از آنها استفاده می شود . حافظه های SRAM به صورت تراشه های مستقل نیز وجود دارند که از آنها برای ارتقاء حافظه SRAM تراشه های میکروکنترلر و ... استفاده می شوند که تراشه های کنترلر مورد استفاده باید دارای واحد EMC باشند . نمونه هایی از حافظه SRAM خارجی می توانیم به تراشه IS61LV25616 ساخت کمپانی ICSI و ... اشاره کنیم .
      حافظه DRAM : این نوع حافظه از نوع Dynamic یا غیرپایدار است . یعنی CPU باید مدام با یک فاصله زمانی مشخص ، دیتای ذخیره شده در این نوع حافظه را بازسازی کند ، این قبیل از حافظه ها با ظرفیت های بالا ساخته می شوند و در کنار ریزپردازنده هایی با سرعت بالا قرار می گیرند . نمونه هایی از حافظه DRAM می توانیم به تراشه K4F661612D, K4F641612D ساخت کمپانیSAMSUNG و... اشاره کنیم . حافظه های DRAM خود به دو دسته تقسیم میشوند که عبارتند از :
      1 - حافظه EDO DRAM : این نوع حافظه ها در انتظار تکمیل و اتمام پردازش¬های لازم برای اولین بیت نشده و عملیات مورد نظر خود را در رابطه با بیت بعد بلافاصله آغاز خواهند کرد. پس از اینکه حافظه اولین بیت مشخص گردید EDO DRAM عملیات مربوط به جستجو برای بیت بعدی را آغاز خواهد کرد . سرعت عملیات فوق پنج برابر سریعتر نسبت به حافظه های FPM است . حداکثر سرعت ارسال داده به L2 Cache معادل 176 مگابایت در هر ثانیه است . نمونه هایی از حافظه EDO DRAM می توانیم به تراشه های HM5164805F ساخت کمپانی Hitachi و ... اشاره کنیم .
      2 - حافظه FPM DRAM : شکل اولیه ای از حافظه DRAM می باشند . در تراشه های فوق تا زمان تکمیل فرآیند استقرار یک بیت داده توسط سطر و ستون مورد نظر ، می بایست منتظر و در ادامه بیت خوانده خواهد شد. ( قبل از اینکه عملیات مربوط به بیت بعدی آغاز گردد ) . حداکثر سرعت داده به L2 Cache معادل 176 مگابایت در هر ثانیه است .
      حافظه SDRAM : این نوع حافظه از ویژگی " حالت پیوسته " به منظور افزایش و بهبود کارایی استفاده می نماید . بدین منظور زمانیکه سطر شامل داده مورد نظر باشد ، به سرعت در بین ستون ها حرکت و بلافاصله پس از تأمین داده ، آن را خواهد خواند . SDRAM دارای سرعتی معادل پنج برابر سرعت حافظه های EDO بوده و امروزه در اکثر کامپیوترها استفاده می گردد . حداکثر سرعت ارسال داده به L2 Cache معادل 528 مگابایت بر ثانیه است .

      2 - انواع حافظه غیرفرّار ( دائمی ) : حافظه های ماندگار به حافظه هایی گفته می شود که بتوانند اطلاعات داده شده را نگه دارند ، حتی اگر تغذیه آنها قطع شود نباید این اطلاعات پاک شود . حافظه غیرفرّار در طبقه حافظه ی ROM قرار دارند که هر یک سیر تکاملی خود را در پیش دارند که در ادامه به بررسی هر یک خواهیم پرداخت .
      حافظه ROM : حافظه های ROM نیز مانند تمام حافظه های مبتنی بر نیمه هادی از سلول های حافظه تشکیل یافته اند ؛ اما یک تفاوت بنیادین با حافظه های RAM دارند و آن تفاوت نیز در ساختار سلول حافظه می باشد . در حقیقت در سلول حافظه های ROM به جای ترانزیستور از یک قطعه به نام دیود استفاده می شود . دیود قطعه ای است که جریان را فقط از یک جهت خود عبور می دهد ؛ بنابراین وقتی که جریانی برای پر کردن خازن سلول از این دیود گذشت دیگر نمی تواند در مسیر معکوس برگردد ، پس الکترون ها در همان سلول حبس می شوند . حافظه های مبتنی بر ROM به پنج قسمت تقسیم میشوند که به توضیح هر یک خواهیم پرداخت .
      حافظه ROM استاندارد : این حافظه در هنگام ساخته شدن تراشه و توسط کارخانه سازنده قابل برنامه ریزی است و اگر در طی پروسه تولید اشتباهی رخ دهد کل چیپ غیر قابل استفاده خواهد بود ؛ بنابراین ساخت یک چیپ ROM زحمت زیادی از نظر پردازش اطلاعات دارد ولی امروزه با پیشرفت تکنولوژی این اشتباه کمتر رخ می دهد . حافظه های ROM مصرف برق بسیار پایینی دارند و بسیار پایدار و قابل اعتماد هستند و امروزه در بیشتر وسایل الکترونیکی از یک چیپ ROM برای برنامه ریزی استفاده می شود .
      حافظه PROM : این حافظه زیر مجموعه ای از حافظه ROM بوده و بصورت خالی تولید می شوند و توسط هر شخصی قابل برنامه ریزی هستند و عمل برنامه ریزی توسط دستگاهی به نام Programmer صورت می گیرد .
      حافظه EPROM : اطلاعات این حافظه را میتوان توسط امواج ماورای بنفش پاک و توسط ادوات Programmer برنامه ریزی کرد .
      حافظه EEPROM : حافظه فقط خواندنی است که اطلاعات توسط مدار واسط با ولتاژ الکتریکی نوشته و پاک می شود ، در این حافظه ما می توانیم اطلاعات معینی را از حافظه پاک کنیم و نیازی به پاک کردن کل حافظه نیست ؛ همچنین قابل ذکر است که حافظه های EEPROM از لحاظ سرعت کند هستند و برای وسایلی که نیاز است به سرعت مقدار حافظه های چیپ را تغییر دهند اصلاً مناسب نیست ، این نوع حافظه دو مدل است :
      1 - موازی ( Parallel ) : آدرس دهی ، نوشتن و خواندن حافظه به صورت موازی انجام می گیرد .
      2 - سریال ( Serial ) : آدرس دهی حافظه و سخت افزاری ، عمل نوشتن و خواندن حافظه به صورت سریال انجام می گیرد ؛ پروتکلی که در این سخت افزار می تواند مورد استفاده قرار گیرد I2C یا ارتباط سریال دوسیمه نام دارد ، در حقیقت این ارتباط 4 سیمه است زیرا علاوه بر سیم های SCL و SDA به سیم های مثبت و منفی تغذیه نیز ، نیاز خواهد بود . این پروتکل توسط تمامی میکروکنترلر و پردازنده های ARM پشتیبانی خواهد شد ؛ نمونه هایی از چیپ EEPROM سریال می توان به تراشه های سری AT24CXX – AT24CXXX – AT24CXXXX که جزء تراشه های کاربردی و معروف EEPROM ساخت کمپانی Atmel می باشند اشاره کرد و همچنین سایر چیپ های EEPROM که توسط کمپانی های مختلف طراحی و تولید میشوند .
      حافظه FLASH : حافظه FLASH اولین بار در سال 1980 توسط شرکت TOSHIBA معرفی شد ، در واقع با اختراع حافظه FLASH محدودیت سرعت در حافظه EEPROM برطرف شد . تفاوت بین این دو حافظه در این است که عمل نوشتن و خواندن اطلاعات در حافظه EEPROM بصورت بایتی و با سرعت کُند انجام میگرد اما در حافظه FLASH عمل نوشتن و خواندن اطلاعات بصورت بلوک های 256 یا 512 بایتی با سرعت بیشتر انجام خواهد گرفت و علاوه بر این تعداد دفعات پاک کردن و نوشتن اطلاعات در حافظه FLASH بیشتر است . Solid State نام دیگر حافظه FLASH میباشد و علت آن این است که حافظه های FLASH در ساختمان خود هیچ بخش متحرکی ندارند و به طور متوسط هر 100 هزار سلول یک سکتور به حساب می آیند . مصرف بسیار کم انرژی در هنگام خواندن و نوشتن اطلاعات ، طولانی بودن زمان ماندگاری اطلاعات ، کار کردن در شرایط محیطی سخت ( در دمای بین 0 تا 60 درجه¬ی سانتیگراد – رطوبت بین 5 % تا 95 % ) و ... سبب محبوبیت و در نتیجه افزایش کاربرد حافظه FLASH شده است . امروزه از حافظه FLASH در ساختمان میکروکنترلر و پردازنده ها برای محل ذخیره سازی برنامه ها استفاده می شود ، و همچنین بصورت چیپ های External نیز عرضه می شوند که می توانند به جای چیپ های EEPROM با سرعت بیشتری مورد استفاده قرار گیرند ، این دسته از چیپ های FLASH به طور معمول به تراشه SPI Flash معروف هستند که از طریق پروتکل SPI که توسط اکثر میکروکنترلر و پردازنده های ARM پشتیبانی می شود می توانند با تراشه کنترلر مرکزی از طریق ارتباط 4 سیمه تبادل دیتا کنند ؛ البته این ارتباط 6 سیمه است زیرا علاوه بر سیم های MISO-MOSI-SCK-SSEL به سیم های مثبت و منفی تغذیه نیز نیاز خواهد داشت ؛ این دسته از تراشه ها توسط کمپانی های مختلفی طراحی و تولید می شوند که به عنوان نمونه می توانیم به تراشه W25Q64BV ساخت کمپانی Winbond اشاره کنیم .
      1 - حافظه های NOR FLASH : در حافظه های ساخته شده بر مبنای این تکنولوژی دسترسی به اطلاعات به صورت تصادفی صورت می گیرد ؛ در این نوع از حافظه عمل نوشتن و خواندن اطلاعات بصورت بیت به بیت با سرعت کمی انجام می گیرد ؛ از جمله کاربردهای حافظه های NOR FLASH می توانیم به تلفن های سلولی ، BIOS کامپیوترها و سخت افزارهای مبتنی بر تراشه های ARM – DSP – FPGA اشاره کنیم . حافظه های NOR FLASH بصورت چیپ های External توسط کمپانی های مختلفی از جمله SAMSUNG و ... طراحی و تولید می شوند .
      2 - حافظه NAND FLASH : در حافظه های ساخته شده بر مبنای این تکنولوژی دسترسی به اطلاعات با سرعت زیادی صورت می گیرد ؛ در این نوع از حافظه عمل نوشتن و خواندن اطلاعات بصورت تکه ای با سرعت بیشتری نسبت به حافظه های NOR FLASH انجام می گیرد ؛ کاربردهای حافظه های NAND FLASH بسیار وسیع تر از NOR FLASH است و از جمله کاربردهای آن می توانیم به استفاده در سخت افزارهای مبتنی بر تراشه های ARM – DSP – FPGA در کنار حافظه NOR FLASH یا بصورت واحد اشاره کنیم . حافظه های NAND FLASH بصورت چیپ های External توسط کمپانی های مختلفی از جمله SAMSUNG و ... طراحی و تولید می شود که به عنوان مثال می توان تراشه K9F2G08(B/U)0B ساخت کمپانی SAMSUNG را معرفی کرد .

      تاریخچه ARM
      شرکت سهامی تجاری ARM Holdings یک شرکت فنی - مهندسی بریتانیایی واقع در کمبریج می باشد . این شرکت در واقع کارهای طراحی تراشه را انجام میدهد ، به بیانی دیگر این شرکت هسته های نرم افزاری خود را در به شرکت های تولید کننده تراشه به فروش میرساند . نرم افزار Keil یکی از محصولات این شرکت میباشد . این شرکت یکی از معروف ترین شرکت های جهانی در زمینه ARM میباشد ، اکثر تراشه های مورد استفاده در تلفن های همراه ، LCD های خانگی و ... محصول این شرکت است .

      معماری پردازنده های ARM ( هسته Cortex-M3 )
      بحث در مورد معماری پردازنده های ARM بسیار سنگین است ، از طرفی کلی گویی در این قسمت فایده ای ندارد پس مختصرا تنها هسته های Cortex-M3 را به صورت مختصر توضیح میدم . این هسته ها از لحاظ ریشه ای به Cortex-M معروف هستند و بنا به نوع خود در دسته های M0 , M1 , M3 , M4 تقسیم بندی میشوند . این دسته از پردازنده ها در واقع جایگزینی برای تراشه های 8 و 16 بیتی می باشند که بدلیل مصرف توان کم میتوانند در کارهای پردازشی مورد استفاده قرار گیرند . میکروکنترلرهای سری LPC176X - LPC178X - STM32F103ZET6 از هسته های Cortex-M3 بهره مند هستند . حالا بهتر است درمورد معماری Harvard توضیحاتی را ارئه دهم . این معماری بر خلاف معماری Von Neumann از دو باس آدرس و اطلاعات جداگانه برای دسترسی به حافظه کد و اطلاعات استفاده میکند ، به این ترتیب پردازنده میتواند به صورت همزمان با اجرای دستوراتی که به حافظه اطلاعات در ارتباطند به واکشی دستور بعدی بپردازد ( به بیانی دیگه میتونه با یه تیر دو نشون بزنه ) که نتیجه این موضوع افزایش کارایی و سرعت پردازشی سیستم است .

      معرفی قابلیت های میکروکنترلر ARM LPC1763/64/65/66/67/68/69
      * پردازنده 32 بیتی Cortex-M3 ( برای LPC1768 سرعت معادل 100MHZ - برای LPC1769 سرعت معادل 120MHZ )
      * بهره گیری از معماری Harvard
      1 - حافظه برنامه و داده های غیرفرّار
      * حداکثر 512KB حافظه FLASH با قابلیت ISP ( محل ذخیره سازی کدهای برنامه )
      * حداکثر 32KB حافظه SRAM ( برای بهره گیری بالا باید به باس محلی ارتباط داشته باشیم که خوشبختانه در این سری از میکروکنترلرها این امکان وجود دارد . )
      * 16KB حافظه SRAM برای رابط Ethernet
      * 8KB حافظه SRAM برای استفاده DMA همه منظوره ( البته امکان دسترسی بوسیله USB هم وجود دارد . )
      2 - باس های ارتباطی و ادوات جانبی
      * دسترسی حافظه SRAM و FLASH به CPU از طریق باس جداگانه AHB
      * دسترسی واحدهای Ethernet و USB به DMA از طریق دو باس محلی پرسرعت AHB
      * کنترل کننده وقفه تو در توی برداری ( NVIC ) با امکان پشتیبانی از 32 بردار وقفه
      * برای انتقال اطلاعات از حافظه ادوات متصل به باس های I2C - SSP - MMC/SD به حافظه تراشه از واحد GPDMA استفاده میشود که برای دسترسی به آن تراشه از باس پرسرعت AHB استفاده میکند .
      3 - امکانات جانبی
      * 70 الی 100 پین ورودی / خروجی پرسرعت ( GPIO ) که خودشان دارای مقاومت Pull-up داخلی هستند
      * یک واحد مبدل ADC 12بیتی که روی 8 کانال مالتی پلکس شده ، سرعت نمونه برداری میتواند به 200 هزار نمونه در ثانیه هم برسد .
      * یک واحد مبدل DCA 10 بیتی
      * 4 واحد تایمر / کانتر همه منظوره با 8 ورودی Capture و 10 خروجی Compare ( هر تایمر / کانتر نیز میتواند دارای ورودی خارجی باشد )
      * یک واحد مدولاسیون پهنای پالس ( PWM ) با امکان کنترل موتور سه فاز ( MCPWM ) - ( این واحد میتواند دارای دو وروی شمارش خارجی باشد )
      * یک واحد زمان سنج دقیق ( RTC ) با تغذیه ورودی جداگانه ( منبع کلاک واحد RTC از طریق کلاک اسیلاتور RTC یا باس کلاک که به APB معروف است تأمین میشود )
      * 20B از حافظه SRAM از تغذیه حافظه RTC استفاده میکند که اجازه میدهد اطلاعات حتی در صورت خاموشی هم پایدار بماند .
      * تایمر سگ نگهبان ( WDT ) - ( کلاک این واحد میتواند از RC داخلی ، نوسان ساز RTC و یا باس کلاک APB تأمین شود )
      * تایمر System Tick
      * تایمر وقفه تکرار شونده ( RIT )
      * EMAC با سرعت 10/100Mbs و کنترل کننده DMA ( تراشه های سری LPC176X دارای ماژول داخلی اترنت هستند که با استفاده سخت افزار واسط میتوان آن را پیاده سازی کرد . )
      * رابط USB2.0 با PHY درون تراشه ای ( همانطور که در بالا هم ذکر شد واحد های USB و Ethernet از باس AHB بصورت مستقل استفاده میکنند . )
      * قابلیت برنامه ریزی ارتباط سریال تک سیمه ( 1Wire )
      * 4 ورودی وقفه خارجی با قابلیت تنظیم لبه حساس ( بالارونده - پایین رونده )، که این قابلیت بر روی پورت های صفر و دو تراشه وجود دارد .
      * 4 رابط سریال UART که میتواند Baud مستقل تولید کند و هر بلوک آن دارای حافظه FIFO میباشد . این واحد ارتباط فول مودم ، مدولاسیون مادون قرمز IRDA ، ارتباط RS232 و RS485 را پشتیبانی میکند .
      * دو کانال کنترل کننده CAN2.0
      * یک واحد کنترل کننده ارتباط جانبی سریال ( SPI )
      * دو واحد کنترل کننده ارتباط SSP با حافظه FIFO و با قابلیت استفاده از چند پروتکل مختلف ( یکی از این واحدها جایگزینی برای SPI میباشد که این امکان وجود دارد از وقفه و پین های مشترک استفاده نماید ، این واحد هم چنین میتواند از GPDMA نیز استفاده کند . )
      * سه رابط سریال دو سیمه ( I2C ) - ( یکی بصورت Open-drain و دوتای دیگربصورت Close-drain استاندارد میباشند . )
      * رابط( I2S ( Inter-IC Sound برای ورودی و خروجی صدای دیجیتال ( این واحد میتواند از GPDMA نیز استفاده کند . )
      * دارای رابط استاندارد JTAG جهت تست و خطایابی
      * واحد ردیابی شبیه ساز با پشتیبانی از ردیابی زمان واقعی
      * دارای 4 حالت کاهش مصرف توان : Idle - Sleep - Power down - Deep Power Down
      * خروج پردازنده از مُد Power Down با رخ دادن هر وقفه
      * هر واحد جانبی دارای یک مقسم کلاک برای کنترل مصرف توان میباشد .
      * دارای آشکارساز Brown out ( پایین آمدن سطح ولتاژ تغذیه ) با آستانه مجزا برای ایجاد وقفه و یا عملیات Reset
      * Reset داخلی .
      4 - فرکانس های کاری
      * نوسان ساز خارجی با فرکانس 1MHZ تا 25MHZ
      * نوسان ساز داخلی 4MHZ که میتواند به عنوان کلاک سیستم مورد استفاده قرار گیرد . خطای این کلاگ 1% میباشد و بدلیل دقت پایین برای واحد های CAN و USB استفاده نمیشود .
      * دارای PLL داخلی که فرکانس سیستم را چند برابر میکند بدون آنکه به کریستال خارجی فرکانس بالا نیاز باشد .
      * برای اینکه در ادوات متصل به USB از انعطاف پذیری بالایی برخوردار باشیم ، واحد USB نیز از PLL استفاده میکند .
      5 - ولتاژهای عملیاتی
      * تغذیه 3.3 ولتی واحد ( رنج پیش بینی شده 2.4 تا 3.6 ولت )
      * تغذیه جداگانه برای واحد RTC و اتصال باتری پشتیبان
      * در میکروکنترلرهای سری LPC176X امکان تنظیم دقیق مصرف تغذیه براساس خصوصیات سیستم وجود دارد . بدین منظور تراشه دو محدوده تغذیه مستقل را جهت تنظیمات در اختیارمان قرار میدهد .
      6 - حفاظت برنامه
      * محافظت از کد برنامه با 4 سطوح امنیتی مختلف
      * کد شناسایی قطعه به منظور شناسایی
      7 - بسته بندی
      * LQFP100 ( بسیار پرکابرد است )
      *TFBGA100
      برای کسب اطلاعات در مورد چینش پایه های تراشه ، بلوک دیاگرام ، اندازه تراشه ، اطلاعاتی جهت طراحی فوت پرینت برای PCB و ... میتونید به دیتاشیت تراشه مراجعه کنید که به راحتی میتونید از سایت www.nxp.com دانلود کنید . البته در جلسات آینده من فوت پرینت این تراشه رو که در نرم افزار Altium Designer طراحی شده رو براتون قرار میدم و فکر کنم که تو انجمن هم یکی از دوستان این زحمت را کشیدند .......

      دیدگاه


        #4
        پاسخ : آموزش کامل و جامع طراحی سیستم با میکروکنترلر ARM LPC176X Cortex-M3

        ادامه مباحث جلسه اول


        نحوه ایجاد پروژه در کامپایلر Keil
        طبق مراحل زیر عمل میکنیم :

        * قبل از هر چیزی یه پوشه روی دسکتاپ یا هر درایوری ایجاد کنید و نام آن را بصورت دلخواه تعیین کنید . بعد دو فایل core_cm3.c و system_LPC17xx.c رو در داخل پوشه بریزید ؛ حتماً این کار رو انجام بدید بعداً نگین نگفتیا !!!!!!

        1 - به منوی Project رفته و گزینه New uvision Project رو انتخاب میکنیم .

        2 - در این مرحله پنجره ای باز میشود و از شما خواسته میشود که نام پروژه تعیین کنید و سپس گزینه save را بزنید .

        3 - در این مرحله پنجره ای باز میشود و از شما میخواهد تراشه مورد نظرتان را انتخاب کنید و سپس گزینه OK را بزنید .

        4 - در این مرحله پنجره ای باز میشود که از شما اضافه شدن فایل Startup میکروکنترلر سوال میکند که شما باید آن را تأیید کرده و به مرحله بعد بروید .

        5 - دراین مرحله به منوی File رفته و ابتدا گزینه New را انتخاب کنید و سپس گزینه save را انتخاب کنید و فایل را با پسوند C. ذخیره کنید ، دوستان حتما فایلتونو با این پسوند ذخیره کنید و عبارت C. رو حتما لحاظ کنید وگرنه در مراحل بعدی با مشکل روبرو میشید .

        6 - حال در پالت Project عبارت Target1 را به نام دیگر تغییر دهید ( اختیاری است ) و سپس علامت + کنار را انتخاب کنید تا به علامت - تبدیل شود . سپس بر روی Target1 یا هر نامی که برای آن انتخاب کردید کلیک راست کنید و گزینه Add Group را انتخاب کنید . یک پوشه جدید به پروژه اضافه میشود که میتوانید بصورت اختیاری آن را نام گذاری کنید .

        7 - دراین مرحله در پالت Project بر روی پوشه ای که ایجاد کردید دابل کلیک کنید و دو فایل core_cm3.c و system_LPC17xx.c رو به همراه فایلی که در مرحله 5 با پسوند C. ذخیره کردید با استفاده از گزینه Add به پروژه اضافه کنید و سپس گزینه close را انتخاب کنید .

        8 - در این مرحله میتوانید کدنویسی کنید ، بعد از کدنویسی برای کامپایل کردن برنامه میتوانید از منوی project گزینه Rebulid All Target Files رو انتخاب کنید ، اگه برنامه error نداشت که هیچی ، به خوبی و خوشی برین شبیه سازی کنید و بعدشم برنامه رو پروگرام ، ولی اگه خطایی رخ بده با دابل کلیک کردن رو اون میتونید خطی که در آن خطا رخ داده رو مشخص کنید .

        9 - حالا نوبت اینه که به تنظیم پروژه بپردازیم :

        * قبل از هر چیز اگه از پروگرامر JLINK استفاده میکنید ابتدا درایور اونو طبق راهنمای همراه محصول نصب کنید سپس مراحل زیر را طی نمایید .

        ابتدا به منوی project رفته و گزینه option for target رو انتخاب کنید . در این محیط 8 سربرگ را میبینید ، ابتدا به سربرگ Target رفته و فرکانس کریستال متصل به میکرو کنترلر رو تنظیم کنید . مقدار پیش فرض 12.0 میباشد که بهترین گزینه است . حالا اگه پروگرامر Bootloader استفاده میکنید در قسمت پایین IROM1 = 0x2000 مقدار دهی کنید که آدرس شروع برنامه حافظه flash را تعیین میکند در غیر اینصورت IROM1 = 0x0 باشد که بصورت پیش فرض مقدار دهی میشود . اگه حالشو دارین برین سربرگ output و گزینه مربوط به ایجاد فایل HEX خروجی رو فعال کنید .
        برای فعال سازی شبیه ساز به سربرگ Debug برین و گزینه Use Simulator رو فعال کنید ، همچنین اگه از پروگرامر JLINK استفاده میکنید در سمت راست از سربرگ Debug عبارت Use رو فعال و سپس پروگرامر jLINK رو انتخاب کنید . در مرحله پایانی به سربرگ ASM رفته و در کادر Define عبارت NO_CRP را وارد کنید و در سربرگ Linker نیز گزینه Use Memory Layout from Target Dialog را فعال کنید . سپس دوباره برنامه رو کامپایل کرده و از منوی Flash گزینه Download را برای برنامه ریزی تراشه انتخاب کنید ، برای پاک کردن تراشه از گزینه Erase استفاده نمایید .

        اما در مورد محیط شبیه سازی کامپایلر Keil ، حقیقتشو اگه بخواین من تا امروز که با Keil سر و کار داشتم تا حالا اصلا از محیط شبیه سازیش استفاده نکردم چون بدجور قاطی داره البته انتظاره میره در نسخه 5 به بالا این مشکل برطرف شه ، خدا کنه ؛ پس فعلا شبیه ساز رو بی خیال شین ، هیچ بهتر از سخت افزار نمیتونه به شما کمک کنه ، البته این بستگی به انتخاب خودتون داره ، اگه میخواین از شبیه ساز استفاده کنید از منوی Debug گزینه start/stop debug session رو انتخاب کنید ، البته اگه برنامه کامپایل نشه شبیه ساز اجرا نمیشه و از طرفی برای استفاده شبیه ساز حتما باید مقدار IROM1 = 0X0 مقدار دهی بشه ، در نسخه 5 به بالا سعی میکنم شبیه ساز keil رو بصورت کامل بررسی کنم .


        اصول برنامه نویسی به زبان C برای ARM
        این قسمت نیز همانند قسمت های قبلی بسیار اهمیت داره ، اما از شما دوستان عزیزم انتظار میره که حداقل بصورت پایه زبان C رو بلد باشید ، بهتون پیشنهاد میکنم کتاب برنامه نویسی به زبان C رو که نوشته مهندس جعفرتژادقمی هستش رو مطالعه کنید ، خیلی بهتون کمک میکنه ، اما یه چیزایی رو باید تو برنامه نویسی ARM بلد باشین که مطمئنا در کتاب مذکور وجود ندارد ، و اون متغیرهایی که کامپایلر Keil پشتیبانی میکنه ، متغیرها یکی از قسمت های مهم برنامه هستند . حالا نظر من اینه که در جلسات بعدی با اجرای پروژه به شما آموزش زبان C رو که مخصوص ARM هستش رو بدم ، اینجوری بهتر مییتونید زبان C را درک کنید ، یعنیی در هر جلسه دستورات جدیدی رو یاد بگیرید اینجوری تو ذهنتون می مونه همچنین در جلساتی که مباحث پیشرفته تر ارائه میکنم نحوه نوشتن کتابخانه رو هم آموزش میدم .

        در جلسه اول چون استارت کار بود سعی کردم مطالب پایه رو برای شروع کار ارائه کنم ، مطالب هر جلسه به همین 7 تا تیپ ختم نمیشه ، در جلسات آینده با هم خیلی خیلی کار داریم ....
        پیروز و سربلند باشید....

        **** پایان جلسه اول ****

        دیدگاه


          #5
          پاسخ : آموزش کامل و جامع طراحی سیستم با میکروکنترلر ARM LPC176X Cortex-M3

          سلام استاد

          خیلی ببخشید
          من یه کتابی دارم که با این توضیحاتی که شما میدید خیلی شباهت داره
          کتاب هم توی فروشگاه خود سایت هست ، که اگر همون توضیحات رو میخایم بدیم بهتر نیست کتاب رو بخرن و بخونن و بعد ما بیایم پروژه های عملی رو انجام بدیم ???
          http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

          دیدگاه


            #6
            پاسخ : آموزش کامل و جامع طراحی سیستم با میکروکنترلر ARM LPC176X Cortex-M3

            سلام soodi

            شباهت این مباحث فقط تو همین جلسه اول شاید دیده بشه ، البته شباهت اونچنانی هم نیست ، کتابی هم که تو فروشگاست من خودم ندارمش ، از طرفی تو ایران کتابی وجود نداره که بخواد مطابق برنامه ریزی من این طور آموزش بده که بخواد اترنت و can و usb و ... بصورت حرفه ای یاد بده ... از شما و همه دوستان عزیزم میخوام تا پایان کار صبور باشید و در آخرین قضاوت نمایید ... با عرض پوزش هم از شما و همه دوستانم خواهشمندم که نظرات رو بصورت پیغام خصوصی ارسال کنند تا آموزش های بصورت پیوسته ارائه و از نظم خاصی برخوردار بشه ......... یا علی

            دیدگاه


              #7
              پاسخ : آموزش کامل و جامع طراحی سیستم با میکروکنترلر ARM LPC176X Cortex-M3

              جلسه 2 : راه اندازی و کنترل اولیه سیستم ( A )

              جلسه 2 ( بخش 1 ) : 1 - معرفی باس های داخلی تراشه و ادوات جانبی متّصل شده

              میکروکنترلرهای خانواده ARM LPC176X Cortex-M3 از دوباس پیشرفته AHB و APB برخوردار هستند که تمامی امکانات تراشه از جمله بلوک USB ، Ethernet ، GPIO ، SSP و ... بر روی این دوباس قرار دارند . بهره گیری میکروکنترلر از این دوباس و از طرفی ساختار ماتریسی باس AHB جهت کنترل همه جانبه سبب شده این سری از میکروکنترلر از کارایی و سرعت بالایی برخوردار باشند . باس AHB در واقع امکان دسترسی بلوک های USB , Ethernet , GPDMA , Fast Gpio به حافظه را بدون واسط ممکن میسازد که برای این منظور خود از سه باس D-Code , I - Code , System تشکیل شده است که هر یک با آدرس مشخص امکان کنترل حافظه را میسر میسازند . در کنار باس AHB برای عدم ترافیک و جلوگیری از کاهش سرعت اجرایی باس APB قرار دارد . در واقع بیشتر امکانات میکرو بر روی این باس قرار دارند که خود به دو باس APB0 , APB1 تقسیم بندی میشود و یکی از قابلیت های APB این است که سبب میشود که ادوات جانبی از قبیل پورت سریال ، پروتکل I2C ، ارتباط SSP ، تایمر / کانتر و ... با سرعت کمتری عمل کنند و در نتیجه سبب کاهش مصرف توان تراشه شوند . این قسمت چون جزو مطالعه محسوب میشوند و از طرفی سبب میشوند تا شما با ساختار داخلی میکرو آشنا شوید بنابراین در اجرای عملی کاربردی ندارند ، پس برای اطلاعات بیشتر میتوانید به دیتاشیت مراجعه کنید . البته به این نکته هم اشاره کنم که یک بحث خیلی مهم راجب این دوباس ( APB - AHB ) باقی می ماند که در قسمت مموری کارت MMC / SD آن را ارائه میدهم .

              2 - اجرای برنامه از ساختمان حافظه
              میکروکنترلرهای سری ARM LPC176X Cortex-M3 از دو محل مختلف به اجرای برنامه می پردازند :
              1 - Bootloader : پس از ریست شده برنامه کنترل برنامه به آدرس 0X1FFF0000 منتقل میشود .
              2 - حافظه Flash : آدرس شروع این حافظه 0X00000000 است . ( البته توجه داشته باشید در ابتدا برنامه Boot اجرای میشود و سپس در صورت شناسایی برنامه اپراتور آدرس شروع برنامه 0X00000000 لحاظ میشود . )
              نکته مهم : دوستان توجه داشته باشید که میکروکنترلرهای ARM LPC176X Cortex-M3 فاقد واحد EMC ( واحد کنترل حافظه خارجی ) هستند ، بنابراین قادر نخواهید بود توسط این میکروکنترلر برنامه را از طریق حافظه SRAM , NOR FLASH , NAND FLASH کنترل کنید ، البته امکان کنترل تراشه های SPI Flash وجود دارد که در جلسات آینده به تفضیل آن را بررسی می کنیم .

              3 - رجیستر MEMMAP
              این رجیستر ، اولین رجیستری می باشد که آن را بررسی می کنیم . برای اینکه تعیین نمائید میکروکنترلر از حافظه BOOT ROM یا Flash Memory برنامه را اجرا کند میتوانید از این رجیستر استفاده کنید . البته استفاده از این رجیستر به ندرت صورت میگرد زیرا با استفاده از کامپایلر Keil میتوانید بصورت نرم افزاری این کار را انجام دهید ؛ ولی در هر صورت لازم دانستم تا این رجیستر را معرفی کنم . این رجیستر در آدرس 0x400FC040 از فضای حافظه قرار دارد و تنها بیت 0 برای این رجیستر در نظر گرفته شده است . در صورتی که مقدار این بیت برابر ( 0 ) باشد حالت BOOT ROM و زمانیکه برابر ( 1 ) باشد حالت Flash Memory انتخاب میشود . در هر دو حالت فوق مقدار این رجیستر پس از ریست تراشه برابر ( 1 ) است .
              پیشنهاد من به شما این که فعلا سر به سر این رجیستر نزارید ، یه خورده حوصله کنید در جلسات آینده سعی میکنم یه برنامه کلی با کاربرد رجیستر MEMMAP رو براتون ارائه بدم .

              دیدگاه


                #8
                پاسخ : آموزش کامل و جامع طراحی سیستم با میکروکنترلر ARM LPC176X Cortex-M3

                جلسه 2 ( بخش 2 ) : 1 - کنترل منابع Reset

                1 - 1 کنترل سخت افزاری
                مدار شکل 1 و 2 برای کنترل منبع Reset میکروکنترلر در نظر گرفته شده اند . با پیاده سازی مدار شکل 1 میتوانید تراشه را با استفاده میکروسوئیچ به صورت دستی Reset کنید و از مدار شکل 2 میتوانید در کاربردهای صنعتی استفاده کنید . مدار شکل 2 از یک ترانزیستور NPN تشکیل شده است ؛ برای انتخاب ترانزیستور مشخصات زیر را بصورت حداقل مقدار در نظر داشته باشید : ( ولتاژ 50 ولت : جریان 0.2 آمپر : توان 0.5W : فرکانس 300MHZ ) --- به عنوان مثال میتوانید از ترانزیستور BC547B استفاده کنید . با تحریک بیس ترانزیستور توسط یک پین از پورت میکروکنترلر در وضعیت High میتوانید در زمان خاص به صورت اتوماتیک تراشه را ریست کنید یا میتوانید برای ریست تراشه یک منو با استفاده از GUI طراحی کنید و سپس از طریق تاچ اسکرین به واسطه TFTLCD میکروکنترلر را ریست کنید . در جلسات آینده پروژه ای را تحت همین عنوان برایتان در نظر گرفتم .
                نکته خیلی مهم : در استفاده از مدار شکل 2 دقت کنید که برنامه را طوری بنویسید که خروجی کلکتور ترانزیستور حداقل 3 میکروثانیه پایه Reset میکروکنترلر را در وضعیت Low قرار دهد .



                تبصره : از این قسمت به بعد هر جا به 0xXXXXXXXX برخورد کردیم دقت کنید که این کد در مبنای 16 میباشد که هر یک از کاراکترهای X نماینده 4 بیت است که در مجموع 32 بیت میشود .

                2 - 1 - تعیین منبع Reset با مقدار دهی رجیستر RSID
                این رجیستر در آدرس 0x400FC180 از حافظه قرار دارد . برای این رجیستر تنها بیت های 0 : 3 ( 0 و 1 و 2 و 3 ) در نظر گرفته شده اند و ست کردن هر بیت آنها را به صفر تغییر میدهد . برای دسترسی به این رجیستر در کامپایلر Keil میتوانید از کد زیر استفاده کنید :

                LPC_SC -> RSID = 0xXXXXXXXX; Keil Code

                بیت 0 ( POR ) : فعال سازی این بیت باعث میشود تراشه به ناپایداری ولتاژ تغذیه و اسیلاتور واکنش نشان دهد و تا زمانیکه ولتاژ تغذیه به حالت پایدار نرسید ، بصورت اتوماتیک ریست شود .

                بیت 1 ( EXTR ) : فعال سازی این بیت باعث میشود تراشه از شمارش تعداد مشخصی پالس های کلاک برای خارج از شدن از وضعیت ریست مکرر ( در حالت ناپایداری ولتاژ تغذیه و اسیلاتور ) استفاده کند . این بیت دارای که یک ورودی منحصر به فرد میباشد که به اشمیت تریگر معروف است ؛ شمارش پالس ها از این ورودی صورت میگرد .

                بیت 2 ( WDTR ) : فعال سازی این بیت باعث میشود که تراشه از تایمر Watchdog برای ریست شدن استفاده کند؛ البته شرط لازم این است که تایمر WDT از قبل پیکربندی و راه اندازی شده باشد .

                بیت 3 ( BODR ) : فعال سازی این بیت باعث میشود که تراشه به محدوده ولتاژ حساسیت نشان دهد و در صورتیکه ولتاژ از حد تعریف شده بیشتر شود میکروکنترلر ریست خواهد شد .


                3 - 1 - کنترل Self -Reset
                میکروکنترلرهای سری ARM LPC176X Cortex-M3 برای کنترل Self-Reset ( به بیانی دیگر یعنی راه اندازی مجدد سیستم بوسیله خود تراشه ) از رجیستر AIRCR استفاده میکنند که این رجیستر در آدرس 0xE000ED0C از حافظه قرار دارد . برای دسترسی به این رجیستر در کامپایلر Keil میتوانید از کد زیر استفاده کنید :

                SBC-> AIRCR = 0xXXXXXXXX; Keil Code

                بدیهی است که تمای هسته های ARM Cortex-M3 برای کنترل Self-Reset از این رجیستر استفاده میکنند و دارای دو ویژگی منحصر به فرد مطابق زیر هستند :

                1 - SYSRESETREQ : این ویژگی مخصوص بیت 2 بوده و فقط نوشتنی ( WO ) است . با برنامه ریزی این بیت در واقع اجازه Self-Reset داده میشود . برای تحقق این امر باید بیت 2 را ست نمائید . این ویژگی از ضریب اطمینان بالایی برخوردار بوده و میتواند اکثر بخش های سیستم را مجدداً در یک زمان راه اندازی کند .

                2 - VECTRESET : این ویژگی مخصوص بیت 0 بوده و فقط نوشتنی ( WO ) است و بصورت انحصاری میتواند در مواردی که نرم افزار نیاز دارد پردازنده را تنها ( مستقل از المان ) راه اندازی کند استفاده میشود . با ست کردن این بیت میکروکنترلر مجدداً راه اندازی میشود ؛ این نکته را متذکر میشوم که ادوات جانبی خارج از میکروکنترلر یا هر هسته Cortex-M3 دیگر در سیستم ریست نمیشوند .

                دیدگاه


                  #9
                  پاسخ : آموزش کامل و جامع طراحی سیستم با میکروکنترلر ARM LPC176X Cortex-M3

                  جلسه 2 ( بخش 3 ) : 1 - کنترل منابع کلاک

                  1 - 1 معرفی و بررسی رجیسترهای اصلی کنترل منابع کلاک

                  1 - 1 - 1 رجیستر CLKSRCSEL
                  برای تعیین منبع کلاک بلوک PLL0 از این رجیستر استفاده میکنیم . این رجیستر در آدرس 0x400FC10C از حافظه قرار دارد و تنها بیت های 0 و 1 برای کار با این رجیستر در نظر گرفته شده است . برای دسترسی به این رجیستر در کامپایلر Keil میتوانید از کد زیر استفاده کنید .

                  LPC_SC-> CLKSRCSEL = 0xXXXXXXXX; Keil Code

                  مقادیر بیت های 0 و 1 ( بیت CLKSRC ) مطابق زیر میباشد :
                  مقدار 00 : جهت استفاده از نوسان ساز داخلی ( بطور پیش فرض این مقدار در رجیستر قرار دارد ) با فرکانس کاری 4MHZ ( دوستان توجه داشته باشید که نوسان ساز داخلی به هیچ عنوان برای راه اندازی بلوک CAN و USB مناسب نیست ، در صورت عدم توجه به این موضوع ممکن با مشکل روبرو شوید . )
                  مقدار 01 : جهت استفاده از کریستال خارجی با فرکانس 1MHZ تا 24MHZ ( به دلیل وجود بلوک PLL در داخل تراشه فرکانس داخلی تراشه بدون نیاز به کریستال خارجی فرکانس بالا تا 120 مگاهرتز افزایش میابد که در صورت Over Clock کردن میتواند فرکانس های بالاتری هم تولید کند . )
                  مقدار 10 : جهت استفاده از کریستال خارجی با فرکانس 32.768KHZ یا 32768HZ که کلاک خروجی آن برای راه اندازی RTC مورد استفاده قرار میگرد .
                  مقدار 11 : تعریف نشده

                  1 - 1 - 2 رجیستر SCS
                  برای استفاده از نوسان ساز اصلی تراشه از این رجیستر استفاده می کنیم . این رجیستر در آدرس 0x400FC1A0 از حافظه قرار دارد و تنها بیت های 4 و 5 و 6 برای این رجیستر در نظر گرفته شده اند . برای دسترسی به این رجیستر در کامپایلر Keil میتوانید از کد زیر استفاده کنید :

                  LPC_SC-> SCS = 0xXXXXXXXX; Keil Code

                  مقادیر بیت ها مطابق زیر میباشد :
                  بیت 4 ( OSC ) : خواندنی / نوشتنی - تنظیم محدوده نوسان ساز خارجی
                  مقدار 0 : رنج فرکانسی 1MHZ - 20MHZ
                  مقدار 1 : رنج فرکانسی 15MHZ - 24MHZ

                  بیت 5 ( OSCEN ) : خواندنی / نوشتنی - فعال سازی کریستال خارجی
                  مقدار 0 : غیر فعال
                  مقدار 1 : فعال

                  بیت 6 ( OSC STAT ) : خواندنی / نوشتنی - تعیین وضعیت نوسان ساز خارجی
                  مقدار 0 : آماده نبودن نوسان ساز اصلی
                  مقدار 1 : آماده بودن نوسان ساز اصلی


                  [color=red]نکات خیلی مهم ( در همین جلسه در قسمت آخر به این نکات نیازمندیم ، پس راحت از این دو نکته نگذرید ) //
                  1 - در بیت هایی که برای رجیستر در نظر گرفته نشدند نباید هیچ چیزی بنویسید ؛ بزارید همان مقدار تعیین شده ( 0 ) باشد .
                  [glow=red,2,300]2 - به طور کلی برای فعال سازی نوسان ساز اصلی و تعیین محدوده آن مقدار رجیستر SCS را برابر 0x20 مقدار دهی کنید ( Bit5=1 , Bit4=0 [/color )][/glow]

                  دیدگاه


                    #10
                    پاسخ : آموزش کامل و جامع طراحی سیستم با میکروکنترلر ARM LPC176X Cortex-M3

                    جلسه 2 ( ادامه بخش 3 ) : 1 - کنترل منابع کلاک

                    2 - 1 معرفی و بررسی رجیسترهای کنترل کننده بلوک PLL0

                    1 - 2 - 1 رجیستر کنترل PLL0CON
                    این رجیستر خواندنی / نوشتنی بوده و در آدرس 0x400FC080 از حافظه قرار دارد . وظیفه ای اصلی این رجیستر کنترل بلوک PLL0 است ؛ تنها بیت های 0 و 1 برای این رجیستر در نظر گرفته شده اند . برای دسترسی به این رجیستر در کامپایلر Keil میتوانید از کد زیر استفاده کنید :

                    LPC_SC->PLL0CON = 0xXXXXXXXX; Keil Code

                    مقادیر این بیت مطابق زیر میباشد :
                    بیت 0 ( PLLE0 ) : فعال سازی PLL0 و قفل شدن روی فرکانس خروجی ( برای این منظور باید این بیت را ست کنید . )
                    بیت 1 ( PLLE1 ) : تنظیم فرکانس خروجی PLL0 به عنوان کلاک واحدهای داخلی ( برای این منظور باید این بیت را ست کنید . )

                    1 - 2 - 2 رجیستر تنظیمات PLL0CFG
                    این رجیستر خواندنی / نوشتنی بوده و در آدرس 0x400FC084 از حافظه قرار دارد . وظیفه ی اصلی این رجیستر نگهداری ضرایب ضرب و تقسیم PLL0 میباشد . تنها بیت های 14:0 ( 0 تا 14 ) و 23:16 ( 16 تا 23 ) برای این رجیستر در نظر گرفته شده اند . برای دسترسی به این رجیستر در کامپایلر Keil میتوانید از کد زیر استفاده کنید :

                    LPC_SC->PLL0CFG = 0xXXXXXXXX; Keil Code

                    مقادیر این بیت مطابق زیر میباشد :
                    بیت های 0 تا 14 ( MSEL0 ) : ضریب ضرب کننده در PLL0 میباشد ، رنج این عدد از 6 تا 512 است . هر عددی که در این محدوده به عنوان ضریب ضرب کننده در نظر گرفته شود باید یک واحد به آن اضافه گردد و سپس در محاسبه مورد استفاده قرار گیرد .
                    بیت های 16 تا 23 ( NSEL0 ) : ضریب تقسیم کننده در PLL0 میباشد ، رنج این عدد از یک تا 32 است . هر عددی که در این محدوده به عنوان ضریب تقسیم کننده در نظر گرفته شود باید یک مقدار به آن اضافه گردد و سپس در محاسبه مورد استفاده قرار گیرد .

                    1 - 2 - 3 رجیستر وضعیت PLL0STAT
                    این رجیستر فقط خواندنی در آدرس 0x400FC088 از حافظه قرار دارد . این رجیستر وظیفه دارد تا ضرایب و حالت هایی را که بر بلوک PLL0 تأثیر میگذارند آشکار کند . به جزء بیت ها 1 و 15 و 27 تا 31 بقیه بیت های برای کار با این رجیستر در نظر گرفته شدند . برای دسترسی به این رجیستر در کامپایلر Keil میتوانید از کد زیر استفاده کنید :

                    a = LPC_SC->PLL0STAT; Keil Code

                    مقادیر و نوع بیت مطابق زیر است :
                    بیت های 0 تا 14 ( MSEL0 ) : نمایش ضریب ضرب کننده در بلوک PLL0
                    بیت های 16 تا 23 ( NSEL0 ) : نمایش ضریب تقسیم کننده در بلوک PLL0
                    بیت 24 ( PLLE0_STAT ) : اگر این بیت یک شود PLL0 فعال میشود و پس از خاموشی PLL0 این بیت به صورت اتوماتیک خاموش میشود .
                    بیت 25 ( PLLC0_STAT ) : اگر این بیت با بیت صفر از رجیستر PLL0CON یک شوند فرکانس خروجی PLL0 به عنوان منبع کلاک واحدهای دیگر مورد استفاده قرار میگرد و به طور معمول پس از خاموشی PLL0 این بیت به صورت اتوماتیک صفر میشود .
                    بیت 26 ( PLOCK0 ) : اگر این بیت یک شود این به معنی قفل شدن PLL0 روی فرکانس مورد نظر است .

                    نکته : رجیستر PLL0STAT همانند 2 رجیستر معرفی شده در قبل از نظر کاربردی حائز اهمیت است که در پایان جلسه دوم با مثال های جامعی که ارائه میشود بصورت عمیق پی به کاربرد آن خواهید برد .

                    1 - 2 - 4 رجیستر PLL0FEED
                    این رجیستر فقط نوشتنی در آدرس 0x400FC08C از حافظه قرار دارد . هر تغییر که در رجیسترهای PLL0CON و PLL0CFG ایجاد میکنید باید بعد از آن ابتدا این رجیستر را بامقدار 0xAA و سپس با مقدار 0x55 مقدار دهی کنید . این نکته را متذکر میشوم که از 32 بیت کل ، تنها 8 بیت ابتدای این رجیستر مقدار دهی میشود . برای دسترسی به این رجیستر در کامپایلر Keil میتوانید از کد زیر استفاده کنید :

                    LPC_SC->PLL0FEED = 0xXXXXXXXX; Keil Code

                    دیدگاه


                      #11
                      پاسخ : آموزش کامل و جامع طراحی سیستم با میکروکنترلر ARM LPC176X Cortex-M3

                      جلسه 2 ( ادامه بخش 3 ) : 1 - کنترل منابع کلاک

                      3 - 1 تنظیم کلاک CPU
                      همانطور که میدانید حداکثر فرکانس کاری مجاز برای میکروکنترلر LPC1768 برابر 100MHZ و برای LPC1769 برابر 120MHZ میباشد . این مقادیر جزء مقادیر کارخانه ای هستند و تنظیم فرکانس کلاک تا حداکثر مقدار تعریف شده مشکلی ایجاد نمیکند ، اما اگر قصد این را دارید تا فرکانس میکرو را Over Clock کرده و از محدوده تعیین شده افزایش دهید ممکن است میکروکنترلر عملکرد نامطلوبی از خود نشان دهد که در این مورد عواقب کار بر عهده خودتان است . البته در جلسات مربوط به سیستم عامل Emwin و کار با توابع DSP فرکانس میکرو را بر روی 150MHZ تنظیم میکنیم ( یه حالی میده که نگو و نپرس )
                      برای تنظیم کلاک CPU از رجیستر CCLKCFG استفاده میکنیم . این رجیستر در آدرس 0x400FC104 از حافظه قرار دارد . برای این رجیستر تنها بیت های 0 تا 7 در نظر گرفته شده اند ؛ برای انتخاب ضریب تقسیم فرکانس خروجی PLL ، مقادیری زیر معتبر هستند :
                      مقدار 0 : فر کانس PLL بر عدد 1 تقسیم میشود .
                      مقدار 1 : فرکانس PLL بر عدد 2 تقسیم میشود .
                      .
                      .
                      .
                      مقدار 255 : فرکانس خروجی PLL بر عدد 256 تقسیم میشود .


                      برای دسترسی به این رجیستر در کامپایلر Keil میتوانید از دستور زیر استفاده کنید : LPC_SC->CCLKCFG = 0xXXXXXXXX; Keil Code

                      برای محاسبه فرکانس کلاک CPU باید ابتدا مقدار PLL0CLK را محاسبه کنید که در قسمت بعدی فرمول مربوطه را معرفی و بررسی می کنیم ؛ بعد از محاسبه PLL0CLK میتوانید از فرمول زیر برای محاسبه کلاک CPU استفاده نمائید .



                      4 - 1 تنظیم کلاک USB
                      برای تنظیم کلاک USB از رجیستر USBCLKCFG که در آدرس 0x400FC108 از حافظه قرار دارد استفاده میکنیم . لازم به ذکر است که حتماً باید برای تهیه کلاک بلوک USB از خروجی PLL0 ، فرکانس خروجی PLL0 همواره مضربی از 48MHZ باشد . در رجیستر تنها 4 بیت کم ارزش به نام USBSEL در نظر گرفته شده است . برای دسترسی به این رجیستر در کامپایلر Keil میتوانید از کد زیر استفاده کنید :

                      LPC_SC->USBCLKCFG = 0xXXXXXXXX; Keil Code

                      نکته : دوستان توجه داشته داشتید که در هنگام استفاده بلوک USB هرگز از نوسان ساز RC داخلی استفاده نکنید ؛ بدلیل پایین بودن دقت این نوسان ساز سبب عملکرد نامطلوب USB میشود .


                      مقادیر بیت های 0 تا 3 ( USBSEL ) : * مقدار 5 - فرکانس PLL0 بر 6 تقسیم میشود در این حالت فرکانس خروجی PLL0 برابر 288MHZ است .

                      * مقدار 7 - فرکانس PLL0 بر 8 تقسیم میشود در این حالت فرکانس خروجی PLL0 برابر 384MHZ است .

                      * مقدار 9 - فرکانس PLL0 بر 10 تقسیم میشود در این حالت فرکانس خروجی PLL0 برابر 480MHZ است .

                      برای محاسبه فرکانس کلاک USB باید ابتدا مقدار PLL0CLK را محاسبه کنید که در قسمت بعدی فرمول مربوطه را معرفی و بررسی می کنیم ؛ بعد از محاسبه PLL0CLK میتوانید از فرمول زیر برای محاسبه کلاک USB استفاده نمائید .

                      دیدگاه


                        #12
                        پاسخ : آموزش کامل و جامع طراحی سیستم با میکروکنترلر ARM LPC176X Cortex-M3

                        جلسه 2 ( ادامه بخش 3 ) : 1 - کنترل منابع کلاک

                        4 - 1 تنظیم کلاک ادوات جانبی متصل به باس APB
                        پورت سریال ، پورت های ورودی / خروجی ، مبدل ADC و DAC ، ارتباط سریال I2C و ... همگی جزء ادواتی هستند که به باس APB متصل شده اند . برای کنترل فرکانس متصل به هر یک از این ادوات از دو رجیستر PCLKSEL0 و PCLKSEL1 استفاده میکنیم . برای کنترل هر یک از بلوک ها ، تنها 2 بیت برای هر بلوک اختصاص داده شده است که مجموعاً میتوانیم کلاک حداکثر 32 بلوک را کنترل نمائید . برای دسترسی این رجیستر در کامپایلر Keil میتوانید از کد زیر استفاده کنید :

                        LPC_SC->PCLKSEL0 = 0xXXXXXXXX; Keil Code

                        LPC_SC->PCLKSEL1 = 0xXXXXXXXX; Keil Code

                        اما چگونه میتوان فرکانس بلوک های جانبی را محاسبه کرد ؟
                        جواب : برای تعیین فرکانس بلوک های جانبی ، دو رجیستر مذکور را در 4 حالت مقدار دهی می کنیم ؛ سپس از بین 4 حالت زیر میتوانیم بطور اختیاری یک حالت را انتخاب نمائیم . مقادیر تعریف شده زیر برای هر دو رجیستر یکسان میباشند .
                        مقدار 00 : 4 / کلاک cpu = کلاک بلوک مورد نظر
                        مقدار 01 : کلاک cpu = کلاک بلوک مورد نظر
                        مقدار 10 : 2 / کلاک cpu = کلاک بلوک موردنظر
                        مقدار 11 : 8 / کلاک cpu = کلاک بلوک موردنظر ( در صورتیکه از بلوک های CAN1 , CAN2 , CAN Filtering استفاده میکنید رابطه ی { 6 / کلاک cpu = کلاک بلوک موردنظر } معتبر است )


                        شما میتوانید برای مشاهده بلوک های موردنظر به دیتاشیت میکروکنترلر LPC176X مراجعه کنید ؛ برای راحتی کار، من بلوک های جانبی را مطابق با دیتاشیت تراشه در جدول زیر لیست کرده ام .



                        5 -1 بلوک PLL0
                        در مورد این بلوک به اندازه کافی بحث کرده ایم ، بنابراین در قسمت جمع بندی و تکنیک های کاربردی- مهندسی که در پایان این جلسه ارائه میشود ، برای همیشه به بحث در مورد PLL0 خاتمه میدهیم . شکل زیر بلوک دیاگرام PLL0 را نشان میدهد .



                        6 - 1 بلوک PLL1
                        توجه توجه : رجیسترهای مربوط به بلوک PLL1 در جلسه آموزشی مربوط به ره اندازی و کنترل واحد USB بطورت کامل بررسی میشود .
                        این بلوک تنها برای تنظیم کلاک بلوک USB با فرکانس 48MHZ مورد استفاده قرار میگرد . کلاک PLL1 از طریق نوسان ساز اصلی ( کریستال خارجی ) تأمین میشود و همانند PLL0 با وقوع ریست تراشه غیر فعال و خاموش میشود . زمانیکه PLL1 خاموش شود بلوک USB کلاک خود را از PLL0 دریافت کرده و زمانیکه PLL0 غیر فعال باشد ، در صورت فعال بودن PLL1 ، بلوک PLL1 بصورت اتوماتیک به بلوک USB متصل میشود . قابلیت های این بلوک مطابق زیر است :
                        1 - فرکانس ورودی : 10MHZ تا 25MHZ و میتواند حداکثر در عددی بین 1 تا 32 ضرب شود .
                        2 - فرکانس خروجی پس از محاسبات : رنج 158MHZ تا 320MHZ
                        3 - کلاک خروجی : فرکانس خروجی تقسیم بر اعداد ( 16 ، 8 ، 4 ، 2 )


                        دیدگاه


                          #13
                          پاسخ : آموزش کامل و جامع طراحی سیستم با میکروکنترلر ARM LPC176X Cortex-M3

                          جلسه 2 ( بخش 4 ) : 1 - فعال سازی قفل حافظه Flash
                          زمانیکه شما میخواهید پروژه خود را تجاری سازی نمائید یا به مرحله ی تولید انبوه ببرید باید اقدامات امنیتی لازم را در مورد حافظت از امکانات نرم افزاری سیستم انجام دهید . در میکروکنترلرهای سری LPC176X شما به 4 سطح امنیتی دسترسی دارید تا بتوانید از سرقت برنامه توسط افراد ( ... ) جلوگیری کنید . در واقع شما با دسترسی به این 4 سطح میتوانید حافظه Flash را از هر جهت کنترل کنید . حال توضیحات مربوط به 4 سطح مورد نظر را خواهم داد .

                          سطح 0 : بصورت پیش فرض انتخاب شده است و به شما امکان بی نهایت پروگرام کردن و پاک کردن حافظه را میدهد ، کلید این سطح برابر 0xFFFFFFFF در نظر گرفته شده است .

                          سطح 1 : زمانیکه میخواهید برنامه سیستم را بروز رسانی کنید میتوانید از این سطح استفاده کنید . دراین سطح پروتکل JTAG غیر فعال میشود و تنها شما از طریق واسط ISP میتوانید میکرو رو پروگرام و پاک نمایید . کلید این سطح برابر 0x12345678 در نظر گرفته شده است .

                          سطح 2 : در این سطح دستورات ISP مربوط به نوشتن در حافظه RAM و خواندن Flash غیرفعال میشود و تنها میتوانید ضربتی کل حافظه را پاک و پروگرام کنید . کلید این سطح برابر 0x87654321 درنظر گرفته شده است .

                          سطح 3 : این سطح آخرین سطح امنیتی میباشد و برنامه ای که روی میکروکنترلر پروگرام میشود آخرین برنامه است . بنابراین امکانات JTAG و ISP بطور کامل غیرفعال میشوند . کلید این سطح برابر 0X43218765 در نظر گرفته شده است .توجه داشته باشید اگر اشتباهی در این قسمت رخ دهد باید فاتح میکرو رو بخونید :cry2:

                          حالا ممکنه واستون سوال پیش بیاد که نحوه فعال کردن این سطه ها به چه صورتی هستش ؟

                          [color=red][b]جواب : در زمان ایجاد پروژه در کامپایلر Keil ، کامپایلر در پوشه پروژه موردنظر یک فایل به نام startup_LPC17xx.s ایجاد میکند . شما میتوانید این فایل را توسط خود Keil باز کنید ؛ در این صورت خط 116 برنامه را مدنظر قرار داده و تغییرات مورد نظر را اعمال کنید :
                          CRP_key DCD ( Adresses ) // flash contro
                          l

                          به عنوان مثال برای سطح 3 داریم : CRP_key DCD 0x87654321 و به همین ترتیب برای انتخاب سایر سطح ها می توانید به جای Adresses مقدار اختصاص داده شده به هر سطح را قرارا دهید .

                          دیدگاه


                            #14
                            پاسخ : آموزش کامل و جامع طراحی سیستم با میکروکنترلر ARM LPC176X Cortex-M3

                            جلسه 2 ( بخش 5 ) : 5 - تنظیم فرکانس میکروکنترلر روی 100MHZ , 120MHZ , 150MHZ

                            دوستان عزیزم میدونم که خیلی خسته شدید ، حتی برا خودمم سخت و کسل کنندست که بخوام این مطالب رو دوباره بیان کنم و از اون طرف حتی بخوام متن رو هم تایپ کنم ، ولی تحمل کنید ، جلسه1 و 2 و 3 رو که سپری کنید ، شیرینی کار با میکرو ARM رو میتونید از جلسه 4 به بعد حس کنید .......

                            حالا میخوایم بریم سر حساس ترین بخش کار با میکرو ؛ یعتی تنظیم فرکانس میکرو ، که اگه خوب تنظیم نشه و اشتباهی رخ بده، دیگه از میکروکنترلر یه کارایی سر میزنه که در شأنش نیست ؛ ما هم ...

                            قبل از اینکه وراد بحث اصلی شویم ابتدا فرمول زیر را معرفی خواهم کرد ؛ این فرمول چیزه خاصی ندارد و فقط باید به این نکته توجه کنید که مقادیر M و N هر کدام یک واحد به آن ها اضافه میشود و سپس در فرمول قرار میگرد ، به عنوان مثال اگر مقدار M = 99 باشد باید در فرمول مربوطه ، مقدار 100 جایگزین شود ،( مقادیر M و N توسط خودتان مقدار دهی میشود { اونقدر باید با اعداد ور برید تا به اونچه که میخواین برسین :angry: } ) بنابراین در انجام محاسبات دقت کافی را به عمل آورید .



                            [color=red]نکته 1 : در ابتدای کار توجه داشته باشید که حتماً باید PLL0 را تنظیم کنید در غیر اینصورت کلاک CPU توسط رجیستر CLKSRCSEL تعیین میشود .

                            نکته 2 : مقدار فرکانس 100MHZ برای کلاک کاری میکروکنترلر LPC1768 معتبر است و شما حداکثر میتوانید تا 150MHZ بصورت Over Clock فرکانس میکرو رو تنظیم کنید ( در قسمت کار با سیستم عامل Emwin و کار با توابع DSP فرکانس میکرو را تا 150MHZ افزایش میدهیم البته میکرو در این قسمت { یه خورده وحشی بازی ممکنه در بیاره } { در این قسمت فرکانس را تا مرز 180MHZ نیز افزایش دادم که در کمتر از 2 دقیقه میکروکنترلر بطور کامل هنگ کرد!!!!!!!!!!!! } ) ؛ در صورتیکه از میکروکنترلر LPC1769 استفاده میکنید مقدار فرکانس تعیین شده آن 120MHZ است بنابراین میتوانید فرکانس را بصورت Over Clock تا مرز 160MHZ افزایش دهید .

                            نکته 3 : در صورت استفاده از بلوک USB حداقل کلاک CPU را برابر 18MHZ قرار دهید .

                            نکته 4 : در میکروکنترلرهای ARM این قابلیت تعبیه شده است که بتوانیم کلاک سیستم را در زمان دلخواه و در طول اجرای برنامه تنظیم کنیم ؛ به بیانی دیگر میتوانیم در یک زمان دلخواه میکرو رو در فرکانس های کاری متنوع تنظیم نمائیم .

                            نکته 5 : M و N مقادیری هستند که توسط کاربر تعریف شده و سپس در مبنای Hex در رجیستر PLL0CFG قرار میگرند اگر :
                            1 - مقدار M و N عددی در محدوده 0 تا 15 باشد ، در این صورت با استفاده از تعریف محدوده دستگاه Hex ، آنها را در مبنای Hex تعریف میکنیم ، به عنوان مثال اگر M = 12 باشد مقدار Hex آن برابر C میشود و به طور مشابه اگر مقدار N = 5 شود مقدار Hex آن 5 تعریف میشود .
                            2 - اگر مقدار M و N یا یکی از این دو ، از محدوده دستگاه Hex خارج بودند ، به عنوان مثال اگر M = 99 باشد ابتدا آن را به باینری تبدیل میکنیم و سپس در مبنای Hex آن را تعریف خواهیم کرد .

                            مثال 1 : فرکانس میکروکنترلر را Over Clock کرده و بر روی 150MHZ تنظیم کنید . ( مقدار فرکانس کریستال خارجی برابر 12MHZ است . )
                            در این مثال ابتدا مراحل کار را شرح میدهم و در مثال 2 با استفاده از الگو گیری مثال 1 برنامه ای کامل را ارائه کرده که میدانم که بیش از 80% از دوستان به آن نیازمندند ......

                            مرحله ی 1 : ابتدا رجیستر PLL0CON , SCS را مقدار دهی کرده و سپس از رجیستر PLL0FEED استفاده می کنیم . ( برای درک استفاده از رجیسترهای مذکور میتوانید به بخش 3 مراجعه کنید - بدیهی است مقادیری که در این مرحله در رجیستر قرار میگرند برای تنظیم هر محدوده فرکانس ( خارجی ) معتبر هستند . )
                            LPC_SC->SCS = 0x20; //part1
                            LPC_SC->PLL0CON = 0x0; // part1
                            LPC_SC->PLL0FEED = 0xAA; //Part1
                            LPC_SC->PLL0FEED = 0x55; //Part1

                            مرحله ی 2 : در این مرحله باید صبر کنید تا نوسان ساز پایدار شود :
                            while (!(LPC_SC->SCS & 0x40)); // part2

                            مرحله ی 3 : منبع کلاک متصل به PLL0 را با استفاده از رجیستر CLKSRCSEL مشخص کنید ، چون از نوسان ساز اصلی استفاده می کنیم پس مقدار 1 را در آن می نویسیم .
                            LPC_SC->CLKSRCSEL = 0x1; // part3

                            مرحله ی 4 : در این مرحله مقدار M و N را بدست آوره و در رابطه مذکور قرار میدهیم ، بنابراین ابتدا PLL0CLK را بدست آورده و سپس مقدار CPUCLK را محاسبه میکنیم .
                            LPC_SC->PLL0CFG = 0x00030063; // part4
                            LPC_SC-> PLL0FEED = 0xAA; // part4
                            LPC_SC->PLL0FEED = 0x55; // part4


                            مرحله ی 5 : برای فعال سازی PLL0 مقدار یک را در رجیستر PLL0CON بنویسید .
                            LPC_SC->PLL0CON = 0x1; // part5
                            LPC_SC->PLL0FEED = 0xAA; // part5
                            LPC_SC->PLL0FEED = 0x55; // part5

                            مرحله ی 6 : ضریب تقسیم کننده مربوط به CPUCLK را مقدار دهی کنید .
                            LPC_SC->CCLKCFG = 0x3; // part6


                            مرحله ی 7 : صبر کنید PLL0 روی فرکانس مورد نظر قفل شود .
                            while ((LPC-> PLL0STAT & 0x04000000) == 0 ); // part7

                            مرحله ی 8 : در مرحله ی آخر رجیستر PLL0CON را با مقدار 2 ، or خواهیم کرد .
                            LPC_SC->PLL0CON |= 2; // part8
                            LPC_SC->PLL0FEED = 0xAA; // part8
                            LPC_SC->PLL0FEED = 0x55; // part8

                            برای تنظیم بلوک PLL0 شما باید الزاماً 8 مرحله را طی کرده و نکات مربوط به مقدار دهی رجیسترها را رعایت کنید . مقادیر رجیستری در مرحله 4 و 6 برای فرکانس های مختلف متفاوت است و سایر مراحل معتبر خواهد بود .

                            مثال 2 : فرکانس میکروکنترلر را روی 100MHZ و فرکانس بلوک های (USB = 48MHZ ، SSP1 = 50MHZ ، UART1 = 25MHZ ، I2S = 100MHZ ، ADC = 25MHZ ، CAN1 = 16.67MHZ ) را تنظیم کنید . ( فرکانس کریستال خارجی 12MHZ میباشد . )
                            * ابتدا مقدار M و N و CCLKSEL را بدست می آوریم . ( در این مثال M=99 , N=5 , CCLKSEL=3 میباشد که اگر به هر کدام یک واحد اضافه کنیم و در فرمول قرار دهیم مقدار PLL0CLK = 400MH و CPUCLK=100MHZ بدست می آید . )
                            * حال برنامه را خواهیم نوشت ( نکته : شما میتوانید برای تنظیم فرکانس کلاک تراشه یک تابع بنویسید و با فراخوانی آن در برنامه از آن استفاده کنید ، در جلسات آینده یک کتابخانه برای کنترل کلاک تراشه ارائه خواهم داد . )



                            [glow=red,2,300]رسیدیم به پایان جلسه دوم ، امیدوارم بتونید از مطالب حداکثر استفاده رو ببرید ......... در برنامه بالا مقدار SCS = 0x20 قرار دهید ..................................[/glow]

                            [glow=red,2,300] **** پایان جلسه دوم **** [/glow]

                            دیدگاه


                              #15
                              پاسخ : آموزش کامل و جامع طراحی سیستم با میکروکنترلر ARM LPC176X Cortex-M3

                              نوشته اصلی توسط امیرحسین چلاوی
                              [glow=red,2,300]با عرض سلام و خسته نباشید خدمت همه ی دوستان عزیزم ! قبل از شروع کار تو همین تاپیک ازتون خواهش میکنم که نظراتتونو در تاپیک زیر ارسال کنید تا مطالب بصورت پیوسته با نظم خاصی ارائه بشه که مطمئناً نظر خیلی از دوستان هم همینه ... نظر یادتون نره، نظر دادن شما میتونه تو کیفیت مطالب ارائه شده موثر باشه..... یا علی !!!! http://www.eca.ir/forum2/index.php?topic=105090.0[/glow]
                              از موضوع تاپیک پیداست که قراره با هم آموزش کامل برنامه نویسی میکروکنترلر ARM LPC176X Cortex-M3 رو که ساخت شرکت NXP هستش و امروزه در بسیاری از پروژه های صنعتی به کار گرفته میشه رو بصورت تخصصی و حرفه ای دنبال کنیم. یکی از دلایلی که باعث شد تا این تاپیک رو ایجاد کنم در واقع پراکنده بودن مطالب آموزشی و نبود مطالب مهم و پیشرفته در رابطه با این سری از میکروکنترلرها بود و از طرفی در بسیاری از انجمن ها به فراخورد میدم که بعضی ها با مشکلات اساسی در کار کردن با این تراشه قدرتمند روبرو میشدند و به ندرت میتوانستند بدون منابع آموزشی اونو رفع کنند ، اما من در این اینجا قصد دارم از 0 تا 100 مباحث مربوط به این تراشه رو براتون بصورت آموزشی در طی جلسات متعدد قرار بدم و شما رو از هرگونه منابع آموزشی بی نیاز کنم ، مطالبی رو که من براتون قرار میدم همشونو بصورت عملی تجربه کردم و همه مباحث رو بصورت تکنیکی و کاربردی - مهندسی براتون میزارم . اما بریم سراغ تهیه تجهیزات سخت افزاری و نرم افزاری :

                              1 - سخت افزار
                              شاید برای شروع کار براتون مشکل باشه که خودتون بخواین PCB برد رو پیاده سازی کنید، اما نگران نباشید ، واسه این سری از میکروکنترلرها اونقدر برد داخلی و خارجی وجود داره که شما رو از این جهت بی نیاز کنه ، اما اینکه کدوم برد رو واسه کارتون ( آموزشی - صنعتی ) انتخاب کنید خیلی مهمه !!!
                              اگه واقعاً می خواین بصورت حرفه ای با این میکرو کار کنید و بر روی تمام امکاناتش تسلط کامل داشته باشین پیشنهاد من به شما برد شرکت ECA هستش که میدونم خیلی هاتون اون خریداری کردین اما دلیل من در انتخاب این برد اینه که این برد در واقع تنها برد آموزشی و حرفه ای هستش که از واحد پردازش صدای دیجیتال I2S پشتیبانی میکنه و هم ماژول های متنوعی رو ساپورت میکنه و مورد مهم دیگه اینه که هسته مرکزی که خود LPC1768 هستش بصورت هدربرد روی برد قراره داره که میتونید در کاربردهای دیگه ازش استفاده کنید و ...
                              اگه هم توان خرید برد رو ندارید میتونید هدربرد رو خریداری کنید و در طی جلسات متعدد قطعات مورد نیاز رو تهیه و روی بردبرد پیاده سازی کنید >>>

                              2 - پروگرامر
                              برنامه ریزی تراشه های ARM یکی از مهم ترین قسمت های کاره ، کلاً شما دو راه بیشتر پیش روتون نیست ، راه اولش اینه که از Bootloder برای پروگرام کردن استفاده کنید که بیشتر برای افراد مبتدی مناسبه و راه دوم استفاده از پروگرامر قدرتمند JLINK که مطمئناً بهتر از این پروگرامر نمیتونید گیر بیارید ، اگه میخواین حرفه ای کار کنید و کارتون طوری هستش که باید دائماً برنامه رو میکرو پروگرام کنید بهتره از JLINK استفاده کنید که میتونید از ECA اونو خریداری کنید البته میتونید از دیباگر و پروگرامر Wiggler هم استفاده کنید که امکان پروگرام کردن میکرو رو از طریق پورت LPT براتون ممکن میکنه که آلان کمتر کسی از این پروگرامر استفاده میکنه ولی به هر حال نظر خودتونه >>>

                              3 - نرم افزار
                              بعد از تهیه سخت افزار و پروگرامر باید نرم افزار یا به اصطلاح کامپایلر رو تهیه کنیم ، کامپایلر در واقع نرم افزاری هستش که امکان کدنویسی رو برای میکرو توسط کاربر فراهم میکنه ، بهترین کامپایلر در این زمینه کامپایلر Keil هستش که اکثر مهندسین ، طراحان و دانشجویان چه در امور آموزشی و چه صنعتی از اون استفاده میکنند ، هر چند نسخه اورجینالشو به دلیل تحریم شدن ایران نمیتونیم تهیه کنیم ولی در کل مثل Codevisionavr کارمونو راه میندازه و از طرفی با همکاری بچه های بالا :biggrin: میتونیم بعضی از کتابخونه های مهم و کاربردی رو هم تهیه کنیم . آخرین نسخه این نرم افزار در روزی که این مطلب نوشته شد Keil 5.13 بود ، در این نسخه کمپانی Keil تغییرات اساسی رو لحاظ کرده و حجم نرم افزار کم شده و ما میتونیم کتابخانه های مورد نیاز رو از سایت Keil بصورت Pack دریافت کنیم اما چون این نسخه کامل نشده و از طرفی یه خورده هم میره رو اعصاب آدم ( چون کامل نیست یه خورده قاطی داره ، الکی به تابع ها گیر میده و ... ) من بهتون پیشنهاد میکنم که تا زمان کامل شدن این نسخه از نسخه Keil 4.74 استفاده کنید . در این تاپیک ما آموزش رو با نسخه 4.74 دنبال می کنیم و به امید خدا بعد از اتمام مرحله ی آخر آموزش کار با آخرین نسخه Keil رو براتون میزارم . حالا مباحثی که قراره بصورت جلسه ای بهتون آموزش بدم رو زیر عنوان کردم :

                              جلسه 1 : مقدمه ای بر میکروکنترلرهای ARM ، واحد حافظه ، مختصری از تاریخچه ARM ، معماری پردازنده های ARM ، هسته های Cortex-M3 ، معرفی قابلیت های تراشه ARM LPC176X CM3 ، نحوه ایجاد پروژه و شبیه سازی در Keil ، برنامه ریزی تراشه در محیط Keil با پروگرامر JLINK ، اصول طراحی برنامه نویسی C ( انتشار یافت )

                              جلسه 2 : باس های AHB و APB ادوات جانبی متصل شده به آنها ، کنترل منابع Reset ، کنترل منابع کلاک ، فعال سازی قفل حافظه Flash ،تنظیم فرکانس میکروکنترلر ( 100MHZ , 120MHZ , 150MHZ ) ( انتشار یافت )

                              جلسه 3 : پورت های ورودی / خروجی ( GPIO ) - وقفه های GPIO ( معرفی NVIC اختصاصی جلسه 3 ) ( در حال تألیف )

                              جلسه 4 : نامشخص

                              جلسه 5 : نامشخص

                              جلسه 6 : بررسی رجیسترهای PINSEL و PINMODE

                              جلسه 7 : وقفه های خارجی ( External Interrupts ) - کنترل توان ( PWR )

                              جلسه 8 : راه اندازی و کنترل نمایشگرهای LCD کاراکتری

                              جلسه 9 : راه اندازی و کنترل نمایشگرهای گرافیکی مُدل GLCDKS0108

                              جلسه 10 : راه اندازی و کنترل نمایشگرهای سون سگمنت و دات ماتریس

                              جلسه 11 : اسکن صفحه کلید ماتریسی 4 * 3 - 4 * 4

                              جلسه 12 : راه اندازی و کنترل نمایشگر های TFTLCD از سایز 2.8 تا 9 اینچی

                              جلسه 13 : راه اندازی و کنترل تاچ اسکرین نمایشگرهای TFTLCD با تراشه درایور مخصوص تاچ

                              جلسه 14 : مبدل آنالوگ به دیجیتال ( ADC )

                              جلسه 15 : مبدل دیجیتال به آنالوگ ( DAC )

                              جلسه 16 تا 18 : تایمر و شمارنده ها ( Timer / Counter )

                              جلسه 19 : تایمر سگ نگهبان ( WDT )

                              جلسه 20 : تایمر وقفه تکرار شونده ( RIT )

                              جلسه 21 : تایمر System Tick

                              جلسه 22 : مدولاسیون پهنای پالس ( PWM )

                              جلسه 23 : واحد کنترل موتور سه فاز ( MCPWM )

                              جلسه 24 : واحد زمان سنج دقیق ( RTC )

                              جسله 25 تا 27 : ارتباط سریال UART

                              جلسه 28 : ارتباط سریال کامپیوتری ( RS232 )

                              جلسه 29 : شبکه سریال RS485

                              جلسه 30 : تبادل دیتا از طریق Blurtooth با ماژول HC-05 و مدل های مشابه

                              جلسه 31 تا 33 : ارتباط سریال دو سیمه ( TWI - I2C )

                              جلسه 34 : خواندن و نوشتن دیتا بر روی حافظه سریال EEPROM مدل AT24CXXXX

                              جلسه 35 ت 36 : ارتباط جانبی سریال ( SPI )

                              جلسه 37 تا 40 : ارتباط سریال آسنکرون ( SSP )

                              جلسه 41 تا 42 : خواندن و نوشتن دیتا ، خواندن فایل و حذف آن ، ایجاد پوشه و حذف آن و ... بر روی حافظه MMC/SD

                              جلسه 43 : عکسبرداری و فیلمبرداری با دوربین رنگی OV7670 و ذخیره بر روی مموری کارت MMC/SD

                              جلسه 44 : ضبط و پخش فایل های صوتی با فرمت MP3

                              جلسه 45 تا 47 : واحد پردازشگر سیگنال های دیجیتالی صوت ( I2S )

                              جلسه 48 : واحد GPDMA

                              جلسه 49 تا 60 : پیاده سازی کامل شبکه Ethernet با ارائه مثال های جامع

                              جلسه 61 : پروتکل ارتباط صنعتی CAN

                              جلسه 62 تا 70 : پیاده سازی کامل ارتباط USB Device - Host - OTG و مدهای مربوطه

                              جلسه 71 : اتصال کیبورد کامپیوتر ، دوربین دیجیتالی به میکرو از طریق پورت USB Host

                              جلسه 72 تا 80 : برنامه نویسی تحت سیستم عامل RTX

                              جلسه 81 تا 90 : پیاده سازی کامل سیستم عامل گرافیکی Emwin بر روی تراشه ARM LPC1768 - 69 Cortex-M3 و بررسی توابع کاربردی

                              جلسه 91 تا 95 : برنامه نویسی تحت سیستم عامل بصورت ترکیبی با RTX و Emwin

                              جلسه 96 تا 98 : کار با برخی از توابع DSP

                              جلسه 99 : ارتباط میکرو با ماژول SIM908 و پیاده سازی کامل شبکه GSM / GPRS / GPS با نمایشگر رنگی TFTLCD 5Inch

                              جلسه 100 : واکی تاکی با ماژول مخابراتی NRF24L01


                              ********* آموزش کار با آخرین نسخه نرم افزار Keil

                              { دوستان فقط برام دعا کنید تا مشکلم حل بشه :sad: }








                              من میخوام یه صفحه کلید روی lcd N96 با lpc1768 نمایش بدم و بعد از صفحه کلید داده عددی بگیرم
                              نمیشه حالا جلسات رو جابجا کنید یا خواهش کنم کمکم کنید یا یه مثال آماده بهم بدید ؟
                              ممنون از راهنمایی هاتون




                              دیدگاه

                              لطفا صبر کنید...
                              X