سلام دوستان. سعی داریم به آموزش کاربردی میکروکنترلرهای سری STM32 دارای هسته پردازنده ARM در محیط نرمافزارهای CubeMx و keil بپردازیم. ابتدا باید بیانکنم که، وقتی من بعداز مدتی برای انجام یک سری پروژه نسبتاً سنگین و پیچیده از میکروهای STM32 خصوصاً خانواده های CORTEXM0 , M3 و محیط CUBEMX استفادهکردم، توانستم تجربیات تقریباً زیادی در چگونگی کارکردن با ادوات مختلف این میکروکنترلرها و چگونگی برنامهنویسی بااستفادهاز کتابخانه HAL بدوناینکه برنامه بعداز مدتی هنگکند بدست بیاورم. لازم دیدم این تجربیات را دراختیار علاقمندان الکترونیک قراردهم.
یکیاز دلایلی که ما سعی میکنیم تأکید زیادی روی سری Cortex-M3 و Cortex-M0 داشتهباشیم این هست که وقتی شما دوستان، وارد بازارکار تولید مدارات میکروکنترولری میشوید قیمت قطعات اولویتها را تعیین میکند، بهعنوان مثال میکروکنترلر STM32F030F4P6 را با حدود قیمت ۳۳۰۰۰تومان (درهنگام نگارش این مقاله) و میکروکنترلر STM32F030C8T6 را با قیمت حدود ۱۰۴۰۰۰ تومان(درهنگام نگارش این مقاله) و همچنین میکرو STM32F103C8T6 را با قیمت حدود ۵۷۰۰۰ تومان(درهنگام نگارش این مقاله) میتوانید تهیه کنید؛ چنین قیمت های برای یک پردازنده قدرتمند ۳۲بیتی ARM واقعا اقتصادی است که البته خیلی به نسبت میکروکنترلرهای ۸بیتی AVR و PIC مناسبتر بشمار میآیند. البته این نکته ناگفته نماند که آموزش بعضی قسمتها تنها به خانواده Ccortex-M4 بهبالا اختصاص خواهد داشت. معمولا پردازندههای ARM، از توان مصرفی پایینی برخوردار هستند که آنها را بسیار پرکاربرد کردهاست مخصوصا در دستگاههای همراه. اغلب گوشیهای موبایل امروزه از پردازنده ARM استفاده میکنند، معمولا پردازنده ARM بهصورت هسته ارائه میشود و شرکتهای تولیدکننده Chip آنها را بهصورت پردازنده و میکروکنترلر ارائه میکنند، شرکت ST نیز از این قائده جدا نیست دست به تولید میکروکنترلرهای بسیار اقتصادی با هسته ARM کردهاست. در این سری از آموزشها سعی میکنیم تاجاییکه ممکناست از دستورات کتابخانه HAL ، برای بالارفتن کیفیت کد(سرعت اجرا و حجم مورداستفاده) استفاده نکنیم و همچنین با نقطه ضعفهای این کتابخانه و طریقه برطرفکردن آن آشنا شویم.در کنار آن شیوه برنامهنویسی بهینه را آموزشدهیم همچنین تلاش میکنیم تا آنجاکه امکاندارد تمام قسمتهای cubemx و میکروکنترلر را آموزش دهیم بدینمنظور، از قسمتهای ساده مثل GPIO و وقفه خارجی شروع میکنیم تا آموزشهای رابطهای سریال مثل UART و I2C و SPI و بخصوص قسمتهای پیشرفتهتر مثل رابط سریال CAN و رابط USB در مدهای مختلف و البته مقداری هم آموزش ارتباط رابط USB بخصوص در مد HID با نرمافزار ویژوال استودیو. همچنین در ادامه رابط اترنت و قسمتهای مختلف تایمرها و کار با مبدل آنالوگ به دیجیتال و دیجیتال به آنالوگ و کار با حافظههای جانبی و خیلی قسمتهای دیگر میکروکنترولر را توضیح میدهیم. برای کاملترشدن آموزش به بررسی سیستم عامل FreeRtos و چگونگی راهاندازی آن از طریق نرمافزار cubemx خواهیم پرداخت. فقط توجهداشتهباشید که خیلیاز قسمتهای میکروکنترلر مثل رابطهای سریال مدهای مختلفی برای راهاندازی دارند که آموزش آنها را طولانی میکند و ممکناست تمام جزئیات یک قسمت از میکرو را نتوان در یکسری آموزشی ارائهکرد که بهمرور در قسمتهای جداگانه به آنها خواهیم برداخت. نکتهمهم اینکه ممکناست خیلی نکتهها درمورد برنامهنویسی و تنظیمات در آموزشها ذکر شود که بدلیل جلوگیری از اتلاف وقت در آموزشهای بعد بیان نگردد بههمین علت لازماست گامبهگام همراه با ما آموزش ها را دنبال کنید.
شروع آموزش میکروکنترلر STM32 و GPIO
آموزش را با رابط GPIO شروع میکنیم. در این آموزش تصمیمداریم از میکروکنترلر STM32 F 103C8T6 استفادهکنیم. ازآنجاکه سریهای Cortex-M0 , Cortex-M3 مشابه هستند آنها را بهصورت جداگانه بررسی نمیکنیم. طبق تصویر زیر نرمافزار CubeMX را باز میکنیم و سپس گزینه NEW PROJECT را انتخاب میکنیم و سپس از آن لیست میکروکنترلر موردنظرمان را انتخاب میکنیم:
بعد از انتخاب میکروکنترلر صفحه زیر به نمایش در میآید:
که قسمت سمتچپ “محل انتخاب و ویرایش پرفالهای میکروکنترلر” و سمت راست “محل ویرایش و انتخاب عملکرد پایههای میکروکنترلر” است. اولین کاری که باید انجامدهیم مشخصکردن کلاک STM32 است. در زبانه Pinout گزینه RCC را انتخاب میکنیم توجهداشتهباشید در حالتعادی تنظیمات کلاک میکروکنترلر روی گزینه HSI یا همان کلاک سریع داخلی با فرکانس ۸مگاهرتز تنظیمشدهاست ما در این٬پروژه میخواهیم از کریستال خارجی استفادهکنیم بنابراین طبق تصویرزیر گزینه Crystal را انتخاب میکنیم:
حال به صفحه Clock Configuration میرویم تا توسط ضرب و تقسیم کنندهها (واحد PLL) فرکانس را روی حداکثر فرکانس این میکروکنترلر یعنی 72 مگاهرتز قراردهیم.
Input Frequeny: محل انتخاب فرکانس کریستال خارجی HSE
انتخاب کلاک سریع خارجی PLLCLK: انتخاب خروجی ضربکننده حال دوباره به صفحه Pinout برمیگردیم و نوع پروگرامر و دیباگر را تنظیم میکنیم و همچنین تأخیر مورداستفاده در برنامه را دقیقا طبق عکسزیر تنظیم میکنیم:
حال پین A9 میکرو را طبق عکسزیر به خروجی تبدیل میکنیم:
با کلیلک راست روی پین، طبق عکسهای زیر نام مستعار LED را برای آن انتخاب میکنیم:
و در ادامه پین A15 را هم به عنوان ورودی تعریف میکنیم و برای آن نام مستعار BUTTON را انتخاب میکنیم:
چطور می توانیم پایه ورودی پول آپ یا پول دان کنیم؟
برای اینکار باید به صفحه Configuration برویم و گزینه GPIO را طبق عکسزیر انتخابکنیم تا صفحه مربوطبه تنظیمات آن بازشود:
GPIO Pull-up/Pull-down: محل انتخاب مقاومت داخلی پولآپ یا پولدان برای پین ورودی همانطورکه درتصویر میبینید در این صفحه جزئیات همه پینهای مورداستفاده اعم از ورودی و خروجی قابل ویرایش است ما دراینجا پایه موردنظر را انتخاب میکنیم و طبق تصویربالا تنظیمات را روی آن اعمال میکنیم حال برای تنظیم مشخصات پین خروجی هم بمانند عکس زیر آن را انتخاب میکنیم و گزینه موردنظر را انتخاب و ویرایش میکنیم:
- GPIO output level: سطح صفر یا یک بودن خروجی در هنگام پیکرهبندی اولیه
- GPIO mode: پوشپول و یا اپن کلکتوربودن پایه خروجی
- Maximum output speed: حداکثر سرعت این پین
- برچسب این پین
درنهایت به صفحه Pinout برمیگردیم، حالا باید تنظیمات پایههای میکرو را بهشکلزیر داشتهباشیم. در این مرحله پروژه خود را ذخیره میکنیم:
تا اینجا تنظیمات GPIO پروژه خود را انجام دادیم درقسمتبعدی آموزش STM32 قصد داریم پروژه خود را به محیط نرمافزاری Keil ببریم و کدنویسی در این محیط را آموزشدهیم.
با ما همراه باشید.
منبع: سیسوگ