آموزش میکروکنترلر STM32F4 – قسمت هفتم ;
در قسمت ششم آموزش میکروکنترلر STM32F4 به مبحث وقفهها پرداختیم. در این قسمت از آموزش میکروکنترلر STM32F4 به تنظیمات و بارگذار بوت و حافظه مستعار میپردازیم. با سیسوگ همراه باشید.
تنظیمات بوت
بارگذار بوت برنامهای است که در قسمت حفاظت شده از حافظه قرار دارد و اولین برنامهای است که پس از روشن شدن یا بازنشانی اجرا میشود. وظیفه این برنامه محدود است و معمولاً محدود به ارتباط با دنیای خارج با استفاده از پروتکلهای ارتباطی (UART، I2C، SPI، اترنت) و دانستن نگاشت حافظه میکروکنترلر است. این برنامه با دنیای خارج، یا یک میزبان مرتبط میشود، فایل داده را از میزبان میگیرد و میکروکنترلری که در آن مستقر است، به روز میکند تا برنامه جدیدی که گرفته است اجرا کند.
بیشتر میکروکنترلرهای جدید توانایی نوشتن روی فلش خود را نیز دارند. فرایند نوشتن روی فلش خود، ممکن است چند ثانیه طول بکشد. وقتی بارگذاری بوت انجام شد، بارگذار باید تصویر بوتپذیر را اعتبارسنجی کند و کنترل را به کد بوتپذیر بدهد. اشارهگرها به وقفهها باید تنظیم شود. معمولاً یک بارگذار بوت یک بازنشانی نرم انجام میدهد تا اجازه دهد که برنامه اصلی کنترل را به دست بگیرد.
از آنجا که برنامه بوت بارگذار در کارخانه در دستگاه نوشته میشود و هدف اصلی استفاده از دستگاه نیست به عنوان بالاسری حساب میشود. بین مزایا و حجمی که اشغال میکند باید برآوردی توسط طراح انجام شود. بسیاری از طراحان سعی میکنند حجم این برنامه را تا جای ممکن کوچک کنند تا حافظه برنامه بیشتر شود. یک بوت بارگذار دست کم باید این قسمتها را داشته باشد:
کانال ارتباطی، برنامهای برای پاک کردن و برنامه ریختن روی فلش، و برنامهای برای اعتبار سنجی و اجزای برنامه جدید. به علاوه باید بتواند خطاهای هنگام عملیات بارگذاری بوت را تشخیص دهد، گزارش دهد و اداره کند. این خطاها ممکن است قطع توان، قطع ارتباط، خطای نوشتن روی فلش باشد. برای جلوگیری از خطای نوشتن در فلش معمولاً از یک کد بررسی افزونگی چرخشی CRC استفاده میشود.
قبل از شروع ارتباط بیتهای CRC صفر میشوند و با دریافت فایل محاسبه CRC انجام میشود و در صورتی که اشتباهی رخ داده بود مراحل بعدی عملیات بارگذاری بوت انجام نمیشود، بلکه با ارتباط با میزبان تقاضای ارسال مجدد برنامه را میکند.
یک مورد دیگر، نوشتن ناخواسته روی قسمت بوت بارگذار است. دراین صورت بار بعدی که پردازنده بوت میشود، بوت بارگذار خراب است. حاصل کار در این صورت نامشخص است، ممکن است امکان ارتباط با میزبان نباشد یا کنترل به برنامه بوتپذیر معتبر قبلی منتقل نشود. در هر دو صورت نیاز به رفتن یک نیروی انسانی به محل برای رفع مشکل و برنامه ریزی دستی میکرکنترلر است که کل هدف را زیر سوال میبرد. به همین دلیل باید برای این منظور ملاحظات لازم در حافظه صورت گیرد. گاهی نیز برنامه بارگذار بوت را در یک حافظه دائمی ROM که جدا از فلش است میریزند.
بارگذار بوت داخلی
دو روش برای اجرای بارگذار بوت وجود دارد. یک روش استفاده از برنامه بارگذار بوت است که معمولاً در قسمتی از ROM سیستم در کارخانه و هنگام ساخته شدن میکروکنترلر قرار داده میشود. این برنامه با روشن شدن میکروکنترلر به شرط تنظیم بعضی از پایهها یا رجیسترهای داخلی، اجرا میشود. اگر پایهها یا رجیسترهای داخلی برای اجرای برنامه بارگذار بوت تنظیم نشده باشد، برنامه کاربردی عادی میکروکنترلر که معمولاً در آدرس صفر فلش قرار دارد، اجرا میشود. با اجرای برنامه بارگذار بوت، یک کانال ارتباطی با دنیای خارج نیز برقرار میشود که ممکن است ارتباط سریال، spi، اترنت و … باشد. سپس طبق پروتکل خاصی که کارخانه سازنده تعیین کرده است دادهها به میکروکنترلر منتقل میشود و برنامه بارگذار بوت این دادهها را که برنامه جدید است در حافظه فلش می نویسد. معمولاً کارخانه سازنده یک برنامه، برای سمتِ کامپیوتر شخصی نیز، ارائه میدهد که این پروتکل را در آن اجرا کرده است و برنامه جدید کاربر را به کمک این برنامه به میکروکنترلر منتقل میکند.
بارگذار بوت STM32f429
نگاشت حافظه این میکروکنترلر ثابت است و ناحیه کد (برنامه) از آدرس 0x0000 0000 شروع میشود و از طریق باسهای ICode و DCode در دسترس است. در حالی که ناحیه داده (SRAM) از آدرس 0x2000 0000 شروع میشود و ازطریق باس سیستم، در دست است. پردازنده کورتکس M4، بردار بازنشانی را از باس ICode واکشی میکند. بنابراین تنها در ناحیه کد میتوان حافظه بوت را در نظر گرفت. به طور معمول همانطور که میدانیم این ناحیه در حافظه فلش است. برای اینکه بتوان از ناحیههای دیگر مانند SRAM بوت کرد مکانیزمی به نام حافظه مستعار (Alias memory) استفاده میشود که بعدتر توضیح داده میشود. با استفاده از پایههای [BOOT[1:0 میتوان از بین سه نوع حالت بوت، انتخاب کرد.
مقدارهای این پایهها در 4-امین لبه بالارونده ساعت SYSCLK، بعد از بازنشانی خوانده میشود. پایه BOOT0 اختصاصی است اما پایه BOOT1، پایه ورودی/خروجی هم میتواند باشد که پس از انجام عملیات بازنشانی و بوت میتوان از عملکرد این پایه استفاده کرد.
وقتی میکروکنترلر از حالت آماده به کار (Standby) نیز خارج میشود پینهای بوت بررسی میشوند و باید در حالت مورد نظر کاربر باشند وگرنه مطابق جدول بالا به حالتی که مقدار پایهها میگوید خواهد رفت. با خروج از حالت آماده به کار، پردازنده مقدار آدرس بالای پشته را از 0x0000 0000 میخواند و اجرای کد را از حافظه بوت که از 0x0000 0004 شروع میشود آغاز میکند.
در حالتی که بوت از طریق SRAM انجام میشود باید در کد آغازسازی برنامه، با استفاده از جدول استثنائات NVIC و رجیستر دویدگی (offset)، جدول بردار را به درون SRAM جابجا کنید.
وقتی از حافظه فلش اصلی میکروکنترلر، بوت انجام میشود میتوان از بانک 1 یا بانک 2 این کار را انجام داد که پیش فرض بانک 1 است. برای انتخاب بانک 2 باید بیت BFB2 را در بایتهای گزینشی کاربر یک کرد. در این حالت، میکروکنترلر از حافظه سیستم بوت میشود و بارگذارنده بوت، به بانک 2 فلش برای اجرای کد میپرد.
بارگذار بوت
بارگذار بوت تعبیه شده دراین میکروکنترلر، برای بازنویسی برنامه حافظه فلش، با استفاده از رابط های زیر است:
- USART1 پایه های PA9/10
- USART3 پایه های PB10/11و PC10/11
- CAN2 پایه های PB5/13
- USB OTG FS پایه های PA11/12 در حالت وسیله (DFU روزآمد کردن سفت افزار وسیله)
- I2C1/I2C2/I2C3/SPI1
- SPI2/ SPI4
بازنگاشت فیزیکی (حافظه مستعار)
وقتی که پینهای بوت انتخاب شدند، برنامه کاربردی میتواند حافظه را در ناحیه کد تغییر دهد (در این حالت کد میتواند از طریق باس ICode به جای باس سیستم اجرا شود) این تغییر با برنامهریزی رجیستر SYSCFG_MEMRMP در کنترلگر SYSCFG انجام میشود.
این حافظهها را میتوان بازنگاری کرد:
- حافظه فلش اصلی
- حافظه سیستم
- SRAM1 تعبیه شده (KB112)
- بانک 1 FMC (NOR/PSRAM1)
- بانک 1 SDRAM کنترلگر حافظه انعطاف پذیر
رجیستر SYSCFG_MEMRMP وظیفه انجام بازنگاری حافظه را به عهده دارد. سه بیت این رجیستر برای حافظهای که باید در آدرس 0x0000 0000 قابل دسترسی باشد به کار میروند. این بیتها برای بازنگاری فیزیکی توسط نرم افزار هستند و بنابراین پایههای BOOT را کنار میگذراند.
بعد از بازنشانی، این بیتها مقدار انتخاب شده توسط پایههای BOOT را میگیرند. وقتی بوت از طریق فلش اصلی انجام میشود و پایههای BOOT برابر 10 هستند یعنی BOOT1=1 و BOOT0=0 است این رجیستر مقدار 0x00 را میگیرد.
سایر بیتهای این رجیستر برای تاخت زدن بانکهای FMC و فلش به کار میروند. دو حالت بازنگاری FMC در آدرس 0x0000 0000 وجود دارد:
- بانک 1 (NOR/PSRAM 1 و 2) که تنها دو ناحیه اول بانک 1 بازنگاری میشود.
- بازنگاری بانک 1 FMC SDRAM
بوت شدن از حافظه SDRAM و فلشِ NOR ممکن نیست. برای این منظور باید بازنگاری نرمافزاری استفاده شود.
بیتهای 11 و 10 با نام SWP_FMC که برای تاخت زدن نگاشت حافظهی FMC به کار میروند. این بیتها توسط نرمافزار صفر و یک میشوند. برای تاخت زدن بانک 1 و 2 SDRAM با بانک 3 و 4 FMC استفاده میشوند تا بتوان اجرای کد را از بانکهای SDRAM انجام داد بدون اینکه نیاز به بازنگاری فیزیکی در آدرس 0x0000 0000 باشد. مقدار صفر در این بیتها به معنی نبود تاخت زدن حافظهی FMC است و مقدار 01 به معنی تاخت زدن حافظه بانکهای SDRAM و بانک 2 NAND و PCCARD است. به این ترتیب که بانک 1 SDRAM به بانک 2 NAND به آدرس 0x8000 0000 و بانک 2 SDRAM به آدرس PCCARD برابر با 0x9000 0000 نگاشته میشود. بانک 2 NAND و بانک PCCARD نیز به آدرسهای 0xC000 0000 و 0xD000 0000 نگاشته میشود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | Bit 8 FB_MODE: Flash Bank mode selection Set and cleared by software. This bit controls the Flash Bank 1/2 mapping. 0: Flash Bank 1 is mapped at 0x0800 0000 (and aliased at 0x0000 0000) and Flash Bank 2 is mapped at 0x0810 0000 (and aliased at 0x0010 0000) 1: Flash Bank 2 is mapped at 0x0800 0000 (and aliased at 0x0000 0000) and Flash Bank 1 is mapped at 0x0810 0000 (and aliased at 0x0010 0000) Bits 7:3 Reserved, muST be kept at reset value. Bits 2:0 MEM_MODE: Memory mapping selection Set and cleared by software. This bit controls the memory internal mapping at address 0x0000 0000. After reset these bits take the value selected by the Boot pins (except for FMC). 000: Main Flash memory mapped at 0x0000 0000 001: SySTem Flash memory mapped at 0x0000 0000 010: FMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x0000 0000 011: Embedded SRAM (SRAM1) mapped at 0x0000 0000 100: FMC/SDRAM Bank 1 mapped at 0x0000 0000 Other configurations are reserved |
با این ماکروها در HAL میتوان عملیات بازنگاری حافظه را انجام داد:
- HAL_SYSCFG_REMAPMEMORY_FLASH
- HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH
- HAL_SYSCFG_REMAPMEMORY_SRAM
- HAL_SYSCFG_REMAPMEMORY_FMC
- HAL_SYSCFG_REMAPMEMORY_FMC_SDRAM
در قسمت هشتم آموزش میکروکنترلر STM32F4 به بارگذار بوت کاربر خواهیم پرداخت. با سیسوگ همراه باشید.
اصلا از سیسوگ انتظار همچین اموزش بی کیفیتی رو نداشتم
اصلا جالب نیست . نویسنده صرفا از گوگل ترنسلیت و دیتاشیت استفاده کرده ، کاش کسی که مطلب رو کامل درک کرده به فارسی روان مقاله رو قرار بده
متاسفانه نویسنده ادامه ندادن
لطفا مقاله هایی که با گوگل ترنسلیت ترجمه رو شده رو توی سایتتون قرار ندید با تشکر …..معلوم نیست چی نوشته . و منبع انگلیسی رو هم قرار بدید
دوست عزیز این مجموعه که تحت عنوان یک کناب توسط اقای مرادمند ترجمه و برگردان شده است و ما اجازه ایشون و با نام ایشون اینجا منتشر کردیم
عذرخواهی میکنیم اگر در ترجمه و انتقال مفاهیم اشتباهی وجود داره
سلام پیشنهاد میکنم این مطلب رو از سایتتون حذف کنید چون بیشتر باعث سردرگمی هست ، چون زحمات شما و وب سایت ارزشمند شما همیشه مرجع مناسبی یبرای یادگیری هست اما متاسفانه این نگارش های ضعیف صرفا باعث پایین اومدن ارزش سایتتون میشه.
مطلبی که خود نوسینده وقتی بفهمه و اون رو نگارش کنه به خودی خود به قدری جذاب و صریح خواهد بود که برای خواننده هیچ گونه جای سوالی نگذاشته باشه .اما این مطلب واقعا ترجمه افتضاحی داشت
سلام ممنون بابت فیدبکتون ما حتما این مورد را بررسی مکینیم
سلام خیلی عالی بود سپاس
فقط این که کلمات فارسی جدید باعث ابهام میشه و درک مطلب رو سخت میکنه .
سلام ممنون دوست عزیز
حق با شماست ولی این مجموعه آموزشی را نویسنده قبلا به طور کامل در اختیار ما قرار دادن و به همین دلیل نمیتونیم تغییرات زیادی در متن ایجاد کنیم. ولی باز هم سعی میکنیم تا جایی که متن دچار تغییر زیادی نشه کلمات را اصلاح کنیم.