در این مقاله با ساختار، رجیسترها و مفاهیم مرتبط با پریفرال GPIO میکروکنترلر های STM32F1 آشنا میشید.
فهرست
– دیودهای محافظت در پریفرال GPIO
– درایور خروجی : Push-Pull و Open-Drain
– Floating و مقاومت های Pull up و Pull down
– اشمیت تریگر در درایور ورودی پریفرال GPIO
معرفی پریفرال GPIO
پریفرال های GPIO یا General Purpose Input Output مثل سایر پریفرال ها یک مدار الکترونیکی هست که بوسیله ی اعدادی که در خونه های حافظه ی مربوط به این مدار الکترونیکی یعنی رجیستر های این پریفرال مینویسیم عملکردش رو تنظیم میکنیم. هر پریفرال GPIO مسئولیت کنترل تا 16 تا پین میکروکنترلر رو به عهده داره. برای تنظیم پین ها در حالت ورودی یا خروجی ، مشخص کردن وضعیت پین خروجی یا اطلاع از وضعیت پین ورودی از پریفرال های GPIO استفاده میکنیم. در میکروکنترلر 48 پینی STM32F103C8 چهار تا پریفرال GPIO داریم، GPIOA ، GPIOB ، GPIOC و GPIOD . به پریفرال های GPIO پورت هم میگن مثلا در این میکروکنترلر چهار تا پورت داریم: Port A ، Port B ، Port C و Port D .
با استفاده از پریفرال GPIO میتونیم هر یک از پین ها رو در یکی از 16 حالت های کاری زیر تنظیم کنیم.
-
- ورودی floating
-
- ورودی آنالوگ
-
- ورودی Pull up
-
- ورودی Pull down
-
- خروجی General purpose Push-Pull با ماکزیمم سرعت 2MHz یا 10MHz یا 50MHz
-
- خروجی General purpose Open-drain با ماکزیمم سرعت 2MHz یا 10MHz یا 50MHz
-
- خروجی Alternate function Open-drain با ماکزیمم سرعت 2MHz یا 10MHz یا 50MHz
- خروجی Alternate function Push-Pull با ماکزیمم سرعت 2MHz یا 10MHz یا 50MHz
ساختار هر پین
ساختاری که در شکل زیر میبینید پشت تمام پین های میکروکنترلر که جزئی از یک پورت هستند وجود داره. مثلا در میکروکنترلر STM32F103C8 که 48 پین داره ، این ساختار پشت 37 تا پین وجود داره. اگر پین در حالت ورودی تنظیم بشه از درایور ورودی استفاده میشه. درایور ورودی سه تا خروجی داره، پین ممکنه یک ورودی آنالوگ ، Alternate function یا general purpose باشه. alternate function یعنی این یک ورودی یا خروجی دیجیتال هست و یکی از پریفرال های میکروکنترلر قراره از این پین استفاده کنه. general purpose هم یعنی یک ورودی یا خروجی دیجیتال معمولی. وقتی ورودی دیجیتال معمولی داریم، وضعیت پین ورودی در input data register پریفرال GPIO مربوطه نوشته میشه.
درایور خروجی هم دو تا ورودی داره، اگر Alternate function باشه یعنی کنترل پین که در حالت خروجی نتظیم شده به عهده ی یکی از پریفرال های میکروکنترلر هست. اگر خروجی general purpose باشه یعنی وضعیت پین خروجی رو با استفاده از Output data register پریفرال GPIO مشخص میکنیم.
دیودهای محافظت در پریفرال GPIO
همونطور که در بلوک دیاگرام پریفرال GPIO میبینید، پشت هر پین دو دیود وجود داره که یکی زمین رو به پین میکروکنترلر و دیگری پین میکروکنترلر رو به VDD متصل میکنه. وظیفه ی این دیود ها اینه که اجازه ندن ولتاژ روی پین میکروکنترلر از VDD+0.7 ولت بیشتر بشه یا از GND-0.7 ولت کمتر بشه. اسم این دیود ها ، Protection diode یا دیود محافظت هست و در ادامه با نحوه ی عملکرد اونها آشنا میشید.
بایاس مستقیم و بایاس معکوس دیود
در مورد دیود ایده آل اگر ولتاژ پایه ی آند از ولتاژ کاتد 0.7 ولت بیشتر باشه، دیود در حالت کاری بایاس مستقیم هست و مثل اتصال کوتاه عمل میکنه. اگر ولتاژ آند از ولتاژ کاتد بعلاوه 0.7 کمتر باشه ، دیود در حالت بایاس معکوس هست و مثل مدار باز عمل میکنه.
نحوه ی عملکرد دیود های محافظت
اگر ولتاژ روی پین میکروکنترلر از VDD+0.7 ولت بیشتر باشه، دیود بالایی در حالت بایاس مستقیم قرار میگیره و اتصال کوتاه میشه و پین میکروکنترلر رو به 3.3v متصل میکنه و اجازه نمیده که ولتاژ روی پین از VDD+0.7 ولت بیشتر بشه.
اگر ولتاژ روی پین میکروکنترلر از VSS-0.7 ولت کمتر باشه، دیود پایینی در حالت بایاس مستقیم قرار میگیره و اتصال کوتاه میشه و پین میکروکنترلر رو به زمین متصل میکنه و اجازه نمیده که ولتاژ روی پین از VSS-0.7 ولت کمتر بشه.
اگر ولتاژ روی پین میکروکنترلر بین GND و VDD باشه ، هر دو دیود در حالت بایاس معکوس هستند و مثل مدار باز رفتار میکنند.
درایور خروجی : Push-Pull و Open-Drain
پین خروجی میکروکنترلر میتونه در حالت Push-pull یا Open-drain تنظیم بشه، در ادامه این دو حالت رو بررسی میکنیم.
خروجی Open-drain
در حالت کاری Open-drain ( مشابه Open collector ) برای درایو کردن خروجی فقط از یک NMOS استفاده میشه که Drain این ماسفت که همون پین خروجی میکروکنترلر هست به جایی وصل نیست. با استفاده از NMOS فقط میشه پین خروجی رو به زمین وصل کرد و میکروکنترلر فقط میتونه جریان رو sink کنه. این حالت کاری مشابه یک سوئیچ ساده است که فقط میتونه پین میکروکنترلر رو به زمین متصل کنه.
خروجی Push-pull
برای درایو کردن خروجی Push-pull از یک NMOS و یک PMOS استفاده میشه، مثل یک سوئیچ SPDT عمل میکنه و میتونه پین میکروکنترلر رو هم به زمین و هم به VDD متصل کنه.
در حالت Pull phase ماسفت NMOS فعاله ، پین خروجی میکروکنترلر به زمین متصله و جریان رو Sink میکنه. Pull یعنی کشیدن ، در حالت Pull phase جریان به سمت پین میکرو کشیده میشه و جهت جریان به سمت پین میکروکنترلر هست.
در حالت Push phase ماسفت PMOS فعاله، پین خروجی میکروکنترلر به VDD متصله و پین میکرو جریان رو Source میکنه. Push یعنی هول دادن، در حالت Push phase جریان از پین میکرو به بیرون هول داده میشه و جهت جریان به سمت خارج میکروکنترلر هست.
Floating و مقاومت های Pull up و Pull down
در درایور ورودی یک مقاومت Pull up و یک مقاومت Pull down وجود داره و میتونیم پین میکروکنترلر که در حالت ورودی تنظیم شده رو Pull up یا Pull down کنیم. در ادامه کاربرد این مقاومت ها رو بررسی میکنیم.
پین float
یک پین میکروکنترلر که در حالت ورودی تنظیم شده و با یک دکمه به زمین متصل میشه رو در نظر بگیرید. قبل از اینکه دکمه فشرده بشه، پین میکروکنترلر به جایی وصل نیست و ولتاژ روی پین مشخص نیست و شناور هست. در این حالت میگیم پین میکروکنترلر Float یا high impedance هست. اگه در حالتی که پین float هست وظعیت پین ورودی رو از رجیسترهای پریفرال GPIO بخونیم ممکنه این پین یک یا صفر باشه. برای اینکه حالت float رو از بین ببریم از مقاومت های Pull up و Pull down استفاده میکنیم.
مقاومت های Pull up و Pull down
اگر با وصل شدن کلید پین ورودی میکروکنترلر به VDD متصل میشه، یعنی در حالتی که کلید قطعه پین میکرو باید زمین باشه. برای زمین کردن پین میکروکنترلر در حالت قطع کلید، پین رو با یک مقاومت به زمین متصل میکنیم. به این مقاومت میگن مقاومت Pull down .
اگر با وصل شدن کلید پین ورودی میکروکنترلر به GND متصل میشه، یعنی در حالتی که کلید قطعه پین میکرو باید VDD باشه. برای VDD کردن پین میکروکنترلر در حالت قطع کلید، پین رو با یک مقاومت به VDD متصل میکنیم. به این مقاومت میگن مقاومت Pull up .
مقدار مقاومت های Pull up و Pull down معمولا 10k یا 4.7k انتخاب میشه. در میکروکنترلر های STM32 این مقاومت ها در خود میکروکنترلر وجود دارند و میتونیم انتخاب کنیم که از اونها استفاده کنیم یا نه.
اشمیت تریگر در درایور ورودی پریفرال GPIO
در درایور ورودی پریفرال GPIO یک مدار اشمیت تریگر وجود داره. این مدار یک ورودی و یک خروجی داره. این مدار یک حد بالا و یک حد پایین برای ولتاژ ورودی در نظر میگره. اگر ولتاژ ورودی از حد پایین کمتر باشه، خروجی زمین میده و اگر ولتاژ ورودی از حد بالا بیشتر باشه، خروجی VDD میده. کاربرد این مدار برای نویز گیری از ولتاژ روی پین ورودی هست تا یک ورودی دیجیتال ایده آل داشته باشیم.
رجیسترهای پریفرال های GPIO
هر پریفرال GPIO 7 تا رجیستر 32 بیتی داره که برای کنترل تا 16 پین استفاده میشه.
رجیستر های CRL و CRH پریفرال GPIO
Port configuration register high و Port configuration register low یا رجیستر های CRL و CRH برای مشخص کردن تنظیم حالت کاری پین های استفاده میشن. رجیستر CRL برای تنظیم حالت کاری پین های 0 تا 7 و رجیستر CRH برای تنظیم حالت کاری پین های 8 تا 15 استفاده میشن. برای هر پین 4 بیت برای تنظیمات وجود داره. دو بیت به نام MODE و دو بیت به نام CNF . مثلا بیت های MODE4 و CNF4 برای تنظیم حالت کاری پین چهار هستند. با استفاده از بیت های MODE و CNF میشه هر پین رو در یکی از حالت های کاری زیر نتظیم کرد.
-
- ورودی floating
-
- ورودی آنالوگ
-
- ورودی Pull up
-
- ورودی Pull down
-
- خروجی General purpose Push-Pull با ماکزیمم سرعت 2MHz یا 10MHz یا 50MHz
-
- خروجی General purpose Open-drain با ماکزیمم سرعت 2MHz یا 10MHz یا 50MHz
-
- خروجی Alternate function Open-drain با ماکزیمم سرعت 2MHz یا 10MHz یا 50MHz
-
- خروجی Alternate function Push-Pull با ماکزیمم سرعت 2MHz یا 10MHz یا 50MHz
رجیستر IDR پریفرال GPIO
Input data register یا رجیستر IDR وضعیت پین هایی که در حالت ورودی نتظیم شدن رو نشون میده. بیت های این رجیستر فقط قابل خوندن هستند، به همین خاطر حرف r به معنای readable در بیت های این رجیستر نوشته شده. بیت IDR0 وضعیت پین 0 رو نشون میده و بیت IDR1 وضعیت پین 1 و بیت IDR15 وضعیت پین 15 . 16 تا بیت پر ارزش این رجیستر استفاده نمیشه.
رجیستر ODR پریفرال GPIO
Output data register یا رجیستر ODR برای مشخص کردن وضعیت پینی که در حالت خروجی تنظیم شده استفاده میشه. بیت های این رجیستر قابل خوندن و نوشتن هستند، به همین خاطر حروف rw در بیت ها نوشته شده. بیت ODR0 برای مشخص کردن وضعیت پین 0 و بیت ODR15 برای مشخص کردن وضعیت پین 15 هست. 16 بیت پرارزش این رجیستر هم استفاده نمیشه.
رجیستر BSRR پریفرال GPIO
Port bit set/reset register یا رجیستر BSRR کارش تغییر رجیستر ODR برای مشخص کردن وضعیت پین خروجی هست. بیت های این رجیستر فقط قابلیت نوشتن دارند و فقط هم باید عدد 1 رو در این بیت ها بنویسیم، 0 نوشتن در بیت های این رجیستر تاثیری نداره. بیت های BS0 تا BS15 برای یک کردن بیت ODR0 تا ODR15 هستند و بیت های BR0 تا BR15 برای reset کردن یا صفر کردن بیت های ODR0 تا ODR15 هستند.
رجیستر BRR پریفرال GPIO
Port bit reset register یا رجیستر BRR کارش صفر کردن بیت های رجیستر ODR هست. بیت های این رجیستر فقط قابلیت نوشتن دارند و فقط هم باید در این بیت ها یک بنویسیم، صفر نوشتن تاثیری نداره. بیت های BR0 تا BR15 برای صفر کردن بیت های ODR0 تا ODR15 رجیستر ODR استفاده میشن. وقتی در بیت های BR0 تا BR15 یک بنویسیم بیت مربوطه در رجیستر ODR صفر میشه.