آموزش میکروکنترلر stm8 جلسه اول-کار با GPIO
میکروکنترلر های STM8 یکی از محصولات شرکت ST می باشد. این میکروکنترلر ها دارای پردازنده از نوع 8 بیتی هستند و دارای امکانات جانبی مانند تایمر ها ، شمارنده ها ، واحد ADC ، واحد مقایسه گر آنالوگ ، واحد های عمومی ورودی و خروجی و وقفه های خارجی زیاد و غیره می باشند. این میکروکنترلر ها نسبت به نویز از مصونیت بالایی برخوردار می باشند و به همین دلیل برای کاربردهای صنعتی مناسب می باشند. یکی دیگر از مزیت های این میکروکنترلر ها نسبت به رقیبان خود مانند AVR و PIC قیمت ارزان تر و داشتن امکانات جانبی بیشتر می باشد.
یکی از کامپایلر های مطرح برنامه نویسی برای میکروکنترلر های STM8 کامپایلر IAR می باشد. این کامپایلر برای هر سری از میکروکنترلرها IDE مخصوص به خود را دارد بنابراین برای STM8 باید نسخه مربوط به این سری را دریافت کنید. در این جلسه قصد دارم تا کار با واحد های عمومی ورودی و خروجی را توضیح دهم.در ابتدا شما باید یک عدد پروگرامر برای برنامه ریزی این میکروکنترلر ها تهیه کنید که در زیر دونمونه عکس قرار داده شده است.
پروگرامر STM8
بعد از تهیه پروگرامر شما باید یه عدد هدر برد نیز برای کار داشته باشید که می تونید یا این هدر برد رو از فروشگاه های برق و الکترونیک تهیه کنید و یا خودتون بسازید. در زیر نمایی از یک عدد هدربرد میکروکنترلر STM8 رو می بینید.
هدربرد STM8
در این قسمت در مورد رجیسترهای مورد استفاده برای خروجی کردن پایه ها رو توضیح خواهم داد. در زیر یک نمونه کد برای خروجی کردن پایه ها آورده شده است.
1 2 3 4 |
PD_ODR = 0; //Turn off all pins PD_DDR_DDR3 = 1; //PortD, Bit 3 is output (PD3 - Data Direction Register) PD_CR1_C13 = 1; //PortD, Control Register 1, Bit 3 (PD3) set to Push-Pull PD_CR2_C23 = 1; //PortD, Control Register 2, Bit 3 (PD3) set to Push-Pull |
با استفاده از رجیستر PX_DDR می توانیم یک پایه را به صورت ورودی و خروجی تنظیم کنیم. با نوشتن یک در این رجیستر پایه به صورت خروجی و با نوشتن صفر پایه به صورت ورودی تنظیم خواهد شد.در رجیستر اشاره شده به جای مقدار X باید اسم پورت مورد نظر خود را قرار دهیم.در زیر نمای رجیستر آورده شده است.
با استفاده از رجیستر PX_ODR پایه ای که به صورت خروجی تنظیم شده است را می توانیم صفر و یک کنیم. با نوشتن مقدار یک در خروجی مثبت 5 ولت را خواهیم داشت و با نوشتن صفر خروجی به GND متصل می شود و یا همان منفی 5 ولت را خواهیم داشت.در زیر نمای این رجیستر را می بینید.
با استفاده از رجیستر PX_CR1 می توانیم دو حالت برای تنظیم داشته باشیم. در حالت اول اگر پایه به عنوان ورودی تعریف شده باشد با نوشتن مقدار یک در این رجیستر یک مقاومت به صورت داخلی به ولتاژ مثبت 5 ولت وصل می شود که به آن مقاومت پول آپ نیز می گویند و اگر مقدار صفر در این رجیستر نوشته شود خروجی به صورت شناور می شود به این معنی که صفر بودن و یا یک بودن آن مشخص نیست و شما باید از خارج با یک مقاومت صفر و یک بودن ورودی را معین کنید.
در حالت دوم اگر پایه به صورت خروجی تنظیم شده باشد با نوشتن مقدار یک در این رجیستر نوع خروجی به صورت push pull خواهد شد که در این حالت مقدار صفر و یک را روی پایه خواهیم داشت و با نوشتن مقدار صفر در آن نوع خروجی به صورت شبه اپن درین خواهد شد که در این حالت تنها مقدار صفر را در خروجی خواهیم داشت. در زیر نمای رجیستر آورده شده است.
با استفاده از رجیستر PX_CR2 می توانیم دو حالت تنظیم را داشته باشیم. در حالت اول اگر ایه به عنوان ورودی تعریف شده باشد با نوشتن مقدار یک در این رجیستر وقفه خارجی روی پایه مورد نظر فعال خواهد شد و با نوشتن مقدار یک در این رجیستر وقفه مورد نظر غیر فعال خواهد شد. در حالت دوم اگر پایه به صورت خروجی تنظیم شده باشد با نوشتن مقدار یک در این رجیستر سرعت پایه روی 10 مگاهرتز تنظیم و با نوشتن مقدار صفر سرعت پایه روی 2 مگاهرتز تنظیم خواهد شد.در زیر نمای این رجیستر را می بینید.
در بیشتر برنامه ها ما نیاز به تاخیر برای انجام کد ها داریم در زیر کدی ساده برای ایجاد تاخیر در برنامه آورده شده است.
1 2 3 4 |
void delay(unsigned int n) { while (n-- > 0); } |
در زیر کدی برای کار با واحد ورودی و خروجی آورده شده است. در این قطعه کد یک LCD با یک فاصله زمانی به صورت مداوم چشمک می زند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <iostm8s003f3.h> void delay(unsigned int n) { while (n-- > 0); } //main entry point int main( void ) { PD_ODR = 0; //Turn off all pins PD_DDR_DDR3 = 1; //PortD, Bit 3 is output (PD3 - Data Direction Register) PD_CR1_C13 = 1; //PortD, Control Register 1, Bit 3 (PD3) set to Push-Pull PD_CR2_C23 = 1; //PortD, Control Register 2, Bit 3 (PD3) set to Push-Pull while (1) { //Turn on and off the output and then delay PD_ODR_bit.ODR3 = !PD_ODR_bit.ODR3; delay(30000); } } |