بایگانی دسته: مطالب آموزشی

در این قسمت مطالب آموزشی در رابطه با میکروکنترلرهای ARM قرار خواهد گرفت.

فیلم های آموزش مقدماتی کار با نرم افزار STM32CubeMX و توابع HAL

http://www.arm-education.ir/im/STM32CubeMX_armeducation.png

دانلود مستقیم فیلم ها از اینجا :

http://zarkoob.persiangig.com/video/STM32CubeMX

پسورد : www.arm-education.ir


مشاهده در آپارات :

۱-۱- نحوه ایجاد پروژه در نرم افزار STM32CubeMX برای keil و پروگرام کردن بر روی برد stm32f103ve
“فیلم کیفیت بالا ” در آپارات :

http://www.aparat.com/v/2ZG6m

۲-۱- نحوه تنظیمات در نرم افزار STM32CubeMX برای خروجی کردن پایه ها و استفاده از توابع به منظور ست و ریست کردن آن در کامپایلر keil
“فیلم کیفیت بالا ” در آپارات :

http://www.aparat.com/v/TOy8x

۲-۲- نحوه تنظیمات در نرم افزار STM32CubeMX برای ورودی کردن پایه ها و استفاده از توابع به منظور خواندن وضعیت پایه در کامپایلر keil
“فیلم کیفیت بالا ” در آپارات :

https://www.aparat.com/v/eX0iz

۳-۱- نحوه تنظیمات در نرم افزار STM32CubeMX به منظور استفاده وقفه خارجی برای پایه های در کامپایلر keil  “فیلم کیفیت بالا ” در آپارات :

۴-۱- نحوه تنظیمات در نرم افزار STM32CubeMX برای پورت سریال و ارسال یک رشته

“فیلم کیفیت بالا ” در آپارات :
۴-۲- دریافت یک کاراکتر و رشته از پورت سریال با استفاده از توابع HAL 
“فیلم کیفیت بالا ”
۴-۳- دریافت یک کاراکتر از پورت سریال با استفاده از وقفه در توابع HALاستفاده از سیمولاتور کیل برای تست برنامه

۵-۱- راه اندازی تایمر و وقفه آن با تنظیمات در STM32CubeMX

https://www.aparat.com/v/TzFhQ

۵-۲- راه اندازی PWM با تنظیمات در STM32CubeMX

https://www.aparat.com/v/F2bQI

۶-۱- راه اندازی ADC با تنظیمات در STM32CubeMX

https://www.aparat.com/v/zcRWQ

۶-۲- استفاده از وقفه در راه اندازی ADC با تنظیمات در STM32CubeMX

https://www.aparat.com/v/ToqS8

۷-۱- راه اندازی DAC با تنظیمات در STM32CubeMX و نحوه تغییرات برای پخش فایل صوتی

https://www.aparat.com/v/pmZPB

۸-۱- راه اندازی RTC با تنظیمات در STM32CubeMX برای نمایش ساعت

https://www.aparat.com/v/jiqaQ

۸-۲- استفاده از وقفه RTC با تنظیمات در STM32CubeMX

https://www.aparat.com/v/Due9U

پروتکل های ارتباطی در میکروکنترلرهای ARM

یک میکروکنترلر هر چه قدر قدرتمند باشد و سرعت بالایی هم داشته باشد وقتی نتواند به خوبی با دنیای خارج ارتباط برقرار کند چه کارایی می تواند داشته باشد!؟ یا وقتی چند پروتکل ارتباطی را فقط پشتیبانی کند کاربردهای محدودتری خواهد داشت.

در میکروکنترلرهای ARM پروتکل های مختلف ارتباطی پشتیبانی می شود. البته این بستگی دارد کدام مدل را انتخاب کرده اید.  پروتکل های ارتباطی شامل :

UART , I2C ,I2S, SPI , CAN , USB , Ethernet

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

ساده ترین کاربرد پورت سریال مانیتورینگ برنامه است. پورت سریال (RS-232) برای ارتباط با ماژول هایی مثل sim900 و Wi-Fi و EM18 و بلوتوث و … مورد استفاده قرار می گیرد. همچنین با استفاده از یک واسطی مثلADM485 یا MAX485 می توان از پروتکل RS485 نیز استفاده نمود.

پروتکل i2c برای ارتباط با ایتوپرام خارجی و دوربینov7670 و … مورد استفاده قرار می گیرد.

پروتکل SPI برای ارتباط با spi Flash ،sd کارت و ماژول NRF و … مورد استفاده قرار می گیرد.

به نظر شما این میکروکنترلرها با وسایلی که بایستی با آنها از پروتکل هایی مثل پروفی باس و مد باس( Modbus RTU و Modbus/TCP ) استفاده کند، چگونه ارتباط برقرار می کند؟

در حال بروز رسانی ..

واحد آنالوگ به دیجیتال(ADC) در lpc1768 و lpc1788

بر اساس اطلاعات یوزر منوال، این میکرو دارای یک واحد ADC دوازده بیتی با نرح ۲۰۰ کیلوهرتز در lpc1768 و ۴۰۰ کیلوهرتز در lpc1788 می باشد. این واحد دارای ۸ کانال ورودی است. همچنین در این واحد حالتی وجود دارد به نام Burst که با فعال کردن آن، نمونه برداری بدون توقف و پشت سر هم انجام خواهد شد.

برای استفاده از این واحد لازم است ابتدا پاور آن در رجیستر PCONP فعال شود. زیرا به صورت پیش فرض پاور ADC در این میکرو غیر فعال است. همچنین لازم است پایه مربوطه در میکروی lpc1768 با رجیستر pinsell و در میکروی lpc1788 با رجیستر IOCON در حالت مربوطه قرار داده شود. بعد از این، تنظیمات در رجیسترهای واحد خود ADC انجام خواهد شد.

تنظیم مربوط به اینکه از کدام کانال استفاده شود و با چه تقسیم فرکانسی، همچنین نحوه اغاز تبدیل در رجیستر ADCR انجام می شود.

وقتی فرمان آغاز تبدیل داده می شود لازم است با یک بیت مرتب چک شود تا به محض فعال شدن آن، عدد تبدیل شده که بین ۰ تا ۴۰۹۵ است از رجیستر مربوطه خوانده شود و مورد استفاده قرار گیرد:

while (!(LPC_ADC->ADGDR & (1UL<<31)));/* Wait for Conversion end */
adGdr = LPC_ADC->ADGDR;
return((adGdr >> 4) & 0XFFF);/* read converted value */

وقتی از یک برنامه در حال استفاده هستید که هر ثانیه از یک کانال تعدادی نمونه برمی دارد و نمایش می دهد، ممکن است به غیر نوساناتی در نتیجه تبدیل، پرشهای را هم مشاهده کنید. مثلا گاهی نتیجه تبدیل ناگهان ۴۰۹۵ شود!

در کل برای اینگونه نمونه برداری ها می توان چندین نمونه گرفت و از آن میانگین گیری کرد. همچنین با حذف چهار رقم کم ارزش از ۱۲ رقم عدد تبدیل شده نیز می توان نوسانات را کم کرد. ولی هر دوی این روشها ایراداتی دارد. با میانگین گیری آن پرش های ناخواسته رفع نمی شود و با حذف چند رقم کم ارزش دقت تبدیل از ۱۲ بیت کاهش می یابد.

با روش های برنامه نویسی می توان این موارد ناخواسته را از میان برد به طوری که به ازای ثابت بودن ورودی آنالوگ، تغییرات در تبدیل انجام شده در حد یکی باشد. نظر شما چیست؟

در ابتدا ذکر شد که برای تبدیل پشت سر هم از مد Burst استفاده می شود. در حالت معمول بعد از هر تبدیل لازم است نتیجه تبدیل بلافاصله در یک آرایه قرار بگیرد و منتظر تبدیل بعدی شود. مثلا ۱۰۰۰ نمونه بردارید و روی آن آنالیز کنید. موردی که در اینجا ممکن است به وجود اید مشغول شدن cpu به انجام این کار است و دیگر در این مدت نمی تواند کار دیگری انجام دهد. اینجاست که بحث استفاده از DMA خود را نشان می دهد.

وقفه lpc1768 و lpc1788

در میکروکنترلر lpc1768 تمام پایه های دو پورت ۰ و ۲ به وقفه gpio اختصاص داده شده است. وقتی که تنظیم مربوطه انجام شود برنامه وارد زیرروال وقفه خارجی ۳ می شود:

void EINT3_IRQHandler(void)

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

همچنین این میکرو دارای ۴ وقفه خارجی است که هر کدام زیرروال وقفه خاص خود را دارد. این چهار وقفه روی پایه های p2.10,p2.11,p2.12,p2.13 تعریف شده است.

———————————————————

در میکروکنترلر lpc1788 تمام پایه های دو پورت ۰ و ۲ به وقفه gpio اختصاص داده شده است. وقتی که تنظیم مربوطه انجام شود برنامه وارد زیرروال وقفه GPIO می شود:

void GPIO_IRQHandler(void)

همچنین این میکرو دارای ۴ وقفه خارجی است که هر کدام زیرروال وقفه خاص خود را دارد. این چهار وقفه روی پایه های p2.10,p2.11,p2.12,p2.13 تعریف شده است. وقفه ۰ و ۱ را می توان روی پایه های p0.29 و p0.30 نیز تنظیم کرد.

———————————————————

تفاوت وقفه gpio و وقفه خارجی در میکرو lpc :

در وقفه gpio می توان تنظیم کرد که در لبه بالا رونده یا پایین رونده یا هر دو لبه، وقفه اتفاق بافتد. در حالی که در وقفه خارجی یا در لبه بالا رونده یا در لبه پایین رونده می توان این تنظیم را انجام داد.

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

تنظیم وقفه gpio به سادگی با یک رجیستر انجام می شود در حالی که در وقفه خارجی باید کانفیگ پایه مربوطه نیز تغییر کند. در lpc1768 این تغییر کانفیگ با pinsell و در lpc1788 با IOCON انجام می شود.

———————————————————

سیستم وقفه در میکروی stm32 متفاوت است.

کتابخانه cmsis چیست؟

cmsis که مخفف Cortex Microcontroller Software Interface Standard می باشد، کتابخانه ای است که برای استفاده ساده تر از میکرو برای سری های ARM Cortex .

و اما نحوه استفاده چیست؟

برای هر سری میکرو کتابخانه های آن به همراه مثال های آن موجود است. این کتابخانه شامل فایل های c. و h. می باشد. فایل های c. که لازم است استفاده شود،به پروژه اضافه شده و h. هم ابتدای برنامه include می شود. به عنوان مثال می خواهیم از پریفرال gpio استفاده کنیم :

در این حالت دیگر لازم نیست از دستورات رجیستری برای خروجی کردن پایه و ست و ریست کردن و .. استفاده شود:

GPIO_SetDir(2, 0xff, 1); //LEDs PORT2 0…7 are Output

GPIO_SetValue(2,1<<0); //LPC_GPIO2->FIOSET = 1<<0;

GPIO_ClearValue(2, 1<<0);  //LPC_GPIO2->FIOCLR = 1<<0;

معادل هر دستور به صورت رجیستری جلوی هر خط نوشته شده است.

و اما در داخل این دستورات cmsis چه اتفاقی می افتد؟ به عنوان مثال همان طور که مشاهده می کنید از دستورات رجیستری استفاده شده است :

به دلیل اینکه در این حالت بنا به نیاز بایستی چندین کتابخانه اد شود و مسیر فایل های h. هم به کامپایلر شناخته شود، لازم است در موقع ساخت پروژه جدید دقت بیشتری شود تا با خطاهای متعدد مواجه نشویم.

برای میکروی stm32 نیز چنین کتابخانه ای برای پریفرالهای مختلف قابل استفاده است به عنوان مثال برای gpio :

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_WriteBit(GPIOA,GPIO_Pin_2,Bit_SET);

GPIO_WriteBit(GPIOA,GPIO_Pin_2,Bit_RESET);

همان طور که مشاهده می شود از نکات مثبت استفاده از cmsis سادگی در تغییر کانفیگ پریفرال مورد نظر است. همچنین قابل فهم بود دستور با خواندن آن است.

نظرات مختلفی در مورد اینکه کدام بهتر است وجود دارد. نظر شما چیست؟

شما هر کدام را می پسندید انتخاب کنید و از آن در کارتان استفاده کنید. موقعی که با آن درگیر شدید بیشتر به نقاط ضعف و قوت آن آشنا می شوید.

در انتها یک مثال cmsis برای gpio در میکروی lpc1768 و stm32103rb به همراه لینک دانلود کتابخانه های cmsis چند میکرو قرار داده شده است :

gpio_cmsis_lpc1768

gpio_cmsis_stm32

lpc17xx.cmsis.driver.library

lpc177x_8x.cmsis.driver.library

STM32F10x_StdPeriph_Lib_V3.5.0

STM32F4xx_DSP_StdPeriph_Lib_V1.0.1

پسورد: www.arm-education.ir

بررسی gpio در میکروکنترلرهای STM32

در سری stm32f10x با استفاده از رجیسترهای CRL و CRL عمل کانفیگ پایه ها انجام می شود.به عنوان مثال :

GPIOA->CRL &= ~0xFF00; /* PA.2 , PA.3 clear */
GPIOA->CRL |= 0x2200 ; // PA2 , PA3 output Max Speed 2 Mz(push-pull)

پایه های ۲ و ۳ به عنوان خروجی تعریف شده است. در هر جا که قرار است از پایه های میکرو چه به عنوان ورودی چه به عنوان خروجی استفاده شود ابتدا بایستی کانفیگ لازم با روی آن با این رجیستر انجام شود.

از رجیسترهای ODR و BSRR و BRR برای ست رو ریست کردن پایه ها استفاده می شود.

برای ست کردن از دستور:

GPIOA->BSRR  = (۱<<2) ;

یا :

GPIOA->ODR  |= (۱<<2) ;

استفاده می شود. اما بین این دو دستور یک تفاوت وجود دارد. به نظر شما این تفاوت در چیست؟

برای ریست کردن نیز :

GPIOA->BRR  = (۱<<2) ;

یا :

GPIOA->BSRR  = (۱<<18) ;

 

————————————————————-

در سایر سری های این نوع میکرو از رجیسترهای MODER و OTYPER و OSPEEDR و PUPDR عمل کانفیگ پایه ها انجام می شود.

از این قسمت برنامه ها را می توانید دانلود نمایید.

gpio_stm32f103

پسورد : www.arm-education.ir

بررسی gpio در میکروکنترلرهای LPC17xx

ساده ترین راه اندازی برای یک میکروکنترلر قائدتا می تواند ست و ریست کردن یک پایه یا همان چشمک زدن تعدادی LED باشد.

در میکروکنترلر lpc1768 این کار با چند رجیستر FIODIR و FIOSET و FIOCLR و FIOPIN انجام می شود. ابتدا با رجیستر FIODIR پایه مربوطه را خروجی کرده و با دو رجیستر FIOSET و FIOCLR آن را ست و ریست می کنیم :

LPC_GPIO1->FIODIR = (1<<25) | (1<<26); /* LED PORT1 25 is Output */
LPC_GPIO1->FIOCLR = (1<<25) | (1<<26); /* turn off the LEDs */
while(1)
{
LPC_GPIO1->FIOSET = 1<<25;
LPC_GPIO1->FIOSET = 1<<26;
delay(d);

LPC_GPIO1->FIOCLR = (1<<25) | (1<<26);
delay(d);
}

با استفاده از رجیستر FIOPIN عمل خواندن از یک پورت انجام می شود. در صورتی که بخواهیم وضعیت صفر یا یک بودن یک پایه مشخص را بخوانیم بدین صورت عمل می کنیم:

while( (LPC_GPIO2->FIOPIN & (1<<11))==0)
{
……
}

البته با رجیستر FIOPIN می توان تغییر وضعیت در پایه خروجی ایجاد کرد شبیه رجیسترFIOSET :

LPC_GPIO1->FIOPIN = ۱<<25;

LPC_GPIO1->FIOPIN = ۱<<26;

ولی تفاوت در چیست؟

در پروژه خود این دو خط را در سیمولاتور کیل دیباگ کنید و با دیباگ این دو خط مقایسه کنید. چه تفاوتی مشاهده می کنید؟

همچنین در این میکروکنترلر می توان به صورت ۸ تایی و همین طور ۱۶ تایی از رجیسترهای gpio استفاده کرد :

LPC_GPIO1->FIOSET  = ۱<<25;

LPC_GPIO1->FIOSETH  = ۱<<9;

LPC_GPIO1->FIOSET3 = 1<<1;

این سه دستور یک کار را انجام می دهد.

در مواقعی لازم می شود از رجیستر FIOMASK هم استفاده شود. بیتی که توسط این رجیستر ست شود، دیگر توسط دستور FIOSET و FIOCLR ست و ریست نمی شود. به نظر شما این عملکرد چه کاربرد عملی می تواند داشته باشد؟

————————————————————-

در میکروکنترلر lpc1788 این کار با چند رجیستر DIR و SET و CLR و PIN انجام می شود. مانند lpc1768

به نظر شما در میکرو lpc1788 رجیسترهای gpio را می توان به صورت ۸ بیتی و ۱۶ بیتی استفاده کرد؟ ابتدا تست کنید و بعد نظر دهید ….

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

gpio_lpc1768

gpio_lpc1788

 پسورد : www.arm-education.ir