آموزش صفر تا صد میکرو ARM (کتابخانه CMSIS)

آموزش صفر تا صد میکرو ARM (کتابخانه CMSIS)

CMSISیک رابط نرم افزاری استاندارد شده برای برنامه نویسی میکروکنترلرهای ARM با هسته Cortex میباشد.این توابع (رابط نرم افزاری استاندارد برای میکروکنترلرهای  Cortex ) در سال ۲۰۰۸ توسط شرکت ARM معرفی شدن تا برنامه نویسی این سری از میکروکنترلرها را استاندارد کنن و قابلیت استفاده از نرم افزار را بهبود بخشن یعنی بشه براحتی روی میکروکنترلر شرکت دیگری که با این هسته ساخته شده برنامه را اجرا کرد.

 

در جلسه اول آموزش میکروکنترلرهای ARM به تولید کننده های میکروکنترلرهای ARM پرداختیم و دیدیم که ده شرکت از این هسته ها استفاده میکنن و وجود تنوع تولید کننده ها باعث میشه کار با میکروکنترلر هر شرکت با اون یکی فرق کنه و این کار هزینه نوشتن نرم افزار را افزایش میده در این راستا  شرکت ARM وارد عمل شد و CMSIS را معرفی کرد و این مشکلات را از بین برد.

خب CMSIS دارای یکسری فایل های هست که سازنده میکروکنترلر در اختیار برنامه نویسان قرار میده و در پروژه کافیه اونا را فراخوانی کنید.

بطور خلاصه CMSIS برنامه نویسی را خیلی آسانتر و هزینه نرم افزار نویسی را پایین میاره.

معرفی لایه های مختلف CMSIS

لایه CMSIS-CORE

این لایه واسط بین پردازنده های سری Cortex-M و امکانات جانبی میکروکنترلر میباشد.

بطور مثال Core_cm3.h و System_lpc17xx.h از این دسته بندی میباشد.

لایه CMSIS-DRIVER

در این لایه درایور و راه اندازهای امکانات جانبی میکروکنترلر وجود دارند.

بطور مثال در این لایه lpc17xx_gpio.h و کتابخونه های دیگر وجود دارند که باهاشون بیشتر کار داریم.

لایه های CORE-DSP ,CMSIS-RTOS,CMSIS-PACK-CMSIS-SVD,CMSIS-DAP نیز وجود دارند که میتوانید در سایت ARM در مورد اینا بخونید ? در این مرحله بدردمون نمیخورن.

اضافه کردن CMSIS به پروژه ها

برای اضافه کردن توابع CMSIS  به محیط برنامه نویسی کافیه فایل های آن را از شرکت سازنده  دانلود کنید و طبق راهنمای آن استفاده کنید در این آموزش ها ما از کامپایلر Keil استفاده میکنیم و درایور را از لینک زیر دانلود کنید.

افزودن فایل های Core به پروژه

در Keil وقتی پروژه باز میکنید  فایل startup_LPC17xx.s و دوتا فایل Core_cm3.h و System_lpc17xx.h به پروژه خود به خود اضافه میشن و خود به خود به پوشه پروژه کپی میشن و اگر نشدن و یا خودتان میخواهید دستی این کار را انجام دهید در بین فایل های CMSIS که دانلود کردید یک پوشه به اسم Core هست که داخل آن این فایل ها هست کپی کنید و ببرید داخل پوشه پروژه و از قسمت پروژه Keil به پروژه معرفی کنید.

افزودن فایل های Driver به پروژه

همراه فایل های CMSIS یک پوشه هست به اسم Drivers که داخل آن کل کتابخونه های درایور برای کار با امکانات میکروکنترلر هستن مثل GPIO ,SPI,USB خب داخل این پوشه بازم دوتا پوشه هست به اسم های  که include, source داخل include فایل های h و داخل source فایل های C وجود دارند. شما میتونید. هر دو پوشه را داخل پروژه کپی کنید تا راحت بشید ولی چون حجم پروژه زیاد میشه میتونید به هر کدام از فایل ها که نیاز داشتیم از هر دو پوشه کپی کنید داخل پوشه پروژه.

مثلا : میخواهیم با پورت های ورودی و خروجی LPC1768 کار کنیم

روش اول از داخل هر دو پوشه فایل های زیر را کپی میکنیم به پوشه پروژه lpc17xx_gpio.c , lpc17xx_gpio.h  و  البته شاید به فایل های زیر هم نیاز داشته باشیم lpc17xx_libcfg_default.H وlpc_types.h  که این اینطوری حجم پروژه کم میشه و البته در خروجی هگز تاثیر نداره فقط حجم پوشه پروژه زیاد میشه.

روش دوم کل پوشه های include, source  را بصورت پوشه ای کپی میکنیم داخل فایل پروژه و هر فایلی را نیاز داشتیم فراخوانی میکنیم.

فراخوانی کتابخانه های CMSIS در پروژه

خب تا این مرحله یا توابع CMSIS آشنا شدیم و متوجه شدیم چطوری این فایل ها را به پروژه اضافه کنیم حالا باید این فایل ها را در پروژه فراخوانی کنیم.

از قسمت پروژه فایل های هدر را به پروژه اضافه کنید مثل شکل زیر که در جلسه قبل توضیح دادیم. فایل های کتابخونه ها را که با پسوند C هستن را به به پروژه اضافه کنید.

روش اول فایل ها در پوشه پروژه هستن نه در زیر پوشه ، اون موقع بصورت زیر فراخوانی میکنیم.

 #include “lpc17xx_gpio.h”

روش دوم وقتی که فایل های هدر داخل پوشه هستن مثلا پوشه inc داخل پوشه پروژه باشن:

#include “inc/lpc17xx_gpio.h”

 کار با پورت های ورودی و خروجی :

اگر جلسات قبلی آموزش میکروکنترلرهای LPC1768 را در سایت میکرو دیزاینر الکترونیک دنبال کرده باشید میدانید که در جلسه قبلی  توابع CMSIS را برسی کردیم و گفتیم که میخواهیم برنامه ها را بر اساس این توابع بنویسیم. در این جلسه میخواهیم پورت های ورودی و خروجی lpc17xx_gpio  میکروکنترلر LPC1768 را برسی کنیم البته برای سری های مختلف فرقی ندارند و بطور کلی LPC17XX مینامیم.

میکروکنترلر LPC1768 حداکثر دارای پنج پورت و این پنج پورت سرجمع دارای هفتاد پین ورودی و خروجی میباشند.نام گذاری پورت ها بصورت P0,P1,P2,P3,P4 میباشند.

بعضی پورت ها دارای ۳۲ پایه و بعضی دیگر کمترند و در داخل بعضی پورت ها بعضی پین ها قابل استفاده نیستن !!مثلا پین های P0[12,13,14],P1[2,3,5,6,7,11,12,13] قابل استفاده نیستن.بقیه پین ها بصورت زیر هستن:

P[30:0]

P1[31:0]

P2[13:0]

P3[26:25]

P4[29:28]

برای اطلاعات دقیق تر در مورد پین های ورودی و خروجی به قست pin configuration مراجعه کنید.

خب اول کاری گفتم نمیخوام با رجیستر های میکروکنترلر LPC1768 کار کنیم و سعی میکنیم همه برنامه ها و آموزش ها بر اساس توابع CMSIS باشند در این قسمت فقط نگاهی گذرا به رجیستر ها می اندازیم و میریم سر توابع lpc17xx_gpio.h که خیلی راحتر یاد بگیریم.

رجیستر های GPIO میروکنترلر LPC1768

رجیستر FIOxDIR

این رجیستر برای تعیین جهت پورت ها (ورودی یا خروجی ) مورد استفاده می شود.

رجیستر FIOxSET

این رجیستر جهت ۱ کردن پین هایی که بصورت خروجی تعریف شدن.

رجیستر FIOxCLR

این رجیستر جهت ۰ کردن پین هایی که بصورت خروجی تعیین شدن.

رجیستر FIOxPIN

این رجیستر دسترسی مستقیم به پورت های ورودی و خروجی را فراهم میکند. بطور مستقیم میتوانیم روی پین بنویسید و بخوانیم.

رجیستر FIOxMASK

برای اینکه در پورت بعضی بیت ها را از عملیات نوشتن/خواندن یا تغییر حالت ورودی/ خروجی  محافظت کنیم از این رجیستر استفاده میکنیم.

رجیسترهای PINSEL 0-10

جهت اننتخاب نحوه عملکرد پین ها مورد استفاده قرار میگیرد بعضی پین ها عملکرد های مختلفی مانند GPIO,UART,SPI,… دارن

رجیسترهای PINMODE 0-9

جهت تنظیم مقاومت های PULL-UP و PULL-DOWN داخلی پورت ها

اگر در مورد مقاومت های بالاکش و پایین کش اطلاعاتی ندارید اینجا مطالعه کنید.

رجیتسر های PINMODE_OP 0-4

برای انتخاب حالت  Open Drain یا درین باز پین ها مورد استفاده قرار میگرن.

خب تا اینجا مروری کردیم بر رجیستر های GPIO میکروکنترلر LPC1768 ، بریم سراغ توابع CMSIS برای کار با ورودی و خروجی ها.

برسی توابع کار با GPIO کتابخانه lpc17xx_gpio.h

دقت داشته باشید همه توابعی که در زیر برسی میکنیم در هدر فایل lpc17xx_gpio.h موجود میباشند و از اینجا دانلود کنید.

تابع GPIO_ReadValue

Uint32_t  GPIO_ReadValue(uint8_t portNum);

برای خوندن مقدار یک پورت استفاده می شود.

ورودی تابع port_Num شماره پورتی که میخواهید بخوانید.

خروجی تابع uint32_t وضعیت پورت

تابع GPIO_SetDir

void GPIO_SetDir(uint8_t portNum, uint32_t bitValue, uint8_t dir);

برای تعیین ورودی/خروجی پین های پورت مورد استفاده قرار میگرد.

ورودی portNum : شماره پورت مورد نظر

ورودی bitValue: شماره پین های مورد نظر

ورودی dir : اگر ۰  باشد ورودی و اگر ۱ باشد خروجی

تابع GPIO_SetValue

void GPIO_SetValue(uint8_t portNum, uint32_t bitValue);

برای یک کردن پین هایی که خروجی تعیین شدن.

ورودی portNum : شماره پورت مورد نظر

ورودی bitValue : شماره پین های مورد نظر

تابع GPIO_ClearValue

void GPIO_ClearValue(uint8_t portNum, uint32_t bitValue);

برای صفر نمودن پین های یک پورت استفاده میشه.

ورودی portNum: شماره پورت مورد نظر

ورودی bitValue: شماره پین های مورد نظر

نکته مهم : این هدر فایل دارای توابع بیشتری میباشد مثلا FIO_HalfWordSetDir که بصورت ۱۶ بیتی میتونیم وضعیت ورودی و خروجی ها را تعیین کنیم. که در این مرحله از یادگیری به این توابع نیاز نداریم و اگر نیاز داشتیم میریم سراغشون.

مثال : پین های ۲۱ و ۲۲ از پورت ۰ را خروجی تعیین و پین ۲۱ را ۱ و پین ۲۲ را ۰ کنید.

#include “lpc17xx.h”

#include “lpc17xx_gpio.c”

int main(void){

GPIO_SetDir(0, (1<<21)|(1<<22), 1);

GPIO_SetValue(0, (1<<21));

GPIO_ClearValue(0, (1<<22));

}

مثال دوم : مقدار پورت ۰ را خوانده و در متغییر A ذخیره کنید.

#include “lpc17xx.h”

#include “lpc17xx_gpio.c”

int main(void){

uint32_t A;

A=GPIO_ReadValue(0);

}

 GPIO CMSISکتابخانه

کتابخانه کامل

2 دیدگاه در “آموزش صفر تا صد میکرو ARM (کتابخانه CMSIS)”

  1. خواجه نوری

    با توجه به اینکه بر روی سایت، آدرس و شماره تلفنی از خودتان وجود ندارد، لطفا جهت شرح کلاسهای ARM با شماره تلفن:۰۹۳۵۳۸۹۷۶۰۲ خواجه نوری تماس حاصل فرمائید.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *