اضافه کردن لایه ی نرم افزاری CMSIS

در این مقاله یادمیگیرد چطور باید در نرم افزار STM32CubeIDE لایه ی نرم افزاری CMSIS رو به پروژه اضافه کرد، لایه ی نرم افزاری CMSIS چه وظیفه ای در کد ما داره، چطور ازش استفاده میکنیم و همچنین چطور باید با استفاده از نرم افزار SVDConv.exe فایل Device جدید بسازیم که امکان دسترسی به بیتهای رجیسترها رو در برنامه نویسی رجیستری میکروکنترلر های STM32 برای ما فراهم میکنند.

STM32CubeIDE

فهرست

– معرفی لایه ی نرم افزاری CMSIS

– اضافه کردن لایه ی نرم افزاری CMSIS به پروژه در نرم افزار STM32CubeIDE

– بررسی فایل device

– ساخت فایل device جدید با استفاده از SVDConv.exe

– بررسی فایل device جدید دارای بیت فیلد و یونیون

جهت مشاهده ویدئو صفر تا صد برنامه نویسی با رجیستر ها در آپارات اینجا کلیک کنید

جهت مشاهده ویدئوی آموزشی صفر تا صد برنامه نویسی با رجیسترها در yotube اینجا کلیک کنید

https://www.aparat.com/video/video/embed/videohash/l36gE/vt/frame

این مقاله بخشی از ویدئوی آموزشی ” صفر تا صد برنامه نویسی با رجیسترها برای میکروکنترلر های STM32 ” هست که ویدئوی معرفی دوره جامع آموزش برنامه نویسی میکروکنترلر ARM با STM32 میباشد.

دوره جامع آموزش برنامه نویسی میکروکنترلر ARM با STM32

سی، اسمبلی، جی سی سی، لینکرکامند

اینجا کلیک کنید

لایه ی نرم افزاری CMSIS چیه و چه کاربردی در برنامه نویسی میکروکنترلرهای STM32 داره؟

لایه ی نرم افزاری CMSIS چند تا فایل هست که امکانات اولیه مورد نیاز برای دسترسی به رجیسترهای پریفرال های میکروکنترلر و همچنین رجیسترهای پریفرال های CPU در برنامه نویسی میکروکنترلر های STM32 رو برای ما فراهم میکنه. در مقاله ی ” آموزش STM32 : برنامه نویسی رجیستری ” یاد میگیرید که برای برنامه نویسی رجیستری چه امکاناتی رو نیاز داریم ، در این مقاله یاد میگیرید لایه ی نرم افزاری CMSIS چطور این امکانات رو برامون فراهم میکنه و چطور باید ازش استفاده کنیم.

ساختار فایل های لایه ی نرم افزاری CMSIS

اضافه کردن لایه ی نرم افزاری CMSIS به پروژه در نرم افزار STM32CubeIDE

نرم افزار STM32CubeIDE رو باز کنید و در صفحه ی launcher ابتدا یک فولدر به عنوان workspace معرفی کنید ( پوشه ای که مجموعه ای از پروژه ها در اون قرار داده میشه ). سپس روی دکمه ی launch کلیک کنید.

پنجره STM32CubeIDE Launcher

در صفحه ی information center روی start new stm32 project کلیک کنید.

شروع پروژه در نرم افزار STM32CubeIDE

پنجره target selection رو مشاهده میکنید، در این مرحله باید میکروکنترلری که قراره پروژه رو باهاش انجام بدیم انتخاب کنیم، در بخش part number اسم میکروکنترلر رو بنویسید، من برای میروکنترلر STM32F103C8 که روی برد blue pill هست پروژه رو میسازم. در قدم دوم میکروکنترلر رو انتخاب کنید و سپس روی دکمه ی next کلیک کنید.

پنجره target selection در نرم افزار STM32CubeIDE و انتخاب میکروکنترلر stm32f103c8

در پنجره STM32 Project در قدم اول اسمی که برای پروژه در نظر گرفتید رو بنویسید، targeted project type هم حتما STM32Cube باشه، قرار نیست از کتابخونه hal و نرم افزار Cube استفاده کنیم ولی برای اینکه لایه ی نرم افزاری CMSIS به پروژه مون اضافه بشه باید از این مسیر بریم. در قدم سوم روی دکمه finish کلیک کنید تا پروژه ساخته بشه.

پنجره ی STM32 project در نرم افزار STM32CubeIDE

فایل ioc ( فایل مربوط به Cube ) و تمام فایل های مربوط به کتابخونه hal رو پاک کنید. این فایل ها رو در تصویر زیر مشخص کردم.

پاک کردن فایلهای اضافی و انجام پروژه با لایه ی نرم افزاری CMSIS

فایل main.c رو باز کنید و تمام محتویاتش رو پاک کنید. برای استفاده از لایه ی نرم افزاری cmsis کافیه در ابتدای فایل main.c فایل stm32f1xx.h رو inclue کنید. بعد از اون تابع main رو مطابق کد زیر بنویسید. 

لایه ی نرم افزاری CMSIS در STM32CubeIDE

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

لایه ی نرم افزاری CMSIS در STM32CubeIDE

ارور اول مربوط به include فایل main.h در فایل it هست که خب فایل main.h رو پاکش کردیم، include فایل main.h رو هم پاک کنید. 

لایه ی نرم افزاری CMSIS در STM32CubeIDE

ارور دوم مربوط به include شدن یکی از فایل های کتابخونه hal در فایل stm32f1xx.h هست، اون کدی که با مربع قرمز مشخص کردم پاک کنید.  

لایه ی نرم افزاری CMSIS در STM32CubeIDE

خطای بعدی هم مربوط به فراخوانی تابع HAL_IncTick در فایل it هست، فراخوانی این تابع رو هم پاک کنید.

لایه ی نرم افزاری CMSIS در STM32CubeIDE

کد رو دوباره کامپایل کنید، error و warning نداریم.

لایه ی نرم افزاری CMSIS در STM32CubeIDE

الان پروژمون آمادست و میتونیم از لایه ی نرم افزاری CMSIS استفاده کنیم ولی قبل از اینکه شروع به کد نویسی کنیم، میخواهیم فایل های داخل پروژمون رو یکم بیشتر بررسی کنیم. در پنجره project explorer روی فایل main.c کلیک راست کنید و include browser رو از show in انتخاب کنید، نمای include browser ( در نرم افزار STM32CubeIDE به این پنجره های میگن view ، ترجمه ی فارسیش رو نوشتم نما ) که با مربع قرمز مشخص کردم براتون باز میشه. در این نما تمام هدر فایل هایی که در فایل main.c به صورت مستقیم یا غیر مستقیم include شدن رو میبینید.  

include browser در نرم افزار STM32CubeIDE

لایه ی نرم افزاری CMSIS فقط یک سورس فایل داره به نام system_stm32f1xx.c که دارای توابعی برای تنظیمات کلاک میکروکنترلر هست ، این فایل خیلی مهم نیست چون این تنظیمات رو خودمون هم میتونیم انجام بدیم و الان هم قرار نیست ازش استفاده کنیم. تمام فایل های هدر لایه ی نرم افزاری CMSIS که جزئی از پروژه مون هست رو هم در نمای include browser و همچنین در نمای project explorer میبینید. همونطور که مشخصه تعداد زیادی از فایلهای هدر که در پوشه ی include وجود دارند جزئی از پروژه نیستند و میشه اونها رو پاک کرد. لایه ی نرم افزاری CMSIS دو فایل هدر مهم داره ، فایل stm32f103xb.h که فایل device peripheral access layer هست و امکانات مورد نیاز برای دسترسی به رجیسترهای پریفرال های device رو برامون فراهم میکنه و فایل core_cm3.h که امکانات مورد نیاز برای دسترسی به رجیسترهای پریفرال های CPU رو فراهم میکنه. پریفرال های 

در ادامه راجع به فایل stm32f103xb.h صحبت میکنیم و پروژه led چشمک زن رو با استفاده از امکانات این فایل انجام میدیم ، حتما قبل از اینکه ادامه ی این مقاله رو بخونید، مقاله ی آموزش STM32 : برنامه نویسی رجیستری رو مطالعه کنید.

فایلهای لایه ی نرم افزاری CMSIS در نرم افزار STM32CubeIDE

بررسی فایل device peripheral access layer header

لایه ی نرم افزاری CMSIS دو فایل اصلی داره ، یکی فایل device ( در این مقاله هر موقع میگم فایل device منظورم فایل device peripheral access layer header هست ) و که در اینجا اسمش stm32f103xb.h هست و دیگری فایل core ( که در اینجا اسمش core_cm3.h هست ). هر دو این فایل ها امکانات دسترسی به رجیسترهای پریفرال ها رو برامون فراهم میکنند. حالا برای دسترسی به رجیسترها به چی نیاز داریم که CMSIS قراره برامون فراهم کنه؟ 

برای دسترسی به رجیسترها نیاز به پوینتر داریم و برای تغییر بیت های دلخواه به ماسک بیت نیاز داریم، فایل stm32f103xb.h برای هر پریفرال یک پوینتر برامون میسازه و همچنین ماسک بیت برای تمام بیت های تمام رجیسترها رو برامون فراهم میکنه.

در بخش peripheral register structures قالب رجیسترهای هر پریفرال یک نوع متغیر استراکچر طراحی شده. مثلا در مورد پریفرال های GPIO که هفت تا رجیستر 32 بیتی دارند، نوع متغیر GPIO_TypeDef تعریف شده که هفت ها عضو 32 بیتی از نوع uint32_t داره که اسامی اعضاش هم مطابق اسامی رجیسترهای پریفرال های GPIO هست.

مثلا در مورد پریفرال GPIOC ، فرض کنید که در base address پریفرال GPIOC ( آدرس اولین رجیستر این پریفرال ) یک استراکچر فرضی ذخیره شده از نوع GPIO_TypeDef که هفت تا عضو 32 بیتی داره مشابه رجیسترهای پریفرال های GPIO. اگر به اعضای این استراکچر دسترسی پیدا کنیم، به رجیسترهای پریفرال GPIOC دسترسی پیدا کردیم.

نوع استراکچر GPIO_TypeDef قالب رجیسترهای پریفرال GPIO در لایه ی نرم افزاری CMSIS

جهت ساخت پوینتر به Base address ( آدرس اولین رجیستر پریفرال ) پریفرال هم نیاز داریم. در بخش peripheral memory map برای تمام پریفرال ها Base address ها define شدن. مثلا در مورد پریفرال GPIOC آدرس اولین رجیستر 0x40011000 هست که از جمع چند آدرس دیگه بدست اومده و GPIOC_BASE تعریف شده .

تعریف Base address پریفرال ها در فایل CMSIS

نوع استراکچر قالب رجیسترهای پریفرال و base address پریفرال رو داریم و حالا نوبت ساخت پوینتره. برای ساخت پوینتر ابتدا مقدارش رو مینویسیم که همون Base address پریفرال هست و پشت مقدار، در یک پرانتر، نوعش رو مینویسیم. قسمت اول نوع پوینتر نوع متغیری هست که در آدرس مقدار پوینتر ذخیره شده، مثلا در مورد پریفرال GPIOC ما فرض میکنیم که در Base address پریفرال GPIOC یک استراکچر از نوع GPIO_TypeDef ذخیره شده. قسمت دوم نوع پوینتر هم علامت استرسیک هست.

ساخت پوینتر به استراکچر با کست کردن آدرس

برای اینکه مجبور نباشیم خود پوینتر رو که عبارت ناخوانا هست در کدمون بنویسیم ، پوینتر به هر پریفرال، اسم اون پریفرال define شده. مثلا در مورد پریفرال GPIOC ، خود عبارت GPIOC پوینتری هست با نوع GPIO_TypeDef *  و مقدار 0x40011000 که برای دسترسی به رجیسترهای پریفرال GPIOC کافیه بعد از این پوینتر عملگر پیکان بذاریم. 

تعریف پوینتر ها برای دسترسی به رجیستر های پریفرال ها در لایه ی نرم افزاری CMSIS

میخواهیم به رجیستر ها دسترسی پیدا کنیم و بیت هاشون رو تغییر بدیم تا تنظیمات مورد نیازمون در پریفرال اعمال بشه. برای تغییر بیت رجیسترها به ماسک بیت نیاز داریم. در بخش peripheral bit definition در فایل device لایه ی نرم افزاری CMSIS ، ماسک بیت برای تمام رجیسترهای تمام پریفرال ها تعریف شده. مثلا در مورد بیت IOPCEN که بیت چهار رجیستر RCC_APB2ENR هست ، پوزیشن بیت عدد چهار define شده و ماسک بیت 1<<4 تعریف شده.

ماسک بیت IOPCEN در لایه ی نرم افزاری CMSIS
ماسک بیت ها در لایه ی نرم افزاری CMSIS

پروژه led چشمک زن با لایه ی نرم افزاری CMSIS

با امکاناتی که فایل device برامون فراهم میکنه آشنایی پیدا کردید، الان میخواهیم تمرین کنیم که چطور باید از این امکانات استفاده کرد. در ادامه با استفاده از فایل device لایه ی نرم افزاری CMSIS پروژه ی led چشمک زن رو با استفاده از میکروکنترلر STM32F103C8 که روی برد blue pill  هست انجام میدیم. آند led سبز رنگ روی برد blue pill به 3.3v و کاتدش با یک مقاومت به پین PC13 میکروکنترلر STM32F103C8 متصل شده.

led سبز رنگ روی برد blue pill میکروکنترلر stm32f103c8

با توجه به اینکه پین PC13 از پینهای پریفرال GPIOC هست، برای تنظیم این پین در حالت خروجی و صفر و یک کردن پین، باید از پریفرال GPIOC استفاده کنیم و عدد ذخیره شده در رجیسترهاش رو تغییر بدیم. همچنین قبل از استفاده از هر پریفرال باید کلاک پریفرال رو با استفاده از پریفرال RCC فعال کرد. 

برای انجام پروژه ی  led چشمک زن باید تغییرات زیر رو در رجیستر ها اعمال کنیم. برای اینکه بفهمید چرا باید این کارها رو انجام بدیم به مقاله ی ” آموزش STM32 : برنامه نویسی رجیستری ” رجوع کنید.

تغییرات در رجیسترها برای پروژه ی led چشمک زن با میکروکنترلر STM32F103C8

برای تنظیم پریفرال ها باید بیت های رجیسترهای اونها رو تغییر بدیم، یعنی باید بیت های مشخصی رو صفر یا یک کنیم. برای یک کردن بیت در رجیستر، رجیستر رو با ماسک بیت bitwise OR assignment میکنیم و برای صفر کردن یک بیت در رجیستر ، رجیستر رو با نات ماسک بیت ، bitwise AND assignment میکنیم. برای اطلاع از جزئیات این عملیات ها به مقاله ی ” کاربرد عملگرهای بیتی ” رجوع کنید.

عملگرهای بیتی bitwise OR assignment و bitwise AND assignment برای یک و صفر کردن بیت

بخش بزرگی از کاری که در برنامه نویسی میکروکنترلرها انجام میدیم تنظیم پریفرال هاست. برای تنظیم پریفرالها باید محتویات آدرس های مشخصی در حافظه که رجیسترهای پریفرال ها هستند رو تغییر بدیم. لایه ی نرم افزاری CMSIS امکانات مورد نیاز برای دسترسی و تغییر رجیسترهای پریفرال ها رو برامون فراهم میکنه. در ادامه بررسی میکنیم که چطور باید از این امکانات استفاده کرد. برای دسترسی به رجیسترها ، ابتدا اسم پریفرال رو بنویسید که یک پوینتر به استراکچر هست. بعد از پوینتر به استراکچر عملگر پیکان میذاریم تا به اعضای استراکچر دسترسی پیدا کنیم. بعد از عملگر پیکان اسم رجیستری که میخواهید بهش دسترسی پیدا کنید رو مینویسد و اینطوری با استفاده از پوینتری که لایه ی نرم افزاری CMSIS برامون فراهم کرده به رجیسترهای پریفرال ها دسترسی پیدا میکنیم. 

در قدم اول باید بیت چهار رجیستر RCC_APB2ENR رو یک کنیم. برای دسترسی به این رجیستر ابتدا اسم پریفرال رو مینویسیم در اینجا RCC ، که پوینتری هست که فایل device لایه ی نرم افزاری CMSIS برامون فراهم کرده. بعد از پوینتر به استراکچر عملگر پیکان ( arrow operator ) میذاریم تا به اعضای این استراکچر که رجیسترهای پریفرال RCC هستند دسترسی پیدا کنیم و رجیستر APB2ENR رو انتخاب میکنیم. برای یک کردن بیت چهار باید رجیستر رو Bitwise OR assignment کنیم با ماسک بیت چهار.

یک کردن بیت 4 در رجیستر RCC_APB2ENR

برای ساخت ماسک بیت چهار باید عدد یک رو left shift چهار بدیم ولی لازم نیست خودمون این کار رو بکنیم، چون لایه ی نرم افزاری CMSIS ماسک بیتها رو برامون define کرده. ماسک بیت ها با فرمول زیر define شده.

فرمول ماسک بیت ها در لایه ی نرم افزاری CMSIS
ماسک بیت ها در لایه ی نرم افزاری CMSIS

برای تغییر بیت های یک رجیستر از دو ابزار که فایل stm32f103xb.h برامون فراهم کرده استفاده میکنیم. یکی پوینتر و دیگری ماسک بیت. 

پوینتر و ماسک فراهم شده توسط لایه ی نرم افزاری CMSIS برای برنامه نویسی رجیستری STM32

پس از فعال سازی کلاک پریفرال GPIOC برای تنظیم پین PC13 در حالت خروجی با سرعت 2MHz باید بیت های MODE13 در رجیستر GPIOC_CRH رو 10 کنیم، یعنی بیت 20 باید صفر و بیت 21 باید یک بشه. برای دسترسی به رجیستر GPIOC_CRH ابتدا اسم پریفرال رو مینویسیم یعنی GPIOC که یک پوینتر به استراکچر هست، بعد از اون عملگر پیکان ( Arrow operator ) میذاریم تا به اعضای استراکچر دسترسی پیدا کنیم. برای یک کردن بیت 20 ، رجیستر رو با ماسک بیت بیست Bitwise OR assignment میکنیم. برای صفر کردن بیت 21 ، رجیستر رو با نات ماسک این بیت Bitwise AND assignment میکنیم.

تغییر بیت های MODE13 در رجیستر GPIOC_CRH

MODE13 دو بیت شامل بیت های 20 و 21 هست. GPIO_CRH_MODE13 ماسک بیت های 20 و 21 ،   GPIO_CRH_MODE13_0 ماسک بیت 20 و GPIOC_CRH_MODE13_1 ماسک بیت 21 هست.

تعریف ماسک بیت های MODE13 در لایه ی نرم افزاری CMSIS

برای تنظیم پین PC13 در حالت خروجی Open drain باید در بیت های CNF13 عدد 01 ثبت بشه ، یعنی بیت 23 صفر و بیت 22 یک میشه. 

تغییر بیت های CNF13 در رحیستر GPIOC_CRH

تا اینجا پین PC13 در حالت خروجی Open drain تنظیم شده. در قدم بعدی در حلقه ی بینهایت باید متناوبا خروجی پین رو صفر و یک کنیم تا led چشمک زن بشه. برای یک شدن خروجی پین PC13 و خاموش شدن led باید بیت 13 رجیستر GPIOC_ODR یک بشه و برای صفر شدن خروجی پین PC13 و روشن شدن led بیت 13 رجیستر GPIOC_ODR باید صفر بشه. بعد از صفر و یک کردن خروجی یک تابع تاخیر که با دو for نوشته شده رو فراخوانی میکنیم. پروژه ی led چشمک زن با لایه ی نرم افزاری CMSIS به پایان رسید.

پروژه ی led چشمک زن با لایه ی نرم افزاری CMSIS

ساخت فایل device جدید با امکان دسترسی به بیت ها

یادگرفتید که چطور باید از پوینترها و ماسک های بیت که لایه ی نرم افزاری CMSIS برامون فراهم میکنه استفاده کنیم و بیت های رجیسترهای پریفرال ها رو تغییر بدیم. در قدم بعد قراره یک فایل جدید بسازیم که جایگزین فایل device قبلی بشه. فایل جدید با پوینتر های متفاوت امکان دسترسی مستقیم به بیت ها رو برامون فراهم میکنه و برای تغییر بیت ها دیگه به عملگرهای بیتی و ماسک بیت هم نیاز نداریم. برای ساخت فایل جدید به فایل STM32F103xx.svd و نرم افزار SVDConv.exe نیاز داریم و برای هر دو باید نرم افزار keil رو نصب کنید.

در قدم اول باید فایل STM32F103xx.svd رو بوسیله ی نرم افزار keil دانلود کنیم. وارد نرم افزار keil بشید و روی Pack installer کلیک کنید.

pack installer در نرم افزار keil

در پنجره ی pack installer ابتدا عبارت stm32f103 رو جستجو کنید، سپس روی stm32f103 کلیک کنید، در قدم سوم STM32F1xx_DFP رو نصب کنید. با اینکار فایل STM32F103xx.svd دانلود میشه.

نصب DFP در نرم افزار keil

به پوشه keil_v5 که نرم افزار keil اونجا نصب شده برید. برای من این پوشه در درایو c هست. در این پوشه فایل STM32F103xx.svd رو جستجو کنید. فایل مورد نظر رو کپی کنید.

به پوشه ی UV4 در پوشه ی keil_v5 برید و فایل STM32F103xx.svd رو paste کنید. نرم افزار SVDConv.exe که برای ساخت فایل device جدید ازش استفاده میکنیم در این پوشه قرار داره.

جهت استفاده از نرم افزار SVDConv.exe باید از command prompt استفاده کنیم. command prompt رو باز کنید، دستور cd رو بنویسید و مقابلش آدرس پوشه ی UV4 رو بنویسید و enter بزنید تا در command prompt وارد این پوشه بشید.

برای باز کردن نرم افزار SVDConv.exe اسمش رو بنویسید و enter بزنید. این نرم افزار جهت ساخت فایل های header استفاده میشه. برای ساخت فایل جدید مطابق مثال ابتدا باید اسم نرم افزار رو بنویسیم یعنی SVDConv.exe سپس اسم فایل .svd که میشه STM32F103xx.svd که در پوشه ی UV4 قرار دادیم و سپس آپشن. آپشن مشخص میکنه چجور فایلی میخواهیم بسازیم.

SVDConv.exe برای ساخت فایل های header لایه ی نرم افزاری CMSIS

مطابق نمونه ابتدا اسم نرم افزار SVDConv.exe رو مینویسید، سپس اسم فایل STM32F103xx.svd سپس آپشن fields=struct-ansic– و enter بزنید.

استفاده از SVDConv.exe برای ساخت فایل های header لایه ی نرم افزاری CMSIS

اگر مطابق آموزش پیش رفته باشید error و warning نخواهید داشت و فایل STM32F103xx به پوشه ی UV4 اضافه میشه. این فایل CMSIS جدید هست که قراره جایگزین فایل device قبلی کنیم. این فایل رو از پوشه ی UV4  کات کنید.

استفاده از SVDConv.exe برای ساخت فایل های header لایه ی نرم افزاری CMSIS

فایل جدید رو در پوشه include در کنار فایل device قبلی paste کنید.

با کلیک راست کردن رو فایل و انتخاب rename میتونید اسم فایل رو تغییر بدید. اسم فایل stm32f103xb.h رو به device_old.h و اسم فایل جدید STM32F103xx.h رو به device_new.h تغییر بدید. در ادامه باید فایل device_new رو جایگزین فایل device_old کنیم.

در ابتدای هر دو فایل یک typedef enum وجود داره به نام IRQn_type که شماره ی اینتراپت ها رو تعریف کرده، از فایل قدیمی IRQn_Type رو کپی کنید و جایگزین IRQn_Type فایل جدید کنید. بعد از IRQn_Type دو تا include در فایل جدید وجود داره ، پاکشون کنید. 

در فایل قدیمی بعد از IRQn_Type سه تا include وجود داره، این سه تا رو کپی کنید و در فایل جدید بعد از IRQn_Type قرار بدید.

در فایل main خط های کد مربوط به پروژه ی led رو که با استفاده از فایل device قدیمی انجام دادیم پاک کنید و در ابتدای فایل main فایل device_new.h رو include کنید. کد رو کامپایل کنید و در پنجره ی problems روی error اول کلیک کنید. 

خطاهای تعریف دوباره ی NVIC_Type

در فایل device_new.h یک نوع استراکچر به نام NVIC_Type وجود داره ( که بیشتر از 250 خطه )، پاکش کنید و کد رو دوباره کامپایل کنید.

نوع استراکچر NVIC_Type در فایل device لایه ی نرم افزاری CMSIS

دو warning هم وجود داره که مربوط به تعریف مجدد NVIC_BASE و NVIC هست، وقتی روی warning ها کلیک کنید به مکان definition در فایل device_new میرید. در فایل device_new تعریف NVIC_BASE و NVIC رو پاک کنید. کد رو دوباره کامپایل کنید. الان فایل جدید قابل استفاده است. در قدم بعد فایل جدید رو بررسی میکنیم و در ادامه پروژه ی led چشمک زن رو با فایل جدید انجام میدیم.

الان فایل جدید قابل استفاده است. به فایلهای device_old.h و stm32f1xx.h هم دیگه نیازی نداریم و میتونید پاکشون کنید. در قدم بعد فایل جدید رو بررسی میکنیم و در ادامه پروژه ی led چشمک زن رو با فایل جدید انجام میدیم.

بررسی فایل device جدید در لایه ی نرم افزاری CMSIS

حالا تفاوت فایل device_new با فایل device_old در چی هست و فایل جدید چه امکان جدیدی رو برای ما فراهم میکنه؟

فایل CMSIS جدید هم مثل فایل قبلی برامون پوینتر درست میکنه ولی مثل فایل قبلی ماسک بیت ها رو فراهم نمیکنه چون با پوینتر های جدید دیگه به ماسک بیت نیازی نداریم. مزیت فایل جدید پوینترهای متفاوتی هست که برامون فراهم میکنه. مثلا در مورد پریفرال GPIO در فایل قبلی یک نوع متغیر استراکچر قالب رجیسترهای پریفرال GPIO وجود داشت به نام GPIO_TypeDef ، این نوع استراکچر 7 تا عضو از نوع uint32_t داشت که رجیسترهای پریفرال GPIO بودند. در فایل جدید قالب رجیسترهای پریفرال های GPIO یک نوع استراکچر داریم به نام GPIOA_Type . این نوع استراکچر 7 تا عضو union داره و رجیسترهای پریفرال GPIO اینجا هر کدوم یک union هستند برای اینکه به دو شکل بتونیم به رجیستر دسترسی داشته باشیم. هر کدوم از union ها دو عضو دارند، یک عضو با نوع uint32_t به نام reg و یک عضو استراکچر به نام bit با اعضای bitfield که قالب بیت های هر رجیستر طراحی شده. 

پروژه ی led چشمک زن با فایل device جدید

قراره دوباره پروژه ی led چشمک زن با میکروکنترلر STM32F103C8 روی برد Blue pill رو اینبار با استفاده از فایل CMSIS جدید انجام بدیم. تغییرات زیر رو باید در رجیسترها اعمال کنیم.

تغییرات در رجیسترها برای پروژه ی led چشمک زن با میکروکنترلر STM32F103C8

برای فعالسازی کلاک پریفرال GPIOC باید بیت 4 در رجیستر APB2ENR در پریفرال RCC رو یک کنیم. مشابه قبل ابتدا اسم پریفرال یعنی RCC رو مینویسیم، RCC یک پوینتر به استراکچر با نوع RCC_Type * هست ، بعدش عملگر پیکان میذاریم تا به اعضای استراکچر دسترسی پیدا کنیم. رجیستر APB2ENR یکی از عضو های این استراکچر هست. وقتی از فایل device_old استفاده میکردیم APB2ENR از نوع uint32_t بود ولی اینجا APB2ENR خودش یک union هست. برای دسترسی به اعضای union بعدش عملگر دات ( . ) میذاریم. اگر بخواهیم به رجیستر APB2ENR بصورت 32 بیتی مشابه قبل دسترسی پیدا کنیم عضو reg رو انتخاب میکنیم و اگر بخواهیم به بیت های رجیستر APB2ENR دسترسی پیدا کنیم عضو بیت رو انتخاب میکنیم.

برای دسترسی به بیت های رجیستر APB2ENR عضو بیت رو انتخاب کنید، عضو بیت خودش یک استراکچره که قالب بیت های رجیستر APB2ENR طراحی شده. برای دسترسی به بیت ها بعد از استراکچر عملگر دات ( . ) میذاریم و اینطوری میتونیم به بیت های رجیستر ها به صورت مستقیم در زبان سی دسترسی پیدا کنیم.

برای فعالسازی کلاک پریفرال GPIOC باید بیت IOPCEN رو در رجیستر APB2ENR یک کنیم. برای دسترسی به بیت IOPCEN بعد از استراکچر bit عملگر دات میذاریم و بعد اسم بیت IOPCEN رو مینویسیم ، برای یک کردن این بیت کافیه از عملگر assignment ( = ) استفاده کنیم تا عدد 1 رو در این بیت ثبت کنیم. همونطور که میبینید دیگه به عملگرهای بیتی و ماسک بیت نیازی نیست و میشه مستقیم عدد رو در بیت نوشت. 

در قدم بعد باید پین PC13 رو در حالت خروجی تنظیم کنیم، برای اینکار در رجیستر CRH از پریفرال GPIOC باید در بیت های MODE13 مقدار 10 ثبت بشه بیت 20 صفر و بیت 21 باید یک بشه. برای دسترسی به بیت های MODE13 ابتدا اسم پریفرال رو مینویسیم یعنی GPIOC که یک پوینتر به استراکچر هست ، بعد از اون عملگر پیکان میذاریم. سپس اسم رجیستر رو مینویسیم که یک یونیون هست یعنی CRH ، بعد از CRH عملگر دات میذاریم تا به اعضای یونیون دسترسی پیدا کنیم. عضو bit رو انتخاب میکنیم چون میخواهیم به بیت های رجیستر CRH دسترسی پیدا کنیم. عضو bit خودش یک استراکچر هست که اعضاش بیت های رجیستر CRH هستند. بعد از bit عملگر دات میذاریم تا به اعضای استراکچر bit دسترسی پیدا کنیم. بعد از دات اسم بیت یا گروه بیت هایی که میخواهیم بهشون دسترسی پیدا کنیم مینویسیم. اینجا باید بیت های MODE13 رو تغییر بدیم و عدد 10 در مبنای دو رو در این بیت ها ثبت کنیم. 10 در مبنای دو میشه 2 در مبنای 10. پس عدد 2 رو در بیت های MODE13 مینویسم تا پین PC13 در حالت خروجی با کمترین سرعت نتظیم بشه.

در ادامه برای تنظیم پین PC13 در حالت خروجی open drain باید در بیت های CNF13 در رجیستر CRH از پریفرال GPIOC عدد 01 ثبت بشه، یعنی بیت 22 یک و بیت 23 باید صفر بشه. عدد 01 در مبنای دو هست و در مبنای 10 میشه 1 ، پس عدد 1 رو در بیت های CNF13 مینویسیم.

تا اینجا نتظیمات مورد نیاز برای اینکه پین PC13 در حالت خروجی باشه رو انجام دادیم. برای چشمک زن شدن led که به پین PC13 متصل شده باید این پین رو متناوبا خاموش و روشن کنیم. در حلقه ی بینهایت ابتدا خروجی PC13 رو یک میکنیم ، بعد از اون تابع تاخیر رو داریم . سپس خروجی رو صفر میکنیم و دوباره تابع تاخیر فراخوانی میشه. برای یک کردن خروجی پین PC13 باید بیت ODR13 از رجیستر ODR از پریفرال GPIOC یک بشه و برای صفر کردن خروجی این بیت باید صفر بشه. 

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

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

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

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