رجیستر یک محتوای 8 ، 16 یا 32 بیتی بدون علامت هست با آدرسی مشخص. مقدار بیت های رجیستر عملکرد بخشی از میکروکنترلر رو مشخص میکنه. در این مقاله قدم به قدم در سه مرحله آموزش میبینید، در زبان سی چطور به محتوای حافظه و رجیسترها دسترسی پیدا میکنیم.
فهرست
– ساخت پوینتر برای هر رجیستر
– دسترسی به رجیستر در قالب اعضای استراکچر
– دسترسی به بیت رجیسترها با بیت فیلد
ساخت پوینتر برای هر رجیستر
فرض کنید یک رجیستر 16 بیتی در آدرس 0x40000000 وجود داره. چجوری میشه مقدار رجیستر رو خوند یا تغییر داد؟
به پوینتری با مقدار 0x40000000 و نوع *uint16_t نیاز داریم. مثلا اسم پوینتر هست p، با قرار دادن علامت استریسک قبل از پوینتر به محتوای آدرس دسترسی داریم.
پوینتر متغیر
با تعریف p* خود p هم تعریف میشه، نوع پوینتر در تعریف پوینتر قبل از اسمش نوشته شده:
پوینتر ثابت
جمع بندی روش اول
رجیستر اعضای استراکچر فرضی
روش بهتری هم وجود داره. بجای اینکه هر رجیستر رو یک 32 بیتی جدا در نظر بگیریم. همه ی رجیسترهای یک پریفرال رو، عضو یک استراکچر فرضی در نظر میگیریم. مثلا پریفرال GPIOC هفت عدد رجیستر 32 بیتی داره که از آدرس 0x40011000 شروع شدن. فرض میکنیم یک استراکچر که 7 عضو 32 بیتی داره در آدرس 0x40011000 قرار داره.
نوع متغیر استراکچر GPIO_Type رو مطابق رجیسترهای پریفرال های GPIO طراحی میکنیم و با استفاده از این نوع متغیر یک پوینتر میسازیم برای دسترسی به استراکچر فرضی از نوع GPIO_Type که در آدرس 0x40011000 قرار داره.
با قراردادن عملگر پیکان بعد از پوینتر به استراکچر، میتونیم به اعضای استراکچر که رجیسترهای پریفرال GPIOC هستنید دسترسی پیدا کنیم.
این روش CMSIS استاندارد هست برای دسترسی به رجیسترها ، در فایل دیوایس CMSIS این چیزها وجود داره که بتونیم به رجیسترها دسترسی داشته باشیم و برنامه نویسی رجیستری انجام بدیم.
1. تعریف آدرس اولین رجیستر پریفرال ها ( base address )
2. تعریف نوع متغیر استراکچر قالب رجیسترهای هر پریفرال
3. تعریف پوینتر برای دسترسی به رجیسترهای هر پریفرال
دسترسی به بیت رجیسترها با بیت فیلد
در روش سوم به عملگرهای بیتی نیازی نیست و مستقیما میتونیم بیت فیلد هارو تغییر بدیم. رجیستر CRL، تعداد 16 بیت فیل 2 بیتی داره که اولی MODE0 و آخری CNF7 هست. مطابق بیت های این رجیستر یک نوع متغیر استراکچر تعریف میشه.
حالا فرض میکنیم در آدرس رجیستر CRL، بجای اینتیچر 32 بیتی، یک استراکچر از نوع CRL_Type وجود داره که البته 32 بیتی هست. با دسترسی به اعضای این استراکچر به بیت فیلد های رجیستر دسترسی مستقیم پیدا میکنیم.
به مقدار 32 بیتی بدون علامتی که در آدرس 0x4001000 هست، یک بار بصورت اینتیجر و یک بار استراکچر دسترسی پیدا کردیم. اگر بخواهیم همزمان قابلیت هر دو دسترسی رو داشته باشیم به یونیون نیاز هست.