مبانی برنامه نویسی رجیستری STM32

رجیستر یک محتوای 8 ، 16 یا 32 بیتی بدون علامت هست با آدرسی مشخص. مقدار بیت های رجیستر عملکرد بخشی از میکروکنترلر رو مشخص میکنه. در این مقاله قدم به قدم در سه مرحله آموزش میبینید، در زبان سی چطور به محتوای حافظه و رجیسترها دسرسی پیدا میکنیم. 

 

فهرست

– ساخت پوینتر برای هر رجیستر

– دسترسی به رجیستر در قالب اعضای استراکچر

– دسترسی به بیت رجیسترها با بیت فیلد

ساخت پوینتر برای هر رجیستر

فرض کنید یک رجیستر 16 بیتی در آدرس 0x4000 0000 وجود داره. چجوری میشه مقدار رجیستر رو خوند یا توش نوشت؟

به پوینتری با مقدار 0x4000 0000 و نوع *uint16_t نیاز داریم. با قرار دادن علامت استریسک قبل از پوینتر به محتوای آدرس دسترسی داریم.

 

 

پوینتر متغیر

برای تعریف پوینتر، باید استریسک – پوینتر ( p* ) تعریف بشه. همونطور که در تعریف متغیر، قبل از نام اون، نوعش نوشته میشه. نوع p* هم قبلش نوشته شده که uint16_t هست. نوع p* ، نوع اون محوای حافظه است که برای دسترسی بهش پوینتر میسازیم.

 

پوینتر ثابت

برای ساخت پوینتر ثابت باید نوع پوینتر رو قبل از مقدار پوینتر در پرانتز نوشت. به این کار میگن کست کردن.
 
 

دسترسی به حافظه در زبان C

قبل از پوینتر عملگر استریسک * میذاری و به مقداری که در آدرس پوینتر ذخیره شده دسترسی پیدا میکنی.
 

 

 

رجیستر اعضای استراکچر فرضی

پریفرال GPIOC هفت رجیستر 32 بیتی داره که پشت سرهم در حافظه قرار دارند. رجیستر CRL اولین رجیستره که در آدرس 0x40011000 هست. برای دسترسی به GPIOC_CRL پوینتر زیر رو باید بسازیم.



روش بهتری هم وجود داره. بجای اینکه هر رجیستر رو یک 32 بیتی جدا در نظر بگیریم. همه ی رجیسترهای یک پریفرال رو عضو یک استراکچر فرضی در نظر میگیریم. مثلا پریفرال GPIOC هفت عدد رجیستر 32 بیتی داره که از آدرس 0x40011000 شروع شدن. فرض میکنیم یک استراکچر که 7 عضو 32 بیتی داره در آدرس 0x40011000 قرار داره.

 

 

نوع متغیر استراکچر GPIO_Type رو مطابق رجیسترهای پریفرال های GPIO طراحی میکنیم و با استفاده از این نوع متغیر یک پوینتر میسازیم برای دسترسی به استراکچر فرضی از نوع GPIO_Type که در آدرس 0x40011000 قرار داره. 

 

با قراردادن عملگر پیکان بعد از پوینتر به استراکچر، میتونیم به اعضای استراکچر که رجیسترهای پریفرال GPIOC هستنید دسترسی پیدا کنیم. 

 

این روش CMSIS استاندارد هست برای دسترسی به رجیسترها ، در فایل دیوایس CMSIS این چیزها وجود داره که بتونیم به رجیسترها دسترسی داشته باشیم و برنامه نویسی رجیستری انجام بدیم.

 

1. تعریف آدرس اولین رجیستر پریفرال ها ( base address ) 

2. تعریف نوع متغیر استراکچر قالب رجیسترهای هر پریفرال

3. تعریف پوینتر برای دسترسی به رجیسترهای هر پریفرال

دسترسی به بیت رجیسترها با بیت فیلد

در دو روش قبلی برای دسترسی به رجیسترها، نوع خود رجیستر همیشه اینتیجر 32 بیتی بوده و برای تغییر بیت ها در یک عدد 32 بیتی باید از عملگرهای بیتی استفاده بشه. 
 


در روش سوم به عملگرهای بیتی نیازی نیست و مستقیما میتونیم بیت فیلد هارو تغییر بدیم. رجیستر CRL، تعداد 16 بیت فیل 2 بیتی داره که اولی MODE0 و آخری CNF7 هست. مطابق بیت های این رجیستر یک نوع متغیر استراکچر تعریف میشه.


حالا فرض میکنیم در آدرس رجیستر CRL، بجای اینتیچر 32 بیتی، یک استراکچر از نوع CRL_Type وجود داره که البته 32 بیتی هست. با دسترسی به اعضای این استراکچر به بیت فیلد های رجیستر دسترسی مستقیم پیدا میکنیم. 


به مقدار 32 بیتی بدون علامتی که در آدرس 0x4001000 هست، یک بار بصورت اینتیجر و یک بار استراکچر دسترسی پیدا کردیم. اگر بخواهیم همزمان قابلیت هر دو دسترسی رو داشته باشیم به یونیون نیاز هست.






  




دسترسی به بیت رجیسترها با بیت فیلد

 
 

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

پیمایش به بالا