چکیده
میکروکنترلر ARM چیست؟ این قطعات پردازندهای هستند، از نوع ۳۲ بیتی و دارای معماری RISC هستند و سرعت نسبتا بالایی هم دارند (کلاک از ۳۰۰ تا ۲۰۰۰ مگاهرتز) و مجهز به برخی امکانات داخلی (adc و dac و تایمر وکانتر و pwm و rtc و i2c و spi و dmaو ...)وحافظه کش هستند. قابلیتها و باسهای استانداردی که برای این پروسسورها در نظر گرفته شده به همراه سرعت بالا، حافظه کش مناسب، مقایسه گرهای داخلی، تایمرهای ۱۶ بیتی برای پیادهسازی RTC و ... ، باعث شده که عملکرد این تراشهها نسبت به انواع دیگر پروسسورهای هم تراز، دارای کیفیت و قدرت بالاتری باشه.
بخش اول مقدمهای بر میکروکنترلر ARM
مقدمهای بر میکروکنترلر ARM ARM نوعی از معماری پردازندههای کامپیوتری است که بر طبق طراحی RISC CPU (معماری ریسک در ادامه توضیح مختصری خواهیم آورد) و توسط کمپانی بریتانیایی ARM Holding طراحی شده است. معماری ARM که دستورالعملهای ۳۲ بیتی را پردازش میکند از دهه ۱۹۸۰ تا به امروز در حال توسعه است.
- معماری ریسک: یک نوع معماری ساخت ریزپردازنده میباشد. در این معماری بجای استفاده از دستورالعملهای خاص منظوره، که در سایر معماریها مرسوم است، از یک مجموعه دستورالعمل فوقالعاده بهینهسازی شده استفاده میشود. اولین پروژه مبتنی بر معماری ریسک در اواخر دهه ۷۰ و اوایل دهه ۸۰ میلادی توسط شرکت آیبیام، دانشگاه استانفورد و دانشگاه برکلی آغاز شد. درآن دوره پروژه میپس (MIPS) از دانشگاه استانفورد و پروژه ریسک (RISC) نسخههای ۱ و ۲ از دانشگاه برکلی همگی بر پایهٔ یک فلسفه بنا شده بودند که بعداً به عنوان معماری ریسک شناخته شد. اکثر طراحیهای مبتنی بر معماری ریسک دارای خواص زیر بودند: زمان اجرای یک چرخهای / استفاده از روش خط لولهای / تعداد زیاد ثباتها.
ARM مخفف Advanced RISC Machine است و از آنجایی که این معماری براساس طراحی RISC بنا شده، هسته اصلی CPU نیاز به ۳۵ هزار ترانزیستور دارد این در حالی است که پردازندههای معمولی رایج x۸۶ که براساس CISC طراحی شدهاند حداقل نیاز به میلیونها ترانزیستور دارند. مهمترین دلیل مصرف بسیار پایین انرژی در پردازندههای مبتنی بر ARM که باعث استفاده گسترده آنها در ابزارهای پرتابل مانند تلفن هوشمند یا تبلت شده نیز همین موضوع است.
جالب است بدانید که شرکت ARM Holding خود تولیدکننده پردازنده نیست و در عوض گواهی استفاده از معماری ARM را به دیگر تولیدکنندگان نیمه هادی میفروشد. کمپانیها نیز به راحتی تراشههای خود را براساس معماری ARM تولید میکنند. از جمله کمپانیهایی که پردازنده خود را براساس معماری ARM طراحی میکنند میتوان به اپل در تراشههای Ax، سامسونگ در پردازندههای Exynos، انویدیا در تگرا و کوالکام در پردازندههای Snpdragon اشاره کرد. در سال ۲۰۱۱ مشتریان ARM توانستند ۷٫۹ میلیارد ابزار مبتنی بر این معماری را وارد بازار کنند. شاید تصور میکنید که پردازندههای مبتنی بر ARM تنها در تبلت و تلفنهای هوشمند بکار گرفته میشوند، اما جالب است بدانید که در همین سال بیش از ۹۵ درصد تلفنهای هوشمند دنیا، ۹۰ درصد دیسکهای سخت (HDD)، حدود ۴۰ درصد تلویزیونهای دیجیتال و ستتاپباکسها، ۱۵ درصد میکروکنترلرها و ۲۰ درصد کامپیوترهای موبایل مجهز به پردازندههای مبتنی بر معماری ARM بودهاند. بدون شک این آمار در سال ۲۰۱۳ رشد فوقالعاده چشم گیری را تجربه کرده است، چون بازار تلفنهای هوشمند و تبلتهای در سال جاری پیشرفت قابل ملاحظهای داشتهاند. تا اینجای کار معماری ARM تنها برروی پلتفرم ۳۲ بیتی با عرض حافظه ۱ بایت کار میکرد. اما با معرفی ARMv۸ این معماری پشتیبانی از دستورات ۶۴ بیتی را نیز آغاز کرد که البته هنوز در سیستم-روی-یک-چیپها بکار گرفته نشده است. در سال ۲۰۱۲ مایکروسافت نیز نسخه ویندوز سازگار با معماری ARM را به همراه تبلت سرفیس RT معرفی کرد. AMD نیز اعلام نموده که قصد دارد در سال ۲۰۱۴ سرورهای مبتنی بر معماری ۶۴ بیتی ARM را روانه بازار کند. همانطور که پیشتر اشاره کردیم، ARM گواهی استفاده از معماری خود را به شرکتهای دیگر میدهد، کمپانیهایی که در حال حاضر گواهی استفاده از ARM را دارند عبارتند از: AMD, آلکاتل، اپل, AppliedMicro, Atmel, Broadcom, Cirrus Logic, CSR plc, Digital Equipment Corporation, Ember, Energy Micro, Freescale, فوجیتسو, Fuzhou Rockchip, هواوی، اینتل توسط شرکتهای زیر شاخه، ال جی, Marvell Technology Group, Microsemi, مایکروسافت, NEC, نینتندو, Nuvoton, انویدیا, NXP (formerly Philips Semiconductor), Oki, ON Semiconductor, پاناسونیک، کوالکام, Renesas, Research In Motion, سامسونگ، شارپ, Silicon Labs, سونی، اریکسون, STMicroelectronics, Symbios Logic, Texas Instruments, توشیبا، یاماها و ZiiLABS RISC و CISC یا ARM در مقابل x86 RISC که مخفف Reduced instruction Set Computing یا مجموعه دستورات ساده شده است در واقع نوعی از طراحی CPU است که پایه و اساس آن، سادهسازی دستورات است که منجر به بازده بالا و سرعت بخشیدن به اجرای دستورات میشود. (پردازدهای که براساس این طراحی ساخته میشود را RISC بخوانید ریسک مینامند.) مهمترین و معروفترین معماری که براساس RISC طراحی شده، ARM است. درست نقطه مقابل ریسک، طراحی دیگری با نام CISC وجود دارد که مخفف Complex Instruction Set Computing یا مجموعه دستورات پیچیده است که معماری x۸۶ اینتل براساس آن طراحی شده و پردازنده کامپیوترهای رومیزی و لپ تاپها و بسیاری از ابزارهای دیگر از آن بهره میبرند. ایده اصلی RISC اولین بار توسط جان کوکی از IBM و در سال ۱۹۷۴ شکل گرفت، نظریه او به این موضوع اشاره داشت که یک کامپیوتر تنها از ۲۰ درصد از دستورات نیاز دارد و ۸۰ درصد دیگر، دستورات غیرضروری هستند. پردازندههای ساخته شده براساس این طراحی از دستورات کمی پشتیبانی میکنند به این ترتیب به ترانزیستور کمتری نیز نیاز دارند و ساخت آنها نیز کم هزینه است. با کاهش تعداد ترانزیستورها و اجرای دستورات کمتر، پردازنده در زمان کمتری دستورات را پردازش میکند. کمی بعد اصطلاح RISC توسط یک استاد دانشگاه کالیفورنیا به نام دیوید پترسون ایجاد شد. هر دو طراحی RISC و CISC به مراتب در انواع و اقسام ابزارها بکار گرفته میشوند، اما مفهوم کلی RISC در واقع سیستمی است که در آن به پردازش دستورات کوچک و به شدت بهینه شده پرداخته میشود، درست برخلاف CISC که در آن دستورات پیچیده ارسال میشوند. یکی از تفاوتهای عمده بین RISC و CISC نیز در نحوه دسترسی به حافظه و ذخیره و اجرای اطلاعات برروی آن است. در ریسک دسترسی به حافظه تنها از طریق دستورالعملهای خاصلی قابل انجام است و به عنوان مثال نمیتوان از بخشی از دستور add به حافظه دسترسی داشت. علاوه بر ARM شرکتهای بسیار دیگری از جمله Intel i860, AMD 29k, ARC و غیره از طراحی RISC برای ساخت پردازنده استفاده میکنند، اما به لطف گسترش تلفن و تبلتها، معماری ARM به عنوان برجستهترین معماری مبتنی بر RISC شناخته میشود.
CISC در سیسک اوضاع دقیقا برعکس ریسک است و پردازنده قادر به پردازش دستورات پیچیده است به همین دلیل نیاز به تعداد بیشتر ترانزیستور و همچنین طراحی پیچیدهتر و پردازندههای گرانقیمتتر دارد. ایده اصلی پشت این طراحی این است که برنامه نویسان سادهتر بتوانند نرمافزارهای خود را تولید کنند و دستورات را سادهتر به CPU ارجاع دهند. به لطف پشتیبانی اینتل و تولیدکنندگان نرمافزار، CISC به شدت محبوب شد و تمام کامپیوترها از پردازنده مبتنی بر این طراحی بهره بردند. برخی تصور میکنند که ریسک قادر به اجرای دستورات زیاد نیست اما در حقیقت ریسک به اندازه سیسک میتواند دستورات مختلف را اجرا کند اما مهمترین تفاوت این دو در این است که در RISC تمام دستورات با یک فرمت، دقیقا یک فرمت صادر میشوند و پردازش تمام دستورات یک زمان مشخص طول میکشد، معمولا در ریسک در هر سیکل، پردازنده یک دستور را اجرا میکند. اما در CISC مجموعهای از دستورات بصورت فشرده و با آدرس دهی مختلف به یکباره پردازش میشوند، مثل اعداد اعشاری یا تقسیم که در طراحی RISC وجود ندارند. از آنجایی که دستورات در RISC سادهتر هستند پس سریعتر اجرا میشوند و نیاز به ترانزیستور کمتری دارند، ترانزیستور کمتر هم به معنی دمای کمتر، مصرف پایینتر و فضای کمتر است که آن را برای ابزارهای موبایل مناسب میکند. معماری پردازندههای مبتنی بر طراحی RISC طی سالهای گذشته پیشرفت چشمگیری داشته و اجرای دستورات پیچیده را نیز میسر کرده است و تولیدکنندگان نرمافزاری نیز به سمت ساخت نرمافزارهای مبتنی بر این معماری گرایش پیدا کردهاند. لازم است بدانید که کامپیوترهای اولیه مک نیز از پردازنده مبتنی بر RISC بهره میبردند. اما در واقع پردازندههای CISC بسیار سریعتر و پرقدرتتر از RISCها هستند و قادر به پردازش امور سنگین میباشند اما در عوض گرانقیمتتر، پرمصرفتر بوده و دمای بیشتری نیز تولید میکنند. در CISC تمرکز برروی سختافزار است و در RISC برروی نرمافزار، در CISC دستورات بصورت پیچیده به پردازنده ارسال میشوند ولی در RISC نرمافزار دستورات را ساده کرده و به عنوان مثال یک عملیات پیچیده را در قالب چندین دستور ساده به پردازنده ارسال میکند و پردازنده دستورات ساده را به سرعت پردازش نموده و نتیجه را باز میگرداند. پس کدهای نرمافزارهای سازگار با RISC طولانی تر ولی کدهای مربوط به نرمافزارهای CISC کوتاهتر و پیچیدهتر هستند. البته این بدین معنا نیست که مثلا اگر قرار است برای اندروید یا iOS برنامه بنویسید باید چند هزار خط بیشتر از معادل کامپیوتر ویندوزی آن کد نویسی کنید، در واقع کامپایلرها کدها را به دستورات کوچک زیاد تبدیل میکنند و برنامه نویس به سختی متوجه نوع پردازش دستورات میشود. اگر بخواهیم در مورد این دو طراحی صحبت کنیم بحث پیچیده و کسل کننده خواهد شد پس به همین جا بسنده میکنیم. سیستم-روی-یک-چیپها و معماری ARM چندین نوع مختلف از معماری برای پردازندههای ARM وجود دارد که از آن جمله میتوان به ARM V۲ ،ARMv3 Arm v۷ و ... اشاره کرد. کمپانیها برای استفاده از هر کدام از این طراحیها باید گواهی مربوط به آن را از ARM Holder دریافت کنند. کمپانیها از این معماری در ساخت پردازندههای مورد نظر خود بهره برده و در نهایت یا یکپارچه سازی آن با واحد پردازش گرفیک (GPU)، حافظه رم و قسمت کنترلر باند رادیویی (در تلفنهای هوشمند) سیستم -روی-یک-چیپ خود را میسازند.
سیستم-روی-یک-چیپ (System on a Chip) که آن را به اختصار SoC مینامند در واقع یک تراشه است که در آن پردازنده اصلی (CPU)، پردازنده گرافیک (GPU)، حافظه رم، کنترلرهای ورودی و خروجی و بعضا کنترلر باند رادیویی قرار دارند. پس لازم است بدانید که کل SoC براساس معماری ARM تولید نمیشود و تنها بخش CPU آن بر مبنای معماری ARM طراحی و تولید میگردد. پس این باور که فلان SoC براساس معماری ARM ساخته شده، اشتباه است و بخش پردازنده اصلی اکثر SoCها براساس یکی از طراحهای معماری ARM ساخته میشوند. از جمله سیستم-روی-یک-چیپهایی که هسته اصلی آنها براساس معماری ARM طراحی شدهاند میتوان به ۳ نسل اول تگرا انویدیا، Quatro شرکت CSRT، نوا شرکت اریکسون، OMAP شرکت تکزاس، Exynos شرکت سامسونگ و Ax شرکت اپل اشاره کرد. این شرکتها از معماری ARM و همچنین معماری یکی از هستههای طراحی شده توسط این شرکت بهره بردهاند. اما شرکتها میتوانند گواهی استفاده از معماری ARM را تهیه کرده و سپس بر اساس آن هسته سفارشی مورد نظرشان را طراحی کنند یعنی به جای اینکه هسته CPU را براساس Cortex-A۹ یا Cortex-A۱۵ یا دیگر هستههای ARM بسازنند، خودشان براساس معماری یکی از خانوادههای ARM، هسته خاص خود را طراحی کنند. به عنوان مثال سیستم-روی-یک-چیپ A۶ اپل، X-Gene ،Krait کوالکام، StrongARM شرکت DEC ،XScale شرکت Marvell اینتل یا Project Denver شرکت انویدیا اینگونه هستند و اگر چه بخش CPU از سیستم-روی-یک-چیپ آنها براساس معماری ARM طراحی شدهاند، اما طراحی هستهها با آنچه ARM پیشنهاد کرده متفاوت هستند. چند پرسش و پاسخ در باره میکروکنترلر ARM
چرا قبلا از این پردازنده استفاده نمیشده، ایا به تازگی وارد بازار شدند؟ این پردازنده قبلا توسط شرکت arm تولید میشده که این شرکت هم به قیمت بالا این پردازنده رو به مشتریان خاص میفروخته، اما از اوایل سال ۲۰۰۲ به بعد این شرکت مجوز ساخت این پردازنده رو به شرکتیهای همچون ATMEL و Luminary Micro و شرکت philips و چند تا شرکت دیگه میده. شرکتهای فوق با اضافه کردن امکاناتی مثل انواع مبدلها (دیجتال به انالوگ و ....)، انواع رابطها (بلوتوث، usb و...)این پردازنده رو به یک پردازنده عمومی تبدیل میکنند و اون رو به بازار جهانی عرضه میکنن. برای برنامه نویسی این پردازندهها از چه زبان و کامپایلری استفاده میشه؟ برای برنامه نویسی این پردازنده از زبانهای c و بیسیک و اسمبلی استفاده میشه. کلیه کامپایلرهای زبان اسمبلی برای این پردازنده رایگان هستند
برای زبانهای c مثل خود c و c++ کامپایلرهای متعددی ارائه شده که کی از این کامپایلرها کامپایلر keil uvision هست که در اون میشه به زبانهای اسمبلی و c و c++ برنامه نوشت. نسخه رایگان این کامپایلر را در اینترنت میتوانید دانلود کنید
برای زبان بیسیک نیز کامپایلر بسکام arm وجود داره که هنوز در دسترس عموم قرار نگرفته تا کرک بشه. آیا این پردازنده cpu هستند یا مانند میکرو کنترلرها میباشند، یعنی در در داخل خود ram و i/o و.. دارند یا نه ما خودمان باید این امکانات را بهش اضافه کنیم؟ این پردازنده در نمونههای گوناگونی ارایه شده است مثلا مدل LPC۲۱۳۸ دارای ۵۱۲ کیلو حافظه فلش، ۳۲ کیلو حافظه رم، مبدل آنالوگ به دیجیتال، مبدل دیجیتال به آنالوگ و ... میباشد یا مدل at76c۵۵۱ ساخت شرکت اتمل دارای امکانتی همچون بلوتوث، ارتباط usb و... هست یا مدل arm7tdmi فقط یک پردازنده است که روی خود فقط خطوط i/o دارد و باید برای ان مانند یک میکرو پروسوسر واحدهای rom و ram و کانتر و... تعبیه کرد این پردازنده در مدلهای وسیع ساخته میشوند (بسیار گسترده تر از avr و pic و..) و دست شما برای انتخاب باز است برای اطلاعات بیشتر در مورد هر پردازنده به شرکت سازنده مراجعه کنید.
بخش دوم سیستمها، کامپایلرها و مفسرهای ARM
چه سیستمعاملهایی از ARM پشتیبانی میکنند؟ سیستمهای Acorn: اولین کامپیوتر مبتنی بر معماری ARM، کامپیوتر شخصی Acorn بود که از سیستمعاملی به نامArthur بهره میبرد. سیستمعاملی مبتنی بر RISC OS که از معماری ARM پشتیانی میکرد و Acorn و برخی دیگر از تولیدکنندگان از آن استفاده میکردند. سیستمعاملهای توکار: معماری ARM از طیف وسیعی از سیستمعاملهای توکار مانند Windows CE, Windows RT, Symbian, ChibiOS/RT, FreeRTOS, eCos, Integrity, Nucleus PLUS, MicroC/OS-II, QNX, RTEMS, CoOS, BRTOS, RTXC Quadros, ThreadX, Unison Operating System, uTasker, VxWorks, MQX و OSE پشتیبانی میکند. یونیکس: یونیکس و برخی از سیستمعاملهای مبتنی بر یونیکس مانند: Inferno, Plan 9, QNX و Solaris از ARM پشتیبانی میکنند. لینوکس: بسیاری از توزیعهای لینوکس از ARM پشتیبانی میکنند از آن جمله میتوان به اندروید و کروم گوگل، Arch Linux، بادا سامسونگ، Debian، Fedora،OpenSuse، Ubuntu و WebOS اشاره کرد. BSD: برخی از مشتقات BSD مانند OpenBSD و iOS و OS X اپل نیز از ARM پشتیبانی میکند. ویندوز: معماریهای ARMv 5, ۶ و ۷ از ویندوز CE که در ابزارهای صنعتی و PDAها استفاده میشود، پشتیبانی میکند. ویندوز RT و ویندوز فون نیز از معماری ARMv۷ پشتیبانی میکنند.
کامپایلرها و مفسرهای ARM برای ARM کامپایلرها و مفسرهای زیادی ارائه شده است، زبان بر نامه نویسی اغلب این کامپایلرها C و C++ میباشد، در زیر نام این کامپایلرها را اوردهایم:
- IAR for ARM
قابلیت برنامه نویسی میکرو کنترلرهای ARM به زبانهای C و C++ و اسمبلی / امکان شبیهسازی برنامه نوشته شده / پشتبانی از تمامی میکرو کنترلرهای ARM / دارای منابع اموزشی متوسط. /محیط حرفهای و استفاده از ویرایشگر قوی
- CrossWorks for ARM
قابلیت برنامه نویسی میکرو کنترلرهای ARM به زبان اسمبلی و C / پشتیبانی از میکرو کنترلرهای که از ARM۷ استفاده میکنند / محیط و ادیتور ساده / عدم شبیهسازی برنامه نوشته شده / دارای منابع اموزشی کم.
- keil arm
قابلیت برنامه نویسی میکرو کنترلرهای ARM به زبانهای C و C++ و اسمبلی / امکان شبیهسازی برنامه نوشته شده / پشتبانی از تمامی میکرو کنترلر های ARM / دارای منابع اموزشی متوسط. /محیط حرفهای و استفاده از ویرایشگر قوی /یادگیری سریع نرمافزار /
- WinArm
قابلیت برنامه نویسی میکرو کنترلرهای ARM به زبانهای C و C++ / عدم شبیهسازی برنامه نوشته شده / پشتیبانی از میکرو کنترلرهای که از ARM۷ استفاده میکنند / دارای منابع اموزشی متوسط. /محیط حرفهای و استفاده از ویرایشگر قوی /متن باز بودن نرمافزار و سایر امکانات جانبی
- Flowcode ARM
قابلیت برنامه نویسی میکرو کنترلرهای ARM به زبان گرافیکی) بلوگ دیاگرامی (/ پشتیبانی از میکرو کنترلرهای که از ARM۷ استفاده میکنند / دارای منابع اموزشی متوسط. / محیط ساده /امکان شبیهسازی برنامه نوشته شده / یادگیری اسان
- ARM ADS
قابلیت برنامه نویسی میکرو کنترلرهای ARM به زبانهای C و C++ و اسمبلی / امکان شبیهسازی برنامه نوشته شده / پشتبانی از تمامی میکرو کنترلرهای ARM
دارای منابع اموزشی متوسط. /محیط حرفهای و استفاده از ویرایشگر قوی/
میکرو کنترلرهای موجود در ایران
قبل از بررسی محیط این کامپایلر و اموزش نحوه برنامه نویسی در ان، به مقایسهای اجمالی بین میکرو کنترلرهای مختلف پرداختهایم: در ایران خانوادههای زیر موجود میباشد :
atmel سری ۷x و ۹x) این میکرو کنترلرهای به ترتیب از هسته arm۷ وarm۹ ستفاده میکنند (مانند: AT91SAM7X۱۲۸وAT91SAM7X۲۵۶ و AT91SAM۹۲۶۰ و
AT91RM۹۲۰۰ جدبدا هم مشاهده شده برخی وارد کنندگان سری قدیمی ۷s را وارد میکنند و این سری مثال Tiny در مقابل Mega در خانواده AVR هست phillips میکروهای ساخته شده توسط شرکت فیلیپس نیز در ایران وجود دارد :LPC۲۱۴۶ و LPC۲۳۶۸ و LPC2378 STMicroelectronics شرکت ST نیز اقدام به تولید میکرو کنترلرهای با هسته ARM نموده است، در ایران میکرو کنترلرهای STM32F101T۶ و STM32F101CB و... موجود است. شرکتها دیگری نیز اقدام به تولید میکرو کنترلر ازهسته ARM نمودهاند که بحث ما برسر میکرو کنترلرهای موجود در ایران میباشد. بحث بر سر برتری میکرو کنترلرها نیز هیچگاه به پایان نمیرسد. ما برای کار با ARM میکرو کنترلرهای ساخته شده توسط اتمل را به دالیل زیر انتخاب کردهایم: این شرکت با عرضه میکرو کنترلرهای AVR و ۸۰۵۱ سابقه درخشانی در ایران دارد. پشتیبانی از تولیدات، در این شرکت بی نظیر است. محصوالت این شرکت بیشتر در ایران وجود دارد) به نوعی همه گیر شده است (از دیگر ویژگیها میتوان به تنوع محصوالت، قیمت کم، وجود منابع اموزش در سایت رسمی شرکت و فرومهای خارجی، وارادات اسان و تامین قطعات جانبی و.... اشاره کرد.
کامپایلرهای ARM و مقاییسه انها به زبان ساده تر: ارم دارای کامپایلرهای مختلفی میباشد. از جمله iar,keil,flowcodearm,winarm,… که در این میان کامپایلرهای iar و keil از محبوبیت بیشتری برخوردارند. کامپایلر iar دارای امکانات کنترلی بیشتر هست و روی رجیسترها احاطه بیشتری میتواند داشته باشد. خروجی کامپایلر iar بسته به تنظیم ما میتواند فایل bin یا hex باشد. سیمولاتور کامپایلر ارم به صورت کاملا رجیستری هست و برای مثال اگه شما بخواین بفهمید که پایههای میکرو توی چه وضعیتی هست باید با توجه به رجیسترهای میکرو و عدد هگز اون رجیستر که توی سیمولاتور هست، نتیجهگیری کنید. کامپایلر keil هیدرهای (کتابخانه) بیشتری برایش نوشته شده به همین خاطر استفاده از Keil راحت تر است. سیمولاتور این کامپایلر کامل تر میباشد و وضعیت پایههای میکرو رو به تیکی که در مقابل آنها قرار میدهید به راحتی در اختیار ما قرار میده. خروجی کامپایلر keil فقط فایل hex میتونه باشه و قادر به ساختن فایل bin نیست. در کل میتون گفت که اکثر برنامههایی که در یکی از کامپایلرهای میتوانید کامپایل کنید در دیگری هم میتونید (اکثر نه همه) و میشه گفت فرق کامپایر keil و iar مثل تفاوت کدویژن وwinavr هست. توی هر دو کامپایلر میتونید به زبان c,c++ و اسمبلی برنامه بنویسید. پروگرمرهای ارم مقایسه انها: پروگرم ویگلر و نرمافزار hjtag پروگرمر jlink و نرمافزار j-flash پروگرم ulink و نرمافزار keil استفاده از sam-ba پروگرم ویگلر یا jtag با استفاده از پورت پرینتر lpt و نرمافزار h-jtah میکرو رو پروگرم میکنه. در حقیقت فایل bin یا hex خروجی کامپایلرها از این طریق روی میکرو میکرو منتقل میشه. البته ورژنهایی از این پروگرم هستند که با usb هم کار میکننداین پروگرم با فایلهای خروجی bin,hex کامپایلر iar,keil سازگاری کامل داره. پروگرم jlink یک پروگرمر با اینترفیس usb هست. درون این پروگرم حتما یک میکرو کنترلر ارم به کار رفته. توسط این پروگرم و نرمافزار j-flash متونید میکرو رو پروگرم کنید یا توسط نرمافزار keil با این میکرو دیباگ کنین.
- (دیباگ کردن یعنی اینکه توی محیط سیمولاتور میتونید با اجرای خط به خط برنامه نتیجه را روی سختافزار به صورت عملی مشاهده کنید.)
پروگرم ulink یک پروگرم مخصوص شرکت keil هست و متاسفانه این پروگرمر توی ایران موجود نیست. Sam-ba یکی از امکانات میکروهای شرکت اتمل هست که مستقیم با usb میتونید میکرو رو پروگرم کنید. توسط این روش فقط میتونید فایل bin پروگرم کنید. لازم به ذکر هست که اگه از نرمافزار keil استفاده کردید باید فایل خروجی هگز رو با نرمافزار h-jtag convertor که یک قسمت از نرمافزار h-jtag هست به bin تبدیل کنید تا بتونید پروگرم کردن رو انجام بدهید. مزیتهای میکرو کنترلرهای ARM: ۱- میکرو کنترلرهای ارم ۳۲ بیتی هستند اما میکرو کنترلرهای avr ۸ بیتی. این بدان معنی است که سرعت میکرو کنترلر ارم ۴ برابر است و علاوه بر ان پورتهای ان ۳۲ پینه و رجیسترهای ان نیز ۳۲ بیتی هستند. شما در یک پالس کلاک میتواند وضعست ۳۲ پبن ارم را مشخص کنید اما این درحالی است که با avr فقط ۸ پایه (یک پورت) را میتوانید مقدار دهی کنید ۲- فرکانس کاری میکرو کنترلرهای ارم در arm۷ نزدیک به ۵۵ مگا هرتز در cortex m۰-m۴ تغریبا تا ۱۱۰ مگا هرت. برای arm ۹ تا ۵۴۰ مگا هرتز.arm ۱۱ نزدیک به یک گیگا هرتز cortex a۸-a۱۵ به چند گیگا هرتز میتواند برسد این درحالی است که avr و pic تا ۲۴ مگا هرتز بیشتر نمیتوان استفاده کرد ۳- تنوع میکرو کنترلرهای ارم بسیار زیاد است. این میکرو کنترلرها از ۶۴ پایه تا چند صد پایه موجود میباشند. به دلیل پر کاربرد بودن این میکرو شرکتهای زیادی در رغابت با یکدیگر میکروکنترلرهای ارم متنوعی تولید میکنندوامرئزه بیش از ۹۰ شرکت این میکرو را تولید میکنند که هر کدام چند ده محصول دارند. برای اطلاعات بیشتر میتوانید به سایت زیر مراجعه کنید http://www.keil.com/arm/chips.asp ۴- امکانات جانبی این میکرو کنترلر با avr , pic قابل مقایسه نیست. این میکروها معمولا دارای امکاناتی چون usb,can,emac,mmc در پروتکلهای ارتباطی. همچنین دارای امکانات دیگری چون pwm 6 phase,dac,rtx,… میباشند. در باره انتخاب ارم هم باید نکاتی را بیان کنم. ارمهای توی بازار ایران فقط از شرکت اتمل و شرکت فیلیپس (nxp) هستند. باید بگم که امکانات جانبی فیلیپس از اتمل بیشته اما قیمتش کمتره! در عوض اتمل منابع اموزشی بیشتر داره و خود سایت اتمل مثالها و اموزشها و کتابخانههای متعددی برای تراشه هاش گذاشته. که در مقابل با فیلیپس بیشتره. من برای کسانی که میخوان با اتمل کار کنن at91sam7x۲۵۶ رو پیشنهاد میکنم. که arm۷ هست. برای کسانی هم که میخوان با فیلیپس کار کنن lpc۲۳۶۸ که arm۷ هست و lpc۱۷۶۸ که cortex m۳ هستو پیشنهاد میکنم.
بخش سوم آموزش برنامه نویسی میکرو به زبان c
آموزش برنامه نویسی میکرو به زبان c یاد آوری زبان برنامه نویسی c بلوک دیاگرام بلوک دیاگرام یک برنامه به زبان c تقریبا به شکل زیر است: فراخوانی و راه اندازی پردازنده و کتابخانهها و فایلهای هدر و.... پیکربندی امکانات (مانند lcd و ...) معرفی متغیرها شروع حلقه برنامهای که باید انجام شود پایان حلقه پایان برنامه زیر برنامهها (در صورت وجود) برای مثال قطع کد زیر را مرور میکنیم.
- include
- include
void wait(void); int main (void) { AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91C_PIO_PB0); AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, AT91C_PIO_PB0); wait() ; AT91F_PIO_SetOutput (AT91C_BASE_PIOB, AT91C_PIO_PB0); wait() ; } void wait (void) { unsigned int n; for (n = ۰; n < ۷۳۷۲۸۰۰; n++); }
- include
این دستور نوع میکرو را مشخص میکند، شما میتوانید هر یک از میکروهای موجود را انتخاب کنید.
- include
با این دستور، فایل هدر ۲۵۶. h.lib_AT91SAM7X را به برنامه فرا خوانی میکنیم، در ادامه با فایل هدر اشنا خواهیم شد void wait(void); این دستور مشخص کننده وجود یک زیر برنامه است. void main (void){ این بخش شروع حلقه ما خواهد بود، CPU میکرو دستورات میان دو اکولاد را اجرا میکند و فقط با دستورات پرش یا شرط که در ادامه توضیح میدهیم از این حلقه بیرون میرود. void main() { دستورها } در واقع اکولادها مشخص میکنند که دستورات مربوط به کدام حلقه میباشند، در این بخش دستوات موجود مربوط به حقهای به نام main است، نام حلقه میتواند هر چیزی باشد AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91C_PIO_PB0); با این دستور portb. ۰ به عنوان خروجی تعریف میشود. AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, AT91C_PIO_PB0); این دستور، مقادیر موجود بر روی پایه را پاک میکند (پایه مورد نظر را صفر میکند (wait() ; با این دستور زیر برنامه زیر را فراخوانی میکنیم: void wait (void) { unsigned int n; for (n = ۰; n < ۷۳۷۲۸۰۰; n++); } در این زیر برنامه زمان تقریبی ۱٫۲ ثانیه ساخته میشود و سپس به خط بعد از دستور wait پرش میشود. AT91F_PIO_SetOutput (AT91C_BASE_PIOB, AT91C_PIO_PB0); با این دستور پایه مورد نظر ۱ میشود. در ادامه با کلیه دستورات اشنا خواهیم شد، مشا هده کردید که تمامی برنامهها یک قالب یکسان دارند و هر دستور در جای خودش میاید. استفاده از توضیحات گاهی اوقات در برنامه نیاز به توضیح دادن یک خط یا کد یا عمل است برای درج توضیحات از// استفاده میشود یا توضیحات میان /* ..... */ درج میشود. توضیحات توسط کامپایلر خوانده نمیشوند و شما میتوانید از انها برای توضیح برنامه استفاده نمایید. معرفی متغیرها متغیر چیست؟ متغیرها مکانی از حافظه موقت هستند که به عمل خاصی اختصاص داده میشوند، مثلا یک متغیر از نوع char که مقدار عدد روی یک پورت ۱۶ پایهای درونش ریخته شده است، ۱۶ بیت (خانه) از حافظه را اشغال میکند. از متغیرها برای ذخیره یک عدد یا وضعیت استفاده میشود، از انجا که وضعیتهای مختلف (از نظر اندازه) وجود دارند، بنابراین به چندین نوع متغیر نیاز داریم متغیرهای keil، زیر را در اختیار برنامه نویس قرار میدهد:
تعریف متغیر به فرم زیر است:
- نام متغیر نوع متغیر
مثلا متغیر a از نوع int تعریف شده است و میتواند بین ۰ تا ۳۲ بیت را در خود ذخیره کنید) از ۰ تا، ۴۲۹۴۹۶۷۲۹۶ تغییر کند (و متغیرb از جنس char میتواند از ۰ تا ۸ بیت (از ۰ تا ۲۵۶) تغییر کند: int a; Char b; توجه داشته باشید: که نام متغیرها نمیتواند شامل کلمات رزرو شده) دستورات که در برنامه نویسی به کار میروند مانند void و intو...(باشد، همچنین نام متغیر نباید از ۳۱ کاراکتر) حرف (بشتر باشد و زبان c بین حروف کوچک و بزرگ تفاوت قائل میشود (فرق دارد a و A)
دستورات و توابع ریاضی ومنطقی در keilدستوراتی برای انجام عملیات ریاضی وجود دارد، این دستورات را در زیر مشاهده میکنید:
شما میتوانید کلیه اعمال بالا را بر روی متغیرها انجام دهید و حاصل را در یک متغیر ذخیره کنید.
دستورات حلقه و پرش گاهی مواقع برنامه باید چندین بار تکرار شود، برای اینکار از دستورات حلقه و پرش استفاده میشود، در زیر به بررسی انواع حلقههای موجود در keil پرداخته میشود .
حلقهٔ while:
- این حلقه به فرم زیر میباشد
while (x) { برنامه } این حلقه که خود در حلقهٔ اصلی قرار میگیرد، یک حلقهٔ بینهایت است، هنگامی که برنامه به اکولاد دوم رسید به while پرش میکند شما میتوانید به جای x عدد دلخواه خود را بگذارید و از تعداد بیشتری حلقه در برنامه خود استفاده کنید حلقهٔ: for این حلقهٔ یک حلقهٔ شرطی است و تازمانی که شرط ان درست باشد ادامه مییابد، این حلقه به فرم کلی زیر است: { (مقدار اولیه حلقه، شرط پایان، گام حلقه) For برنامه } در این نوع حلقه میتوان تعداد تکرار را مشخص کرد، مقدار اولیه حلقه، میتواند یک عدد باشد، شرط پایان حلقه نیز یک عدد یا متغیر است، هنگامی که مقدار اولیه در شرطی که در این قسمت نوشته میشود، صدق کند، حلقه به پایان میرسد. گام حلقه نیز مشخص میکند که مقدار اولیه چکونه تغییر کند: for (j = ۱; j <10 ; j++) { برنامه } در مثال بالا مقدار اولیه j ۱ میباشد تا وقتی کهj از ۱۰ کوچکتر باشد حلقه ادامه مییابد همچنین با هر بار تکرار حلقه یک واحد به j افزوده میشود.
- do – while حلقهٔ
do { برنامه }while (شرط) ; در این حلقه برخلاف دیگر حلقهها، شرط در انتهای حلقه چک میشود این حلقه حداقل یکبار اجرا میشود، در صورتی که در قسمت شرط دستور مبنی بر تکرار حلقه وجود داشته باشد، حلقه دوباره تکرار خواهد شد. دستور: goto توسط این دستور میتوان به یک برچسب پرش کرد، بازگشت از برجسب با دستور return انجام میشود: Goto lable ; Lable: برنامه Return; برچسب باید در داخل حلقهٔ اصلی باشد، طول برچسب باید از ۳۱ کاراکتر کمتر باشد، برای برچسب نمیتوان از کلمات رزرو شده استفاده کرد.
دستورات مربوط به پورتها در زبان c مجموعه از ریجسترها وجود دارد که ما باید انها را بشانسیم، شناخت این ریجسترها برای کار با هر جزء میکرو الزامی است. در کامپایلر Keil هر یک از امکانات جانبی دارای ریجستر مخصوص به خود هستند، مثلا ریجستر AT91F_PIO مخصوص به پورتهای میکرو کنترلرهای اتمل میباشد، شما میتوانید در این ریجستر مشخص کنید که پورت چه وضعتی داشته باشد، شما میتوانید پورت یا پایه را به عنوان ورودی یا خروجی مشخص کنید و سپس مقادیر مختلف را در ان بنویسید یا از ان بخوانید. در ادمه اموزش با کلیه ریجسترها اشنا خواهیم شد. فایلهای هدر (کتابخانه): در هر برنامه فایلهای با پسوند h وجود دارند، ما این فایلها را با نام هدر میشناسیم. این فایلها برای ساده تر کردن کدها در هنگام برنامه نویسی به کمک ما می ایند مثلا فایل هدر ۲۵۶ h.lib_AT91SAM7X دستورات مربوط به میکرو کنترلر at91sam7x۲۵۶ را به زبان گفتار نزدیک میکند ما همچنین میتوانیم هدر یا کتابخانه دلخواه خود را بنویسیم. در Keilهدرهای زیادی وجود دارد که در اینده با انها اشنا خواهیم شد. ریجسترهای مخصوص به پورت: این دستورات و ررجیسترها برای هدرهای lib_AT91SAM??????????.h گفته میشود، برای اجرای این دستورات نیاز است که این کتابخانهها را در برنامه خود فراخوانی کنید مثلا برای میکرو at91sam7x
- include
- include
ادامه برنامه یا میکرو۶۴ AT91SAM7S >H.include
- include
ادامه برنامه قرار دادن پورت به عنوان ورودی یا خروجی: AT91F_PIO_CfgOutput(AT91C_BASE_PIOx, AT91C_PIO_Pxy); دستور بالا پایه y از پورت xرا به عنوان خروجی تعریف میکند. (AT91F_PIO_GetInput(AT91C_BASE_PIOx) , AT91C_PIO_Pxy) دستور بالا پایه y از پورتx را به عنوان ورودی تعریف میکند. AT91F_PIO_ClearOutput(AT91C_BASE_PIOx, AT91C_PIO_Pxy) دستور بالا، پایه y از پورت x را صفر میکند. AT91F_PIO_SetOutput (AT91C_BASE_PIOx, AT91C_PIO_Pxy) دستورات بالا پایه y از پرت x را صفر میکند. مثال: به portb۰ میکرو کنترلر AT91SAM7X۲۵۶ یک کلید و به protbl۱۹ یک led متصل کردهایم. برنامهای مینویسیم که با تحریک کلید led روشن و با قطع تحریک ledخاموش شود.
# include# includeint main (void) {AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91C_PIO_PB19);(AT91F_PIO_GetInput(AT91C_BASE_PIOB) , AT91C_PIO_PB0) ;if ((AT91C_PIO_PB۰ ==)۰)AT91F_PIO_SetOutput (AT91C_BASE_PIOB, AT91C_PIO_PB19);elseAT91F_PIO_ClearOutput(AT91C_BASE_PIOB, AT91C_PIO_PB19);}
دستورات تاخیر گاهی موقع لازم است، برنامه برای مدتی اجرا نشود برای این کار از دستورات تاخیر استفاده میشود در keil تابع برای تاخیر (در برنامه) وجود ندارد، و شما باید برای ایجاد تاخیر CPU را به کار دیگری مشغول کنید، یکی از این کارها شمردن اعداد میباشد:
برنامه زیر را را شبیهسازی تاخیر است:
# include# includevoid wait(void);int n;int main (void) {AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91C_PIO_PB19);AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, AT91C_PIO_PB19);wait() ;AT91F_PIO_SetOutput (AT91C_BASE_PIOB, AT91C_PIO_PB19);wait() ;}void wait (void) {for (n = ۰; n < ۱۸۴۳۲۰۰; n++);}
مشاده میکنید که در هر نیم میلی ثانیه پایه b۱ روشن و خاموش میشود. در این برنامه برای ایجاد تاخیر از فراخوانی توابع استفاده شده است، در زیر برنامه را تحلیل میکنیم: ۲۵۶
- )void wait(void در خط دوم مقداری از فضای حافظه برای توابع فراخوانی رزرو شده است.
- int n در خط سوم یک متغیر از نوع int معرفی شده است (میتواند از ۰ تا ۲بتوان ۳۲، یعنی ۴۲۹۴۹۶۷۲۹۶ تغییر کند).
(void main) شروع حلقهٔ اصلی برنامه میباشد. AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91C_PIO_PB19); در این خط پایه b۱۹ به عنوان خروجی پیکربندی شده است. AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, AT91C_PIO_PB19); در این خط پایه b۱۹ در سطح منطقی صفر قرار گرفته است.
- ()wait در خط هشتم تابع تاخیر فراخوانی میشود، با رسیدن CPUبه این خط، به تابع ;)void wait(void پرش میشود، در زیر برنامه wait یک حلقهٔ for وجود دارد که در این حلقه مقدار اولیه ۰ برای I در نظر گرفته شده است با دستور i++ مدام به تغییر I یک واحد اضافه میشود، هنگامی که I به ۱۸۴۳۲۰۰ رسید CPU به خط بعد از شرط پرش میکند، در آن جا یک اکولاد وجود دارد که CPU را حلقهٔ اصلی بر میگرداند و CPU برنامه را از خط بعد از wait ادامه میدهد.
AT91F_PIO_SetOutput (AT91C_BASE_PIOB, AT91C_PIO_PB19) ; در این خط پایه b۱۹ در سطح منطقی یک قرار گرفته است wait(); در خط نهم دوباره به تابع wait; پرش میشود. با رسیدن CPU به اکولاد){ (برنامه دوباره از اول اجرا میشود و کلیه اعمال بالا از ابتدا انجام میشود. برای ایجاد تاخیر زمانی شما باید یک تابع ایجاد کنید تا در هنگام تاخیر فراخوانی شود، برای ایجاد تابع باید ابتدا ان را معرفی کنید :برای معرفی کلیه توابع از دستور زیر استفاده میشود: (خود برنامه اصلی نیز یک تابع میباشد (Void نام تابع (نوع فضا); در قسمت نام تابع، شما باید یک نام مناسب بنویسید که در برنامه تابع با همین نام فاخوانی میشود. در قسمت نوع فضا، نوع ذخیرهسازی تابع مشخص میشود شما میتوانید از عناوین void (فضای خالی) یا جای خالی استفاده کنید. با این حساب قالب کلی یک برنامه در زبان c به شکل زیر خواهد بود:
- include معرفی چیپ
معرفی متغیرها void wait(void); (معرفی زیر برنامه) توابعی که قرار است در برنامه فرا خوانی شوند void main(){ تابع اصلی برنامه ورودی یا خروجی قرار دان پورتها while (شروع حلقه }۱ برنامه اصلی wait() ; فراخوانی توایع پایان حلقه { پایان تایع اصلی برنامه { void wait (void) { نام توابعی که قرار است فرا خوانی شود شروع حلقهٔ تابع فراخوانی شده } برنامهای که فراخوانی میشود } (پایان حلقهٔ تابع فراخوانی شده) با رسیدن بر نامه به این خط به برنامه اصلی پرش میشود مقدار زمانی که توسط روش بالا ایجاد یشود از رابطهٔ زیر بدست میاید: زمان =(x*۵)/(f) X مقدار رقمی است که در حلقهٔ for شمرده میشود و f مقدار فرکانس کریستال برچسب هرتز میباشد. برای درک بهتر مثالی میآوریم در ادامه: در این مثال برنامهای مینویسیم که پایه ۱۹b میکرو کنترلر AT91SAM7X۲۵۶ را به مدت ۲ ثانیه ۰ کند، بعد به مدت ۱٫۵ ثانیه ۱ کند و سپس به مدت ۲٫۵ ثانیه ۰ کند و این حلقه مدام تکرار شود.
# include# includeint n;void wait(void);int main (void) {AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91C_PIO_PB19);AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, AT91C_PIO_PB19);wait() ;wait() ;wait() ;wait() ;AT91F_PIO_SetOutput (AT91C_BASE_PIOB, AT91C_PIO_PB19);wait() ;wait() ;wait() ;AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, AT91C_PIO_PB19);wait() ;wait() ;wait() ;wait() ;wait() ;}void wait (void) {for (n = ۰; n < ۱۸۴۳۲۰۰; n++);}
برنامه بالا شاید ساده ترین برنامه برای سوال ذکر شده باشد، در این برنامه ما زمان اصلی ۵۰۰ میلی ثانیه را بوجود اوردهایم و در مکان مناسب به تعداد دفعات مناسب ان را فراخوانی کردهایم.
در پایان چند نکته: واسط SAM-BA فقط از میکرو کنترلرهای زیر پشتیبانی میکند:
- AT91SAM7S321
- AT91SAM7S64
- AT91SAM7S128
- AT91SAM7S256
- AT91SAM7S512
- AT91SAM7X128 and AT91SAM7XC128
- AT91SAM7X256 and AT91SAM7XC256
- AT91SAM7X512 and AT91SAM7XC512
- AT91SAM7SE256
- AT91SAM7SE512
- AT91SAM7A3
برای استفاده از واسط SAM-BA برای میکرو کنترلرهای AT91SAM7S مراحل زیر را انجام دهید:
- Power Off the board.
- set TST pin to high level.
- Power On the board.
- Wait about 10 seconds
- Power Off the board.
- set TST pin to ground.
- Power On the board.
منابع
- جزوه آموزشی " آموزش برق و الکترونیک " وب سایت elmicro
- مجله تخصصی میکرو کنترلها PMM شماره ۲، ۳ ، ۸
- مقالات " دوره آموزشی میکرو کنترل هایAMR پارک علمی و فناوری یزد "
- مرجع کاربردی میکرو کنترلرهای AMR تالیف مهندس سهرابی
- گرد آورنده مجتبی ستوده