در این آموزش یاد می گیریم که از پین های GPIO لانچ پد تیوا به عنوان پین های خروجی عمومی استفاده کنیم. در ابتدا، نحوه راه اندازی اولیه پایه های GPIO (ورودی-خروجی همه منظوره) میکروکنترلر TM4C123GH6PM را با لانچ پد سری C Tiva خواهیم دید . برای استفاده از پین GPIO کیت ارزیابی TM4C123G، ابتدا باید رجیسترهای مربوط به پین های GPIO را مقداردهی اولیه کنیم. در پایان آموزش، LED داخلی برد TIVA با استفاده از پورت GPIO مرتبط با آن چشمک می زند. اما ما می توانیم هر نوع محرکی را با این پین ها راه اندازی کنیم.
مقدار اولیه اولیه شامل موارد زیر است:
- مقداردهی اولیه ساعت اصلی برد
- فعال کردن رجیسترهای پورت خاصی که از پینهای GPIO استفاده میشود
- راه اندازی پایه های پورت GPIO به خروجی دیجیتال یا ورودی دیجیتال. یعنی تنظیم پایه های جهت
- پس از آن، عملکرد پورت در صورت جایگزینی یا نبودن آن انتخاب می شود (در این آموزش ما از عملکرد جایگزین استفاده نمی کنیم، بنابراین فعلاً از آن صرف نظر کنید)
پیش نیازها:
پین های GPIO میکروکنترلر TM4C123GH6PM
TM4C123GH6PM متعلق به سری میکروکنترلرهای ARM Cortex M4 است. دارای شش پورت GPIO مانند PORTA، PORTB، PORTC، PORTD و PORTE. هر پورت دارای تعداد پین های متفاوتی است که در این جدول نشان داده شده است. جدول زیر پورت های GPIO و پین های GPIO مربوطه آنها را فهرست می کند.
GPIO Ports | Pins |
---|---|
PORTA | PA0 – PA7 |
PORTB | PB0- PB7 |
PORTC | PC0 – PC7 |
PORTD | PD0 – PD7 |
PORTE | PE0 – PE5 |
PORTF | PF0-PF7 |
تمام محدوده آدرس پورت A تا پورت F در جدول زیر آورده شده است. همانطور که از این جدول می بینید، در مجموع 4K بایت حافظه برای هر PORT اختصاص داده شده است. دلیل این مقدار حافظه بیشتر برای هر پورت به دلیل بسیاری از توابع و ثبت توابع ویژه مرتبط با هر پورت TM4C123G است.
نام پورت | آدرس شروع | آدرس پایانی |
PortA | 0x40004000 | 0x40004FFF |
PortB | 0x40005000 | 0x40005FFF |
PortC | 0x40006000 | 0x40006FFF |
PortD | 0x40007000 | 0x40007FFF |
PortE | 0x40024000 | 0x40024FFF |
PortF | 0x40025000 | 0x40025FFF |
مراحل اولیهسازی که برای پیکربندی پینهای میکروکنترلر TM4C123GH6PM بهعنوان پایههای GPIO مورد نیاز است، در اینجا مورد بحث قرار میگیرند.
برای برخی از پینهای GPIO، ممکن است چند مرحله اضافی لازم باشد. به عنوان مثال، برخی از پینهای GPIO به طور پیشفرض عملکرد خاصی دارند، و برای پیکربندی آنها بهعنوان پینهای ورودی-خروجی همهمنظوره، باید قفل پین را باز کنیم یا ماسک کنیم. پیکربندی یک پین GPIO به عنوان یک مالتی پلکس عملکرد جایگزین امکان پذیر است که در آموزش های آینده توضیح داده خواهد شد. مراحل اولیه برای پیکربندی لانچ TM4C123GH6PM به عنوان یک GPIO در زیر فهرست شده است.
- پیکربندی ساعت
- پیکربندی کنترل داده ها
- پیکربندی کنترل حالت
- پیکربندی کنترل پد
هر مرحله پیکربندی نیازمند فعال یا غیرفعال کردن یک فیلد بیت در یک یا چند رجیستر است. نوشتن یک مقدار خاص در یک ثبات مناسب به طور موثر به معنای پیکربندی یک پین روی میکروکنترلر است. به زودی هر کدام را به تفصیل توضیح خواهم داد.
پین های GPIO ساعت فعال کردن ثبت نام
اولین مرحله در پیکربندی GPIO این است که ساعت را برای یک ابزار جانبی خاص که می خواهید فعال کنید، فعال کنید. یک پورت خاص را می توان با تنظیم یک فیلد بیت مناسب برای پورت GPIO مورد نیاز در آن فعال کردRCGCGPIOثبت نام کنید.
نام ثبت ساعت GPIO یک موجودیت بسیار مهم در اینجا است. این نام های رجیستر با استفاده از آدرس های فیزیکی که به پین های GPIO تعلق دارند، تعریف می شوند. این نامها نباید تغییر کنند و همه نامهای رجیستر محیطی با استفاده از نشانگرها و ساختارها مشخص میشوند و میتوانید با رفتن به داخل فایل هدر یک میکروکنترلر در این مکان نگاهی بیندازید:
C:\Keil\ARM\INC\TI\TM4C123\TM4C123GH6PM.h
به جای مقداردهی اولیه همه چیز از آدرسهای فیزیکی، میتوانیم از فایلهای هدر یک میکروکنترلر که همراه با نصب Keil IDE است استفاده کنیم. بنابراین بهترین راه این است که از آنها همانطور که هستند استفاده کنید.
رجیستر RCGCGPIO به آدرس 0x400FE608 نگاشت شده است. تمام این نگاشتهای آدرس حافظه در دیتاشیت میکروکنترلر TM4C123GH6PM ارائه شده است. بیت 0 تا بیت 5 رجیستر RCGC_GPIO_R برای فعال کردن پورت A به پورت F در تجهیزات جانبی استفاده می شود.
به عنوان مثال، اگر ساعت فعال را برای پورت C فعال کنیم، بیت دوم رجیستر RCGCGPIO و به طور مشابه برای پورت های دیگر تنظیم می کنیم.
RCGCGPIO |= 0x01 //Enable clock for PORTA
RCGCGPIO |= 0x02 //Enable clock for PORTB
RCGCGPIO |= 0x04 //Enable clock for PORTC
RCGCGPIO |= 0x08 //Enable clock for PORTD
RCGCGPIO |= 0x01 //Enable clock for PORTE
RCGCGPIO |= 0x02 //Enable clock for PORTF
ثبت نام TM4C123G GPIODATA
پینهای پورت GPIO TM4C123G با تجهیزات جانبی مختلفی مانند ورودی/خروجی دیجیتال، PWM، ارتباط سریال و غیره مالتی پلکس شدهاند. ثبات GPIODEN برای فعال کردن پین های GPIO به عنوان پایه های ورودی-خروجی دیجیتال استفاده می شود.
هنگامی که پین پورت به عنوان پین های GPIO پیکربندی می شود،GPIODATAثبات برای خواندن و نوشتن داده ها روی ثبات ها استفاده می شود. اگر پین به عنوان پین خروجی دیجیتال پیکربندی شده باشد، داده های نوشته شده در ثبات GPIODATA روی پایه خروجی مربوطه منعکس می شود.
نام تجاری بیت
این به ما امکان میدهد که دادهها را از پینهای GPIO منفرد در یک چرخه دستورالعمل بخوانیم یا بنویسیم بدون اینکه واقعاً روی وضعیت فعلی سایر پینهای GPIO تأثیر بگذاریم. این تعریف اساسی از پوشش داده در میکروکنترلرها است. در گذرگاه آدرس، از شماره بیت [9:2] برای ساخت ماسک استفاده می شود. در مجموع 256 بیت آدرس به ثبت داده اختصاص داده شده است. با توجه به مقدار داده شده در آدرس رجیستر GPIO_DATA_R، بیت مربوطه فعال می شود و رجیستر داده فقط از آن پورت مشخص شده، داده ها را می خواند و داده های پورت های باقی مانده را بررسی نمی کند.
به عنوان مثال، اگر یک آدرس 0x400253FC را به رجیستر داده پورت F مشخص کنیم، آخرین بیت های [9:2] رجیستر آدرس تنظیم می شود، یعنی مقدار آخرین بیت ها 1111111100 خواهد بود که دو بیت صفر آخر در آن نیستند. استفاده کنید. این کار تمام پین های موجود در پورت F تجهیزات جانبی TIVA را فعال می کند. اگر فقط مایل به فعال کردن پین 1 هستیم، آدرس داده شده به ثبت داده 0x40025000+0x008 خواهد بود. که با آدرس پایه PORTF و آدرس افست رجیستر PORTFDATA مطابقت دارد.
ثبت کنترل جهت TM4C123G GPIODIR
سومین مرحله پیکربندی، پیکربندی کنترل جهت است. ممکن است تعجب کنید که کنترل جهت نشان دهنده چیست. یک ثبات GPIODIR تصمیم میگیرد که کدام پایههای PORT به عنوان ورودی دیجیتال یا خروجی دیجیتال پیکربندی شوند. قابلیت پیکربندی جداگانه هر GPIO برای سایر رجیسترهای پین های پورت GPIO قابل اعمال است.
اگر بخواهیم یک پین از یک پورت را به عنوان ورودی-خروجی دیجیتال فعال کنیم، بیت مربوطه در ثبات GPIODIR باید تنظیم یا بازنشانی شود. اگر بخواهیم پین خاصی از هر پورت را به عنوان پین ورودی دیجیتال پیکربندی کنیم، بیت جهت داده مربوطه باید پاک شود. به طور مشابه، اگر بخواهیم پین خاصی از هر پورت را به عنوان پین خروجی دیجیتال پیکربندی کنیم، بیت جهت داده مربوطه باید روی یک تنظیم شود.
توجه: همه پین ها به طور پیش فرض به عنوان یک ورودی دیجیتال پیکربندی شده اند.
LED چشمک زن نمونه TM4C123G Tiva LaunchPad
بیایید یک مثال ساده از چشمک زدن LED های داخلی لانچ پد TIVA سری C انجام دهیم. با استفاده از مراحل ذکر شده در بالا، اکنون کد TM4C123G را می نویسیم که LED موجود روی برد را چشمک می زند.
ما از Keil Uvision برای نوشتن برنامه ای برای لانچ پد TM4C123G استفاده خواهیم کرد. اگر نمی دانید چگونه از Keil IDE استفاده کنید، این آموزش ها را بررسی کنید:
اول از همه، همانطور که در آموزش قبلی توضیح داده شد، یک پروژه خالی ایجاد کنید یا از پروژه ای که قبلا ایجاد کرده اید استفاده کنید. صفحه اصلی پروژه در شکل زیر نشان داده شده است. فراموش نکنید که تمام تغییرات لازم را که در آموزش قبلی توضیح داده شد، انجام دهید.
فایل تعریف را ثبت می کند
از متغیرهای اشاره گر برای تعامل مستقیم با حافظه استفاده می شود. فایل تعریف رجیستر فهرستی از رجیسترهای جانبی را به همراه نام توصیفی آنها ارائه می دهد. این فایلهای تعریف رجیستر فهرستی از آدرس رجیسترهای جانبی را ارائه میدهند که به نام کاربر پسند آنها نگاشت میشود. حال بیایید ببینیم که چگونه یک فایل تعریف ثبت برای این مثال ایجاد کنیم. اما، همه تولیدکنندگان میکروکنترلر نیز فایل های رجیستر را در IDE خود ارائه می دهند، بنابراین ما نیازی به ایجاد فایل تعریف ثبات نداریم. به این روش، اشاره مستقیم به حافظه با استفاده از اشاره گرها می گویند.
در پیکربندی GPIO اولین روش فعال کردن ساعت لوازم جانبی است. ابتدا ماکروهای همه رجیسترهای حاوی آدرس پین مورد نیاز برای پیکربندی را تعریف می کنیم و پس از آن مقادیر موجود در کد اصلی را به آنها اختصاص می دهیم.
Clock Example را فعال کنید
برای فعال کردن ساعت برای PORTF، ابتدا باید آدرس فیزیکی رجیستر RCGCGPIO را تعریف کنیم. با توجه به دیتاشیت، آدرس پایه RCGCGPIO 0x400FE000 و آدرس افست 0x608 است. از این رو،
Physical address of RCGCGPIO = 0x400FE000+0x608=0x400FE608
یک نام ماکرو “SYSCTL_RCGCGPIO_R” تعریف کنید که نشانگر آدرس ثبت فعال کننده ساعت است. این خط آدرس رجیستر RCGCGPIO را با استفاده از ماکرو پیش پردازنده و عدم ارجاع مستقیم آدرس با اشاره گرها را مشخص می کند.
# define SYSCTL_RCGCGPIO_R (*(( volatile unsigned long *)0x400FE608))
PORTF را به عنوان یک پورت دیجیتال پیکربندی کنید
بعد از فعال کردن ساعت، مرحله بعدی پیکربندی PORTF به عنوان یک خروجی دیجیتال است. زیرا LED های داخلی لانچ پد تیوا روی پین 1 پین 2 و پین 3 پورت F وجود دارد.
محدوده آدرس پورت F از 0x4002500-0x40025FFF است. اما سوال اینجاست که مقادیر تخصیص داده شده به ثبت داده GPIODATA از PORTF کجاست؟؟ همانطور که میخواهیم پینهای 1-3 پورت F را فعال کنیم. ابتدا باید آدرس فیزیکی رجیستر GPIODEN را برای PORTF پیدا کنیم. برای آن، ما باید آدرس پایه PORTF و آدرس افست رجیستر GPIODEN را بدانیم. با توجه به دیتاشیت میکروکنترلر TM4C123GH6PM،
GPIO PORTF base address = 0x4002 5000
GPIODEN Register offset address = 0x51c // page number 682 TM4C123GH6PM datasheet
physical address = 0x40025000+0x51C = 0x4002551C
این خط یک ماکرو به آدرس فیزیکی رجیستر GPIODEN تعریف می کند.
# define GPIO_PORTF_DEN_R (*(( volatile unsigned long *)0x4002551C))
تنظیم جهت PORTF
مرحله بعدی پیکربندی رجیستر جهت PORTF است. ابتدا باید آدرس فیزیکی رجیستر کنترل جهت GPIODIR از PORTF را تعریف کنیم. با توجه به دیتاشیت،
Base address of PORTF = 0x40025000
Offset address of GPIODIR = 0x400 // // page number 663 TM4C123GH6PM datasheet
GPIODIR Physical address = 0x40025000+0x400 = 0x40025400
نام ماکرو را به درستی تعریف کنید و مقدار 0x40025400 را به آن اختصاص دهید که آدرسی است که به ثبت مسیر در حافظه اختصاص داده شده است، همانطور که در زیر نشان داده شده است:
# define GPIO_PORTF_DIR_R *(( volatile unsigned long *)0x40025400))
ثبت نام POTF GPIODATA
آدرس فیزیکی ثبت GPIODATA PORTF. با توجه به دیتاشیت،
PORTF Base Address = 0x40025000
GPIODATA Registe offset address = is 0x000
GPIODATA Physical address = 0x40025000+0x608 = 0x40025000
همانطور که می خواهیم پین 1، 2 و 3 PORTF را فعال کنیم. بنابراین، بیتهای باینری که باید به ثبت داده داده شوند 000011100 هستند که عدد هگزادسیمال معادل آن 0x38 است، بنابراین آدرس 0x4002500+0x38 خواهد بود که 0x40025038 خواهد بود.
#define GPIO_PORTF_DATA_R (*(( volatile unsigned long *)0x40025038))
LED های داخلی لانچ پد Tiva را روشن کنید
حالا بیایید کدهای داده شده در بالا را با هم ترکیب کنیم و LED های روی لانچ پد tiva را کنترل کنیم. سه LED با پایه های PORTF 1، 2 و 3 متصل می شوند.
- PF1 – LED قرمز
- PF2 – LED آبی
- PF3 – LED سبز
این کد LED قرمز را روشن می کند که با پین PF1 PORTF متصل است.
#define SYSCTL_RCGCGPIO_R (*(( volatile unsigned long *)0x400FE608 ) )
#define GPIO_PORTF_DATA_R (*(( volatile unsigned long *)0x40025038 ) )
#define GPIO_PORTF_DIR_R (*(( volatile unsigned long *)0x40025400 ) )
#define GPIO_PORTF_DEN_R (*(( volatile unsigned long *)0x4002551C ) )
int main ( void )
{
SYSCTL_RCGCGPIO_R |= 0x20; // Enable clock for PORTF
GPIO_PORTF_DEN_R = 0x0E; // Enable PORTF Pin1, 2 and 3 as a digital pins
GPIO_PORTF_DIR_R = 0x0E; // Configure ORTF Pin1, 2 and 3 digital output pins
while (1)
{
GPIO_PORTF_DATA_R |= 0x02; // turn on red LED
}
}
کد بالا به جز خط زیر توضیحی است. پین 1 لانچ پد tiva c را روی یک تنظیم می کند. از این رو، LED قرمز را روشن می کند.
GPIO_PORTF_DATA_R |= 0x02; // turn on red LED
به طور مشابه، ما می توانیم دو LED دیگر را نیز کنترل کنیم.
GPIO_PORTF_DATA_R |= 0x04; // turn on blue LED
GPIO_PORTF_DATA_R |= 0x08; // turn on green LED
اکنون به جای تعریف فایل تعریف رجیستر خود، می توانیم از فایل هدر موجود در کامپایلر استفاده کنیم. همانطور که می بینید، کد بسیار ساده و کوتاه می شود.
#include "TM4C123.h" // header files contains memory addresses listing
int main ( void )
{
SYSCTL->RCGCGPIO|= 0x20;
GPIOF->DIR = 0x02;
GPIOF->DEN = 0x02;
while (1){
GPIOF->DATA = 0x02; // turn on red LED
}
}
LED چشمک زن مثال TM4C123G LaunchPad
در این قسمت نحوه کنترل یا چشمک زدن این LED ها را با کمی تاخیر خواهیم دید.
مقادیر را به Registers اختصاص دهید
دکمه فعال کردن پین 1 دارای مقدار 0x20 (10) است زیرا بیت دوم ثبت فعال را به طور مشابه تنظیم می کند 0x04 (100) برای پایه 2، پایه سوم دیجیتال را برای فعال کردن ثبت و 0x08 (1000) تنظیم می کند. پین چهارم رجیستر فعال را تنظیم می کند. به طور مشابه LED_ON1، LED_ON2، و LED_ON3 به ترتیب بیت های 2 و 3 و 4 را از ثبت داده تنظیم می کنند . این کار در کد اصلی انجام خواهد شد.
# define GPIO_PORTF_CLK_EN 0x20
# define GPIO_PORTF_PIN1_EN 0x02
# define LED_ON1 0x02
# define GPIO_PORTF_PIN2_EN 0x04
# define LED_ON2 0x04
# define GPIO_PORTF_PIN3_EN 0x08
# define LED_ON3 0x08
حالا یک تابع تاخیر بنویسید که برای ایجاد تاخیر بین چشمک زدن دو LED مختلف استفاده می شود در غیر این صورت رنگ ها را با هم ادغام می کنند.
#define DELAY_VALUE 1000000
unsigned long j=0;
void Delay(void){
for (j=0; j<DELAY_VALUE ; j++);
}
کد اصلی LED چشمک زن
حال به کد اصلی برنامه می رویم. در کد اصلی ابتدا مقدار cock را به رجیستری که آدرس ساعت را برای آن مشخص کرده ایم مطابق شکل زیر اختصاص می دهیم.
عملگر “|=” یک عملگر OR است و به سادگی مقدار سمت راست را به متغیر داده شده در سمت چپ اضافه می کند. متغیر uloop و دستور حاوی uloop فقط برای متوقف کردن 3 چرخه ساعت قبل از انتقال به وسایل جانبی وجود دارد، که هنگام کار با TIVA ضروری است. اکنون به فعال کردن رجیسترهای DIR و DEN بروید. به سادگی یا ماکروهای حاوی مقادیر ثبات های فعال و جهت با ماکروهای حاوی آدرس ثبات ها همانطور که در شکل زیر نشان داده شده است،
GPIO_PORTF_DIR_R |= GPIO_PORTF_PIN1_EN ;
GPIO_PORTF_DEN_R |= GPIO_PORTF_PIN1_EN ;
GPIO_PORTF_DIR_R |= GPIO_PORTF_PIN2_EN ;
GPIO_PORTF_DEN_R |= GPIO_PORTF_PIN2_EN ;
GPIO_PORTF_DIR_R |= GPIO_PORTF_PIN3_EN ;
GPIO_PORTF_DEN_R |= GPIO_PORTF_PIN3_EN ;
حال، اگر بخواهیم LED را روشن کنیم، ماکرو حاوی مقدار را با ماکرو حاوی آدرس ثبت داده و اگر بخواهیم LED را خاموش کنیم، ماکرو حاوی مقدار را با ماکرو حاوی ثبت داده و ماکرو حاوی مقدار را روشن می کنیم. آدرس همانطور که در شکل زیر نشان داده شده است، LED ها را با تأخیر در میان روشن و خاموش می کنیم تا LED ها چشمک بزنند.
while (1)
{
GPIO_PORTF_DATA_R &= LED_ON3;
GPIO_PORTF_DATA_R &= LED_ON2;
GPIO_PORTF_DATA_R |= LED_ON1;
Delay();
GPIO_PORTF_DATA_R &= LED_ON1;
GPIO_PORTF_DATA_R &= LED_ON2;
GPIO_PORTF_DATA_R |= LED_ON3;
Delay();
GPIO_PORTF_DATA_R &= LED_ON3;
GPIO_PORTF_DATA_R &= LED_ON1;
GPIO_PORTF_DATA_R |= LED_ON2;
Delay();
}
اکنون Launchpad TIVA را به لپ تاپ خود متصل کرده و کد را با استفاده از دکمه ساخته شده بسازید و سپس با استفاده از نماد بارگذاری آن را مطابق شکل زیر بارگذاری کنید. با این کار کد شما روی میکروکنترلر بارگذاری می شود و LED ها شروع به چشمک زدن می کنند
کد کامل LED چشمک زن Tiva LaunchPad
#define SYSCTL_RCGCGPIO_R (*(( volatile unsigned long *)0x400FE608 ) )
#define GPIO_PORTF_DATA_R (*(( volatile unsigned long *)0x40025038 ) )
#define GPIO_PORTF_DIR_R (*(( volatile unsigned long *)0x40025400 ) )
#define GPIO_PORTF_DEN_R (*(( volatile unsigned long *)0x4002551C ) )
#define GPIO_PORTF_CLK_EN 0x20
#define GPIO_PORTF_PIN1_EN 0x02
#define LED_ON1 0x02
#define GPIO_PORTF_PIN2_EN 0x04
#define LED_ON2 0x04
#define GPIO_PORTF_PIN3_EN 0x08
#define LED_ON3 0x08
#define DELAY_VALUE 1000000
unsigned long j=0;
void Delay(void){
for (j=0; j<DELAY_VALUE ; j++);
}
int main ( void )
{
volatile unsigned long ulLoop ;
SYSCTL_RCGCGPIO_R |= GPIO_PORTF_CLK_EN ;
ulLoop = SYSCTL_RCGCGPIO_R;
GPIO_PORTF_DIR_R |= GPIO_PORTF_PIN1_EN ;
GPIO_PORTF_DEN_R |= GPIO_PORTF_PIN1_EN ;
GPIO_PORTF_DIR_R |= GPIO_PORTF_PIN2_EN ;
GPIO_PORTF_DEN_R |= GPIO_PORTF_PIN2_EN ;
GPIO_PORTF_DIR_R |= GPIO_PORTF_PIN3_EN ;
GPIO_PORTF_DEN_R |= GPIO_PORTF_PIN3_EN ;
// Loop forever .
while (1)
{
GPIO_PORTF_DATA_R &= LED_ON3;
GPIO_PORTF_DATA_R &= LED_ON2;
GPIO_PORTF_DATA_R |= LED_ON1;
Delay();
GPIO_PORTF_DATA_R &= LED_ON1;
GPIO_PORTF_DATA_R &= LED_ON2;
GPIO_PORTF_DATA_R |= LED_ON3;
Delay();
GPIO_PORTF_DATA_R &= LED_ON3;
GPIO_PORTF_DATA_R &= LED_ON1;
GPIO_PORTF_DATA_R |= LED_ON2;
Delay();
}
}
کد بالا را کپی کنید و پروژه جدید را در Keil ایجاد کنید. پس از آن، تیوا لانپد را به رایانه خود متصل کنید. به طور خودکار درایورهای این توسعه را نصب می کند. اما درایوها را به صورت خودکار نصب نمی کند، می توانید درایور را از این لینک دانلود کنید.