سلام دوستان به امید خدا به واسطه سیسوگ سعی داریم به آموزش کاربردی میکروکنترلر های سری STM32 داری هسته پردازنده ARM ؛ در محیط نرم افزارهای CubeMx و keil بپردازیم.
ابتدا باید بیان کنم که، وقتی من بعد از مدتی برای انجام یک سری پروژه نسبتاً سنگین و پیچیده از میکروهای STM32 خصوصاً خانواده های CORTEXM0 , M3 و محیط CUBEMX استفاده کردم ، توانستم تجربیات تقریباً زیادی در چگونگی کار کردن با ادوات مختلف این میکروکنترلر ها و چگونگی برنامه نویسی با استفاده از کتابخانه HAL بدون اینکه برنامه بعد از مدتی هنگ کند بدست بیاورم. لازم دیدم این تجربیات را از طریق سیسوگ در اختیار علاقمندان الکترونیک قرار دهم.
یکی از دلایلی که ما سعی میکنیم تأکید زیادی روی سری Cortex-M3 و Cortex-M0 داشته باشیم این هست که وقتی شما دوستان وارد بازار کار تولید مدارات میکروکنترولر ی میشوید قیمت قطعات اولویت ها را تعیین میکند، به عنوان مثال میکروکنترلر STM32F030F4P6 را با حدود قیمت 3000 تومان (در هنگام نگارش این مقاله) و میکروکنترلر STM32F030C8T6 را با قیمت حدود 5000 تومان(در هنگام نگارش این مقاله) و همچنین میکرو STM32F103C8T6 را با قیمت حدود 7000 تومان(در هنگام نگارش این مقاله) می توانید تهیه کنید؛ چنین قیمت های برای یک پردازنده قدرتمند 32 بیتی ARM واقعا اقتصادی است که البته خیلی به نسبت میکروکنترلرهای 8 بیتی 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 یا همان کلاک سریع داخلی با فرکانس 8 مگاهرتز تنظیم شده است ما در این پروژه میخواهیم از کریستال خارجی استفاده کنیم بنابراین طبق تصویر زیر گزینه 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 ببریم و کدنویسی در این محیط را آموزش دهیم. با سیسوگ همراه باشید.
عالی بود
سلام
در رابطه با Maximum output speed نکته عملی یا تجربه ای دارید که ذکر کنید؟ من داخل اینترنت اینو پیدا کردم:
–
If you select GPIO pin as low speed, that is if the speed register is 00, then the maximum achievable switching frequency of that GPIO pin will be 8MHz. For medium speed, then the maximum frequency is up to 50MHz. For maximum high-speed frequency up to 100MHz. For very high-speed maximum switching frequency up to 180Mhz.
By increasing the GPIO speed, you increase the rate of change of the output voltage (reducing rise time). However, power consumption and noise radiated by the circuit increases along with the GPIO speed. By default, you should keep GPIO speed low unless there is a specific reason for increasing it.
سلام محمدرضا. این اطلاعات در دیتاشیت قطعه ذکر شده و قابل تنظیم هم هست.
با سلام من میخوام یه مبدل آنالوگ به دیجیتال رو برنامه نویسی کنم با میکرو کنترلرstm32f407vgt6 ولی سرعت خواندن پایین است در واقع سنسور لغزشی میباشد که به کند خوانده میشود اگه بتونید راهنمایی کنید که من بتونم با حداکثر سرعت بخونم ممنون میشم
سلام دوست عزیز
فکر میکنم منظورتون از کند بودن اینه که سرعت نمونه گیری پایین است.
خوب بذارید اول چند تا سوال از شما بپرسم – چطور از adc استفاده می کنید ؟ (چطور و با چه کدی نمونه ها رو میخونید)
دوم این که چه سرعت نمونه برداری ای مد نظر شماست ؟
سلام
ضمن تشکر از زحمات شما و آموزش های خوبتون
می خواستم بپرسم چه جوری میکرو STM32 را قفل کنیم!
برای این کار دو راه وجود داره
اول این که با استفاده از پروگرامر سکتورهای برنامه رو غیر قابل خواندن کنید.
راه دوم هم همین امکان با برنامه نویسی وجود داره
با سلام خدمت شما بنده میخواستم arm رو تازه شروع کنم و زیاد هم با برنامه سی آشنایی ندارم(بیسیک کار میکردم)میخوام از سایت خوب شما جهت شروع و یادگیری استفاده کنم به نظرتون از کدام برد آموزشی stm32 تهیه کنم جهت استارت یادگیری.ممنون میشم منو راهنمایی کنید .
ببینید بردی خوبه که تمام io های میکروکنترلر رو در اختیارتون قرار بده هر بردی که چنین ویژگی رو داشته باشه اوکیه
حتی میتونید برد رو خودتون بسازید – ما pcb یه برد متن باز رو روی سایت قرار دادیم
دانلود رایگان PCB BluePill
با عرض سلام و تشکر از شروع این مبحث مهم و ارزشمند
بنده با استفاده از STM32CubeMX 5.3.0 و KEIL 5.27.1.0 سعی در ایجاد پروژه شما کردم.
در بخش Clock Configuration در زمان تنظین PLLMul به X9 با خطا مواجه میشوم. حداکثر ضریب ممکن X4 است که نهایت سرعت به 32 میرسد.
البته خاطرنشان میکنم که برنامه بدون اتصال هرگونه سخت افزار و صرفاً جهت آشنایی با محیط کار می باشد.
خودم پیداش کردم.
شرمنده که دیر به دیر جواب میدین.
متاسفم که مصدع اوقات شریفتون شدم.
سلام سیاوش نازنینم. خدمت شما عرض کنم که یکی از دوستان کامنت شما را تایید کردند ولی متاسفانه فراموش کردند که خودشان پاسخ بدهند یا به بقیه دوستان بسپارد که پاسخ بدهند. به هر حال اگر تیم سیسوگ باعث تکدر خاطر جنابعالی شده است عذر ما را پذیرا باشید.
ضمنا اگر درست متوجه شده باشم فکر کنم مشکلتان به این موضوع بر میگردد که ضرائب را جوری تنظیم کردید که کلاک بخشی از میکرو از حداکثر کلاک مجاز، تجاوز کرده است.
سلام اموزشstm32.f1 میشه ورژن بزنامه های استفاده شده رو بگین برای من همkeilهم cubemx محیطش خ متفاوت هست
سلام دوست عزیز
از ورژن STM32CubeMX 4.26.0 استفاده شده.
موفق باشید.
سلام
من کتابخانه nrf24l01 دارم البته با کدویژن
خواستم اون رو تبدیل به stm کنم که بلد نیستم
چند روزه دنبال یه کتابخانه برای stm32f0 می گردم ولی من سوادم قد نمیده
شما یه کتابخانه در این زمینه دارید؟؟؟
سلام دوست عزیز میتونید از کتابخانه زیر استفاده کنید که برای stm32 نوشته شده است والبته با استفاده از توابع hal
https://github.com/r2aiv/NRF24L01-1
با تشکر از اینکه حوصله به خرج می دید و جواب می دید
من یه مشکلی توی کار با پروگرامر دارم. سری stm32f100 که به st-link وصل می کنم، یکی دو بار وصل میشه، بعد دیگه پروگرامر آی سی رو پیدا نمی کنه!
8 تا آی سی هم حیف کردم
این مشکل رو با stm32f051 ندارم
ممنون می شم راهنمایی کنید
چه پایه هایی از میکروکنترلر رو به پروگرامر متصل میکنید ؟ آیا پایه Reset رو هم متصل میکنید ؟
از طریق swd پروگرام کردم
بعد از قفل شدن پایه ریست هم وصل کردم فایده نکرد
ممکنه به خاطر فعال نکردن دیباگ توی cubemx باشه؟
ببینید توی STM چند مرحله قفل وجود داره ؛ ولی همه اونا با اتصال پایه ریست و انتخاب حالت Connect Under Reset میتونید میکرو رو پاک کنید و از حالت قفل خارج کنید.
از اون میتونه باشه ولی در نهایت با Erase میکرو این مشکل رو برطرف کنید.
سلام. میخواستم کتابهایی ( انگلیسی یا فارسی ) در زمینه آموزش stm32 با hal بهم معرفی کنید.
ممنون
امم والا بهترین مرجعی که من الان میشناسم یوزمنوال های خود شرکت ST هست که به خوبی توضیح داده.
درود
لطفا در مورد میکروی stm32f373 هم آموزش بذارید. چون آموزش فارسی نداره
سلام دوست عزیز
شماره های مختلف میکروکنترلرهای STM32 هماهنگ هستند و این سری آموزش ها را میتونید برای هر شماره میکروکنترلری که مورد نظرتون هست استفاده کنین.
موفق باشید.
سلام
میخام کار با STM رو شروع کنم و فقط از لینوکس استفاده میکنم
میشه بگید از چه پروگرامر و کامپایلری استفاده کنم؟
سلام
خوب لینوکس که حرف نداره ؛ من از GCC استفاده میکنم و فکر میکنم بهترین گزینه موجود حتی توی ویندوزم همون GCC باشه ؛ و برای پروگرامر هم میتونید از OpenOCD استفاده کنید که تقریبا تمام پروگرامرهای موجود رو پشتیبانی میکنه
البته هم ST و j-Link نرم افزار تحت لینوکس هم دارند.
ویرابشگر هم که Eclipse علیه سلام بهترین انتخابه 🙂
سلام برای برنامه نویسی stm باید از نرم افزار cube استفاده کنیم یا keil ؟
سلام دوست عزیز
در واقع نرمافزار CubeMX ابزار کمکی ای هست که میتونین به راحتی پایههای GPIO و دیگر تنظیمات مثل وقفه و … را به راحتی و بدون نوشتن برنامه تنظیم کنید و سپس این تنظیمات را به نرمافزار Keil انتقال بدین ولی استفاده از این نرمافزار ضرورتی نداره بلکه فقط روال برنامهنویسی را راحتتر میکنه. برنامه اصلی در نرمافزار Keil نوشته میشه و میتونین بدون استفاده از CubeMX تمام تنظیمات را به صورت دستی کدنویسی کنید.
مرسی از مطالب خوبتون
خواهش میکنم دوست عزیز
سلام بسیار عالی و کامل توضیح دادید، مرسی بخاطر این دوره اموزشی??
سلام
خواهش میکنم. خوشحالیم که مورد توجه قرار گرفته
عالی… من مدتی روی میکرو های LPC وقت گذاشتم ولی متاسفانه تنوع خیلی کمی داره و قیمت بالایی دارند.. بعد از اون با stm آشنا شدم که هم تنوع بسیاری بالایی داره و هم قیمت بسیار مناسبی داره.
تازه دارم stm را شروع میکنم و فکر میکنم آموزش ها شما به من خیلی کمک کنه..
متشکر
سلام دوست عزیز ، تمام سعی ما ایجاد بستر مناسب برای یادگیری الکترونیک به صورت رایگان و متن باز هست و همراهی دوستان در این مسیر باعث خوشحالی و دلگرمی ما است
بسیار عالی – البته میکروکنترلر های NXP واقعا عالی هستند ولی بله به دلیل عدم استقبال و البته قیمت بالاتر نسبت به st با استقبال کاربر های ایرانی قرار نگرفته
سلام
من نمیدونم چرا هر کس که این آموزش رو شروع میکنه بعدش دیگه ادامه نمیده !!!!
همین مباحث ساده رو میگن بعد از 3-4 جلسه دیگه ادامه نمیدن !!
سایت های این چنینی زیاده !!
امیدوارم سایت شما اینجوری نباشه …. و مباحث مهمتری هم آموزش بده مثل ADC و اترنت و …
ممنون از سایت خوب و باحال و جذاب سیسوگ
و ممنون از اساتید گرامی
سلام و درود دوست عزیز
فعلا 6 قسمت از این مقالات آماده شده که به تدریج منتشر خواهیم کرد.
سلام بی صبرانه منتظر اموزش میکروکنترلرهای stm8 و stm32 هستیم ..
در رابطه با برنامه نویسی برای میکرو کنترلرها بااستفاده از gcc/gnu هم اموزشی ترتیب بدید ممنون میشم ..
امیدوارم همینجور پرقدرت ادامه بدید
سعی میکنیم هر روز یک مطلب در خصوص این آموزش ها منتشر کنیم
این بحث رو حتما در دستور کار قرار میدهیم که با استفاده از ابزار متن باز Gcc آموزش قرار دهیم.
انشالله
بسیار عالی
در انتظار قسمت های دیگر
متشکر دوست عزیز
انشالله ، منتظر قسمت های هیجان انگیز دیگه باشید 🙂