برای پروژه led چشمک زن با میکروکنترلر STM32F103C8 روی برد بلوپیل چه رجیسترهایی رو باید تغییر بدیم.
فهرست
– برنامه نویسی رجیستری برای میکروکنترلر ها
– Led چشمک زن با میکروکنترلر STM32F103C8 روی برد Blue pill
– پریفرال GPIO در میکروکنترلر STM32F103
– ساخت پروژه خالی در STM32CubeIDE برای STM32F103C8
برنامه نویسی رجیستری میکروکنترلر های STM32 یعنی چی؟
ابتدا باید اجزا میکروکنترلر رو بشناسید و هدف از دسترسی به رجیسترهای میکروکنترلرهای STM32 رو بدونید
یک میکروکنترلر از چهار بخش اصلی تشکیل شده .
+ Cpu : که وظیفه ی اجرای کد رو به عهده داره
+ حافظه ها: مثل فلش برای ذخیره سازی کد و رم برای ذخیره سازی متغیرها
+ باس ها: برای جابجایی دیتا بین بخش های مختلف
+ پریفرال ها: مدار های الکترونیکی که برای انجام کار خاصی طراحی شده اند. مثلا هر پریفرال GPIO در میکروکنترلرهای stm32 در مورد تا 16 پین وظیفه تنظیم پین میکروکنترلر در حالت ورودی یا خروجی دیجیتال ، مشخص کردن وضعیت پین خروجی، اطلاع از وضعیت پین ورودی رو به عهده داره.
تنظیم پریفرال ها
فرض کنید میخواهیم یکی از پین های میکروکنترلر رو در حالت خروجی تنظیم کنیم چطور باید با پریفرال GPIO ارتباط برقرار کنیم و ازش بخواهیم تنظیمات مورد نیاز رو برای ما اعمال کنه؟
پریفرال GPIO هم مثل سایر پریفرال ها فضایی در حافظه مختص خورش داره که شامل تعدادی رجیستره، برای اینکه از پریفرال در راستای اهدافمون استفاده کنیم باید اعداد مشخصی رو در رجیستر های پریفرال بنویسیم. در میکروکنترلرهای STM32F1 رجیسترها فضای 16 یا 32 بیتی ( 2 یا 4 بایت ) در حافظه هستند.
بخش بزرگی از کاری که در برنامه نویسی میکروکنترلر ها انجام میدیم تنظیم پریفرال با تغییر محتوای رجیسترهای اونهاست. در پروژه هایی که با میکروکنترلر های STM32 انجام میدیم برای تغییر محتویات رجیسترها میتونیم از کتابخونه ها مثلا کتابخونه hal استفاده کنیم، توابع hal رو فراخوانی میکنیم و در اون توابع مقدار رجیسترها تغییر داده میشه ، همچنین میتونیم خودمون بدون استفاده از کتابخونه ها مستقیما مقدار رجیسترها رو تغییر بدیم، به این کار میگن برنامه نویسی با رجیسترها .
تمام توضیحات مربوط به امکانات پریفرال ها ، رجیستر های هر پریفرال و اینکه برای رسیدن به تنظیم دلخواه چه اعدادی رو باید در رجیستر ها بنویسیم در رفرنس منوال میکروکنترلر های STM32F103 آورده شده.
دانلود رفرنس منوال STM32F103
آموزشن STM32 ، پروژه Led چشمک زن با میکروکنترلر STM32F103C8 روی برد Blue pill
در این بخش برد بلوپیل رو برای انجام پروژه led چشمک زن بررسی میکنیم.
قراره برنامه نویسی با رجیستر ها برای میکروکنترلر های STM32 رو با مثال led چشمک زن روی برد blue pill آموزش ببینید. برد blue pill یک برد توسعه است که امکانات اولیه مورد نیاز برای راه اندازی میکروکنترلر STM32F103C8 رو برای ما فراهم میکنه . روی برد blue pill یک led سبز رنگ وجود داره که آند led به 3.3v و کاتد led با یک مقاومت به پین PC13 میکروکنترلر متصل شده. پس وقتی پین PC13 زمین بشه ، led روشن میشه.
دانلود شماتیک برد بلوپیل
میکروکنترلر STM32F103 چهار تا پریفرال GPIO داره:
GPIOA برای پین های PA0 تا PA15
GPIOB برای پین های PB0 تا PB15
GPIOC برای پین های PC13, PC14, PC15
GPIOD برای پین های PD0 و PD1
برای تنظیم پین PC13 میکروکنترلر STM32F103 باید از پریفرال GPIOC استفاده کنیم و مقدار رجیسترهای این پریفرال رو برای رسیدن به هدفمون تغییر بدیم.
آموزش STM32 ، پریفرال GPIO در میکروکنترلر STM32F103
در این بخش بررسی میکنیم برای انجام پروژه led چشمک زن با STM32F103C8 چه بیت هایی رو در چه رجیسترهایی رو باید تغییر بدیم.
هر پریفرال GPIO هفت تا رجیستر 32 بیتی داره ، دو تا رجیستر اول به نام های CRH و CRL برای تنظیم پین ها در حالت ورودی یا خروجی هستند و همچنین نوع ورودی یا خروجی رو هم مشخص میکنند. رجیستر CRL برای تنظیم پین های 0 تا 7 و رجیستر CRH برای پین های 8 تا 15 هستند. در تصویر زیر register map یا نقشه رجیسترهای پریفرال GPIO میکروکنترلرهای STM32F1 رو میبینید که از صفحه ی 194 رفرنس منوال برداشته شده.
برای تنظیمات هر پین هم 4 بیت اختصاص داده شده. دو بیت به نام MODE و دو بیت به نام CNF . مثلا در رجیستر GPIOC_CRH بیت های MODE13 و CNF13 رو داریم که برای تنظیمات پین PC13 هستند.
برای تنظیم یک پین در حالت ورودی یا خروجی و تنظیم سرعت از بیت های MODE استفاده میشه. جهت تنظیم پین PC13 در حالت خروجی با کمترین سرعت مقدار MODE13 باید 10 باشه، یعنی بیت 20 صفر و بیت 21 باید یک بشه.
برای مشخص کردن حالت ورودی یا خروجی هم از بیت های CNF استفاده میشه ، با توجه به اینکه در مورد پین PC13 وقتی پین زمین بشه بار اکتیو هست، یعنی led روشن میشه ، خروجی push-pull یا open-drain هر دو کار میکنند. اینجا من انتخاب میکنم که خروجی رو open-drain تنظیم کنم پس باید مقدار 01 در بیت های CNF13 ثبت بشه، یعنی بیت 22 یک و بیت 23 باید صفر بشه.
قدم بعدی تغییر وضعیت پین هست ، که برای اینکار از رجیستر ODR استفاده میکنیم. بیت 13 رجیستر ODR از پریفرال GPIOC برای تعیین وضعیت خروجی پین PC13 اختصاص داره. اگر این بیت یک بشه پین PC13 هم 3.3v میشه و اگر بیت صفر بشه وضعیت پین هم 0v یا GND میشه.
آموزش STM32 فعالسازی کلاک پریفرال GPIOC
برای پروژه led چشمک زن مقدار یک رجیستر دیگه رو هم باید تغییر بدیم. همه ی پریفرال های میکروکنترلر برای عملکرد به کلاک نیاز دارند و در شروع کار کلاک تمام پریفرال ها قطعه و از هر پریفرالی بخواهیم استفاده کنیم قبل از تغییر رجیستر های اون پریفرال باید کلاکش رو وصل کنیم. کنترل کلاک میکروکنترلر به عهده ی پریفرال RCC هست. پریفرال RCC سه تا رجیستر داره برای قطع و وصل کردن کلاک سایر پریفرال ها. با توجه به اینکه باید از پریفرال GPIOC استفاده کنیم ، باید ابتدا کلاکش رو فعال کنیم. فعال کردن کلاک این پریفرال با یک کردن بیت IOPCEN ( بیت 4 ) در رجیستر RCC_APB2ENR انجام میشه.
تا اینجای کار میدونیم که برای پروژه led چشمک زن باید چه تغییراتی رو در کدوم رجیستر ها اعمال کنیم. چیزی که هنوز نمیدونیم آدرس این رجیستر هاست. در میکروکنترلرهای STM32F1 حافظه ی مربوط به پریفرال ها از آدرس 0x40000000 شروع میشه و به هر پریفرال 1kb حافظه اختصاص داده شده. هر پریفرال یک base address داره که آدرس اولین رجیستر اون پریفرال هست. Base address تمام پریفرال ها رو میتونید در نقشه حافظه در صفحه 34 دیتاشیت یا در جدول صفحه ی 50 رفرنس منوال ببینید.
برای بدست آورده آدرس هر رجیستر به base address پریفرال و همچنین آفست اون رجیستر نیاز داریم. آفست یعنی فاصله ی آدرس رجیستر از آدرس اولین رجیستر پریفرال. آفست هر رجیستر رو هم در ستون اول جدول رجیستر مپ هر پریفرال میتونید پیدا کنید. آدرس هر رجیستر با جمع base address پریفرال و آفست رجیستر بدست میاد.
هدف مقاله تا اینجا این بود که بفهید اطلاعات جدول زیر از کجا اومده، الان میدونیم در چه آدرس هایی چه تغییراتی رو باید اعمال کنیم. در قدم بعدی برنامه نویسی رو شروع میکنیم و به محتویات رجیسترهای پریفرال ها دسترسی پیدا میکنیم.
آموزش STM32 ، ساخت پروژه خالی در STM32CubeIDE برای STM32F103C8
برای انجام پروژه باید در نرم افزار STM32CubeIDE یک پروژه خالی برای STM32F103C8 بسازیم.
نرم افزار STM32CubeIDE رو باز کنید و در صفحه launcher ابتدا یک پوشه رو به عنوان workspace ( پوشه ای که یک یا چند پروژه در اون هست ) انتخاب کنید و سپس روی دکمه launch کلیک کنید.
در صفحه ی information center روی start new stm32 project کلیک کنید.
صفحه ی target selection ابتدا در بخش part number اسم میکروکنترلر رو مینویسیم ( STM32F103 ) در قدم دوم میکروکنترلر رو انتخاب کنید و سپس روی next کلیک کنید.
در پنجره STM32 Project ابتدا در بخش project name اسم پروژه رو تایپ کنید ، targeted Project type رو empty انتخاب کنید و روی finish کلیک کنید.
با موفقیت پروژه ای ساختیم که حداقل نیازمندی لود شدن در میکروکنترلر رو داره. از پوشه Src فایل main.c رو باز کنید و قسمت های اضافی رو پاک کنید. در تابع main قبل از حلقه ی بینهایت باید تنظیمات اولیه پریفرال ها رو اعمال کنیم.