STM32F1

آموزش میکروکنترلر STM32 قسمت دوم

دومین قسمت از آموزش STM32 توسط توابع HAL و نرم افزار CUBE MX

مباحثی که در این قسمت از آموزش میکروکنترلر STM32 بیان میشه به شرح زیر هستش:

  • اولین پروژه رو توسط نرم افزار کیوب تولید میکنیم.
  • با توابع RCC و GPIO آشنا میشیم.
  • با برد آموزشی کدنیک و قسمت های مختلف اون آشنا میشیم.
  • یاد می گیریم که چطور برد خودمون رو پروگرام کنیم.
  • در نهایت از این مبحث یه تمرین بهتون میدم که که امیدوارم اون رو انجام بدید و توی گروه تلگرامی کدنیک آپلود کنید تا در گروه به برسی اون بپردازیم.

1. ساخت اولین پروژه با CUBE MX

قراره اولین پروژه خودمون رو با نرم افزار CUBE MX  درست کنیم؛ من مرحله به مرحله از ساخت پروژه عکس میزارم و اون رو شرح میدم.
در ضمن باید بهتون بگم توضیحات کامل دادن در متن خیلی سخته امیدوارم متوجه بشید و از مطالب استفاده کنید.
قبل از شروع با ید بهتون بگم که آموزش نصب نرم افزار ها رو به همراه فایلشون در آینده نچندان دور براتون تو سایت میزارم. من از آخرین نسخه کیوب در این آموزش استفاده میکنم که در حال حاظر نسخه 5.6.0 هستش و شما هم با توجه به لینکی که براتون در قسمت اول گذاشتم میتونید از وبسایت خود شرکت ST دانلود و نصب کنید( نصب کیوب کار خاصی نداره و به راحتی میتونید انجام بدید)

2.1

وقتی نرم افزار کیوب رو باز میکنید با صفحه رو به  رو مواجه میشید، برای ساخت پروژه باید از منو به ترتیب File>New Project رو باز کنید یا با کلید شورت کات Ctrl + N میتونید شروع کنید به ساخت اولین پروژه خودتون. بعد از کلیک کردن روی New Project معمولا چون ST خیلی سریع به سریع کتابخونه ها رو بروز رسانی میکنه (احتمالش هست که تعدادی فایل رو دانلود کنه که اگه شما به اینترنت دسترسی داشته باشید بهتره)

2.2

در مرحله بعد با عکس بالا رو به رو میشید که با توجه به شماره های توی عکس بهتون توضیح میدم که باید چه کاری انجام بدید و من چیکار کردم.

  1. در بخش Part Number Search شما باید نوع میکرویی که قراره باهاش کار کنید رو وارد کنید. برای مثال میکرویی که روی برد من قرار داره STM32F103RB هستش.
  2. میکروکنترلر STM32F103RB در دو تیپ TFBGA64 و LQFP64 موجود است که میتوانید با کلیک بر روی موارد موجود در لیست شماره 3 با توجه نوع میکرو، خودتون اون رو انتخاب کنید.
  3. راه دیگری هم برای پیدا کردن میکروی مورد نظرتون هست اون هم اینه که شما با نگه داشتن موس روی هرکدام از موارد لیست با توجه به شکل شماره 3 نوع میکرو براتون ظاهر میشه که من با توجه به برد خودم STM32F103RBT رو انتخاب کردم.

با دوبار کلیک کردن روی میکروی مورد نظرتون یا از بخش بالا کلیک بر روی دکمه آبی رنگ Start Project شما وارد پنل زیر میشید.

2.3

در این قسمت شما فقط خود میکرو و لیست سمت چپش رو میبینید که من بهتون با توجه به شماره های روی تصویر توضیح میدم باید چه کار هایی انجام بدید.
ابتد در لیست سمت چپ بر روی System Core تا لیست آن باش شده و بر روی SYS که با شماره 1 نشان داده شده کلیک کنید تا در سمت راست لیست بخش Mode برای شما باز شود. سپس در بخش Debug نحوه دیباگ خودتون رو با توجه به پروگرامر خودتون انتخاب کنید (من از STLINK استفاده میکنم و به صورت سریال این کار رو انجام میدم بنابراین من این گزینه رو بر روی Seriar Wire قرار دادم. با توجه به انتخاب شما پایه های مورد نیاز برای این کار برای دیباگ رزرو میشن. با توجه به شماره 4  دو پایه PA13, PA14 برای این کار رزرو شدن.

دقت کنید من دیگه این بخش رو در قسمت های بعدی آموزش توضیح نمیدم.

2.4

با کلیک کردن روی RCC که با شماره 1 مشخص شده میتونید تنظیمات کلاک میکروی خودتون رو پیکربندی کنید که داخلی باشه یا خارجی. در حالت دیفالت  کلاک میکرو داخلیه و من هم با کلاک داخلی کار دارم فعلا، اما بخش هایی که نیازه تا بدونید رو بهتون میگم.
HSE که با شما ره 2 نشون داده شده برای تنظیم کردن کلاک اصلی میکرو هستش که در حال حاضر داخلیه پایینش LSE با شماره 3 در تصویر بالا برای کلاک RTC هستش که فعلا باهاش کار نداریم و شماره 4 هم برای اینه که بتونید کلاک بخش های مختلف میکرو رو ازش خروجی بگیرید و روی اسکوپ برسی کنید که بازم فعلا کاری باهاش نداریم.

2.5

حالا میخوایم یکی از پایه ای میکرو رو خروجی و یکی دیگه رو داخلی معرفی کنیم برای این کار میتونید روی هر کدوم از پایه های میکرو که میخواید کلیک کنید و امکانات اون پایه رو ببینید من با توجه به برد آموزش کدنیک پایه PB2 رو ورودی و پایه PB4 رو خارجی معرفی کردم حالا از بخش GPIO با شماره 1 میتونید تنظیمات پایه مورد نظرتون رو تغییر بدید. شماره 2 مد پابه رو تعیین میکنه و شماره 3 حالت پین رو که من پول آپ میزارم و شماره 4 برای این هستش که اگه خواستید تو برنامه از اون پین نام ببرید میتونید اون پین رو با اسم مورد نظر خودتون فراخوانی و استفاده کنید.

2.6

در سربرگ Clock Configuration شما میتونید فرکانس بخش های مختلف میکرو رو تعیین کنید. شماره 1 System Clock Mux  روی HSI هستش که یعنی میکرو داره از کلاک داخلی استفاده میکنه و شما ره 2 هم جایی هستش که شما کلاک مورد نطرتون رو اونجا تایپ و اینتر میکنید. ماکسیموم کلاکی که میتونید بزارید 72 مگاهرتز هستش اما چون ما داریم از کلاک داخلی استفاده میکنیم این اجازه رو نداریم و تا 36 مگاهرتز میتونیم با PLL کلاک رو تقویت کنیم که من میزارم رو حالت دیفالت بمونه و بهش دست نمیزنم.

2.7

خب کارمون تقریبا با CUBE MX تموم شد؛ فقط باید پروژه خودمون رو جنریت کنیم برای IDE مورد نظرمون. تو فیلد شماره 1 باید اسم پروژه خودتون رو وارد کنید و در بخش شماره 2 آدرس محل ذخیره پروژه رو میدیم بهش سپس در بخش ماره 3 و 4 به ترتیب IDE مورد نظر و نسخه اون رو انتخاب میکنیم که من KEIL رو انتخاب کردم.بعد ار همه اینها باید روی دکمه آبی رنگه بالا (GENERATE CODE) کلیک کنید تا پروژه جنریت شه.
چند ثانیه ای طول میکشه تا این کار انجام بشه. بعد از انجام کار سه گزینه براتون میاد که شما روی Open Project کلیک کنید تا پروژه رو براتون باز کنه.

2.8

اینم یه عکس از KEIL بعد از اتمام کار تا به اینجا

2.آشنایی با چندی از توابع RCC و GPIO

در ابتدا باید بهتون بگم که یک سری تابع رو زمانی که پروژه رو جنریت کردید؛ کیوب براتون تولید کرده که من فقط بهتون میگم تو اون تابع چه اتفاقی افتاده چون نیازی نداریم تغییراتی توش ایجاد کنم. البته گاهی نیاز میشه پس باهاش آشنا باشید بد نیست.

(void SystemClock_Config(void

این تابع بدون ورودی، تنظیماتی که در بخش RCC و Clock Configuration انجام داده بودیم رو انجام میده.

(static void MX_GPIO_Init(void

توی این تابع پیکربندی پین ها و پورت های میکرومون انجام شده که توابع به کار رفته در اون رو کمی جلو تر توضیح میدم.

(void Error_Handler(void

این تابع برای دیباگ کردن به کار میره که فعلا باهاش کاری نداریم

حالا میریم سراغ چند مورد از توابعی که میتونید برای GPIO استفاده کنید. منتها اول باید بگم که این توابع رو از کجا آوردم، پس به عکس پایین نگاه کنید.

2.9

اگه تو بخش بخش سمت راست روی تب Functions یا تو عکس شماره 1 کلیک کنید تمامی کتابخانه های پروژه خودتون رو مشاهده میکنید که با کیک کردن روی هر بخش میتونید توابع اون کتابخانه رو مشاهده کنید.
چون ما با توبع GPIO کار داریم پس رو کتابخانه stm32f1xx_hal.c کلیک میکنیم که این توابع رو براتون این زیر شرح میدم.

HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)

برای بگردوندن یک پین به حالت دیفالت از این تابع استفاده میکنیم.

HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

هنگامی که وقفه رخ میده میتونید از این تابع استفاده کنید.

HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)

برای فعال کردن وقفه روی پین مورد نظرتون این تابع رو میتونید بکار ببرید.

HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)

تابع INIT همینطور که از اسمش پیداست برای پیکر بندی پین مورد نظر استفاده میشه. این تابع در تابع MX_GPIO_INIT استفاده شده.

HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

این تابع برای قفل کردن مقادیر پیکر بندی شده روی پین به کار میره.

HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

وقتی پینی رو ورودی تنظیم میکنیم؛ مثل PB2 تو برنامه ما، میتونید از تابع برای خوندن مقدار ورودی به صورت 0 و 1 دریافت کنیم.

HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

برای تاگل کردن(نات کردن حالت موجود روی پین یعنی اگر 0 بود خروجی رو 1 میکنه و اگه یک بود خروجی رو 0 میکنه)پین مورد نظرتون میتونید از این تابع استفاده کنید.

HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

این تابع هم مقداری که شما نیاز دارید رو روی پین مورد نظرتون رایت میکنه یا به عبارت دیگه خروجی میکرو با توجه به مقدار دهی شما 0 یا 1 میشه.

من میخوام با توجه به توابع بالا، کدی بنویسم که وقتی پوش باتنی که به PB2 در برد کدنیک وصله رو فشار دادید؛ LED PB4 حالتش عوض بشه. بنابراین کد زیر رو دقیقا به شکل زیر در WHILE خودم اضافی میکنم.

شاید براتون سوال باشه که چرا دوتا کامنت رو پاک نکردم و کد رو ننوشتم؟

خیلی ها تو گروه کدنیک و … ازم پرسیدن که چرا وقتی پروژه کیوب خودمون رو تغییراتی توش ایجاد میکنیم؛ تمام کد هایی که توی تابع main و while … نوشتیم با جنریت کردن دوباره پاک میشه!
این کار بخاطر اینه که کیوب وقتی پروژه رو براتون تولید میکنه بهتون میگه کد های خودتون رو کجا وارد کنید تا بعد از جنریت کردن دوباره اونها رو حفظ کنه اما ما چون از شلوغ بودن کد بدمون میاد اولین کاری که میکنیم بعد از باز کردن پروژه، سریع کامت ها رو پاک میکنیم که این اشتباه هست.

یه توضیح هم درمورد کد بدم: توی وایل من با دستور شرطی if گفتم مقدار برگشتی تابع HAL_GPIO_ReadPin که مقدار PB2 رو بر میگردونه  برابر با 0 شد( تو تصویر پایین میگم چرا 0) اون موقع با تابع HAL_GPIO_TogglePin مقدار خروجی PB4 رو که به LED وصله رو تاگل کنه.”انتهای آموزش یه فیلم از عملکرد پروژه قرار میدم”

2.10

با توجه به شماتیک، برد من سه پوش باتن داره که همشون به زمین وصل هستن بنابراین با فشرده شدن باتن مقدار 0 به پایه ای من وصل میشه.
من هم برای همین 0 رو مقابل تابع برای شرط خودم قرار دادم و اگه یادتون باشه تو بخش GPIO من به همین علت PB2 رو پول آپ داخلی تنظیم کردم.

2.معرفی برد آموزش کدنیک

7 بهمن ماه 1398 برد آموزشی رو توی کانال قرار دادم همراه با نمونه برنامه ها و فایل های PCB و شماتیک با عنوان برد تکترونیک که حالا اسمش رو کدنیک میزارم چون اسم مجموعه تغییر کرده.
امکانات برد رو میتونید توی عکس زیر همراه با توضیحات زیرش برسی کنید.

2.11 1

SD CARD

2

PL2303

3

USB TO TTL

4

BUTTON BOOT0

5

کریستال 8 مگ برای میکرو و کریستال ساعت برای RTC

6

BUTTON

7

پین هدر برای اتصال LCD

8

جا باتری برای RTC

9

JTAG

10

AMS 1117 3.3

11

EEPROM AT24C04

12

POT و جامبر برای اتصال به پین میکرو

13

LED RGB 5050

14

BUTTON RESET

15

USB DEVICE

16

PIN OUT

17

MCU STM32F103RBT6

سعی میکنم با تمام بخش های برد کار کنیم.
برد آموزشی رو متن باز کردم تا همه بتونن استفاده کنن حالا اگه کسی این امکانات رو نداره تا خودش درست کنه یه فکری میکنم تا بتونبد از سایت تهیه کنید.

4.نحوه پروگرام کردن برد

برد آموزش کدنیک رو با سه روش میتونید پروگرام کنید.
روش اول SW

روش دوم JTAG

روش سوم BOOT

(از صبح یکسره نشستم پشت لپتاپ تا این آموزش رو درست کنم. الآن ساعت 4 بعد از ظهره و من هنوزآموزش رو تموم نکردم)
خیلی دوست داشتم هر سه روش رو بهتون یاد بدم اما از اوجایی که فاصله افتاده بین جلسه اول آموزش و جلسه دوم پس باید امروز این قسمت رو تموم کنم پس فقط روش پروگرام کردن با STLINK با KEIL رو بهتون آموزش میدم.
ان شاالله کامل بهتون در آینده هر کدوم رو یاد میدم.

STLink Serial Wire

برای پروگرام کردن از طریق منوی زیر وارد میشیم
Flash>Configur Flash Tools>Seting
بعد از انجام مراحل بالا با برگه زیر رو به رو میشید.

2.12
از لیست سمت چپ پروگرامر رو انتخاب کنید و بعد روی دکمه Seting کلیک کنید.
2.13
  1. تو این قسمت شما تنظیم کنید که flash میکرو چطور حذف بشه که من رو فول کذاشتم تا کامل برنامه داخل میکرو رو پاک کنه.
  2. اگه این تیک رو بزنید بعد از پروگرام شدن میکرو دیگه نیاز نیست دکمه ریست رو بفشارید چون بعد از پروگرام کردن خودش ریست میکنه میکرو رو.
  3. با زدن دکمه Add میکرو کنترلر خودتون رو انتخاب کنید.
  4. در نهایت دکمه ok رو بفشارید.

از این به بعد شما میتونید با زدن دکمه f8 و یا از منوی Flash>Download برنامه خودتون رو روی برد بریزید. با توجه به اتصال زیر البته.

2.14
با توجه به نوشته های روی پروگرامر به این شکل پروگرامر رو به برد آموزشی متصل کنید

5.تمرین

زمان تمرین فرا رسید. قبل از اینکه بهتون تمرین بدم باید فیلم عملکرد  پروژه ای که نموشیم رو بزارم تا ببینید.

https://hw2.cdn.asset.aparat.com/aparat-video/ba1563b249d921a419e8ee78aae070e920179927-480p__55746.mp4

اگه به ویدیو دقت کرده باشید متوجه میشید که برنامه یه مشکلی داره اونم از برنامه نویسی هست چون وقتی کلید رو نگه داشتم؛ LED شروع کرد به چشمک زدن.
اما چیزی که من از شما میخوام:
برنامه ای بنویسید که با نگه داشتن کلید اتفاقی برای LED نیوفته و اما وقتی کلید رو رها میکنید LED روشن بشه و این حالت برعکس هم اتفاق بیوفته دقیقا مثل یه فلیپ فلاپ.

این قسمت از آموزش هم به پایان رسید. من تنها نتظاری که ازتون دارم بابت این آموزش از شما پیشنهاد و انتقاد و نظر دادن برای بهتر شدن آموزش و فعالیت مجموعه هست. کد های خودتون رو  برای ما توی گروه تلگگرام بارگذاری کنید؛ واگر سوالی دارید اونجا مطرح کنید.

گروه تلگرامی کدنیک Instagram Telegram
برچسب ها
نمایش بیشتر

sahandrjb

دانشجوی الکترونیک دانشگاه چمران رشت، مدیر و بنیانگذار مجموعه کدنیک. تجربه تدریس برنامه نویسی برای میکروکنترلر ها مشتاق برای یادگیری، آماده برای تدریس.

‫۲ نظرها

دیدگاهتان را بنویسید

دکمه بازگشت به بالا
بستن
بستن