این پروژه دو مقدار نمونه را در آخرین صفحهٔ Flash نگه میدارد. برای کار به برد GB100ST V2.0 و پروگرامر SWD نیاز دارید. ذخیرهسازی به فرمان دستی در دیباگر وابسته است؛ روشنشدن یا Reset خودکار چیزی نمینویسد و پاک نمیکند.
پروژه و IOC در lesson-32-projects.zip و ELF/MAP همان ساخت در lesson-32-build-artifacts.zip است. در MAP ناحیهٔ برنامه 126 KiB و ناحیهٔ SETTINGS برابر 2 KiB از 0x0801F800 تا 0x0801FFFF است. بهکارگیری NOLOAD به معنای حفاظت در برابر Mass Erase پروگرامر نیست. هنگام پروگرام، تنظیمات پاککردن ابزار را بررسی کنید؛ نوشتن دوبارهٔ firmware ممکن است دادهٔ آموزشی را پاک کند.
پس از اجرای برنامه، requested_period_ms را مثلاً 750 و requested_threshold را 3000 قرار دهید. سپس flash_command را 0x53415645 بگذارید و اجرا را ادامه دهید. برنامه فرمان را صفر میکند و فقط یک بار ذخیره را میکوشد. نتیجه را در last_store_status، last_hal_status، last_flash_error و last_failed_address بخوانید. موفقیت STORE_OK=0 است. پس از Reset و بدون پروگرام دوباره، active_period_ms و active_threshold باید از آخرین رکورد معتبر بازیابی شوند؛ این رفتار هنوز روی برد مشاهده نشده است.
بازهٔ مجاز period از 100 تا 5000 و threshold از 0 تا 4095 است. این دو فقط دادهٔ تنظیماتاند؛ برنامه با آنها تایمر یا ADC راهاندازی نمیکند. PB6 فقط وجود حداقل یک رکورد معتبر را با High نشان میدهد.
هر رکورد 16 بایت و صفحه دارای 128 جایگاه است. رکورد نیمهنوشته کنار گذاشته میشود؛ اسکن از فاصلههای خالی هم عبور میکند. پرشدن صفحه STORE_FULL=2 برمیگرداند و چیزی را خودکار پاک نمیکند. فقط اگر از حذف همهٔ تنظیمات این صفحه مطمئن هستید، فرمان 0x45524153 را در flash_command بگذارید. این فرمان دقیقاً همان یک صفحه را پاک میکند. پس از آن مقادیر پیشفرض 500 و 2048 بازیابی میشوند و PB6 Low است.
HSI باید برای نوشتن و پاکسازی Flash روشن بماند. در شروع عادی از Reset، HSI روشن است و این پروژه آن را پس از انتخاب HSE/PLL خاموش نمیکند؛ تغییر این شرط در نسخهٔ مشتق نیازمند بررسی دوباره است.
هفت نیمکلمهٔ بدنه با خواندن دوباره کنترل میشوند؛ سپس نشانگر 0xA55A در آفست 14 نوشته میشود. اعتبار رکورد به نشانگر، checksum و حدود فیلدها وابسته است. checksum مکمل جمع 16 بیتی است، CRC یا تضمین کشف همهٔ خرابیها نیست. شمارنده از 1 تا 65534 است و در انتها بهجای سرریز، ذخیره رد میشود.
این الگو تضمین تحمل قطع برق نیست؛ قطع تغذیه هنگام Erase تکصفحهای میتواند همهٔ نسخهها را از بین ببرد. در مدل، قطع بین نیمکلمههای کامل بررسی میشود، نه رفتار فیزیکی قطع برق وسط یک نوشتن. HAL timeout هم هنگام توقف واکشی Flash یک کران مستقل زمانی نیست. وقفهها فعال میمانند و نوشتن در main است.
last_page_error آدرس صفحهٔ ناموفق است، نه شمارهٔ آن. HAL_ERROR همراه PGERR یا WRPERR را با منبع HAL بررسی کنید؛ ردشدن محافظ نرمافزاری یا نابرابری خواندن دوباره ممکن است بدون فلگ سختافزاری باشد. خطای ورودی، صفحهٔ پر و حد شمارنده پیش از Unlock رد میشوند؛ تمام مسیرهای پس از تلاش Unlock قفل میشوند. Option Bytes و Mass Erase در برنامه استفاده نشدهاند.
مصرف لینکشدهٔ SRAM اصلی 1672 بایت و Flash برنامه 10520 بایت است. 2048 بایت SETTINGS رزرو است و نباید به SRAM اضافه شود. مشخصات سازنده برای CBT6 حداقل 10 kcycles در محدودهٔ دمایی مربوط است؛ حاصلضرب 128 رکورد در 10000 پاکسازی فقط محاسبهٔ نمونه است، عمر تضمینشده نیست.
برای کنترل فایلها و محاسبات، Python 3 را روی verify_model.py اجرا کنید؛ به کتابخانهٔ اضافه نیاز نیست و inspect_elf.py باید کنار آن باشد. این کنترلها اجرای firmware را شبیهسازی نمیکنند. نتایج و آدرسها در model-results.json و elf-placement.json ذخیره میشوند.
برای ساخت از پروژهٔ استخراجشده CMake preset Debug استفاده کنید: cmake --preset Debug سپس cmake --build --preset Debug --clean-first. GCC ARM و CMake و Ninja باید نصب باشند. اگر از CubeMX کد را دوباره تولید کردید، تغییر دستی لینکِر و سیاست -Wall -Werror را با نسخهٔ همراه تطبیق دهید. این بسته پروژهٔ CMake است؛ ورود یا ساخت GUI در CubeIDE آزمایش نشده است.
تولید واقعی CubeMX و کامپایل پاک بدون هشدار انجام شده است؛ اجرای برد، پروگرام، GUI و اندازهگیری فیزیکی انجام نشده است. CubeMX 6.14.0/DB6.0.140، CubeF3 V1.11.6 و GCC 13.2.1 با -O0 -g3 -Wall -Werror به کار رفتهاند. شناسههای دقیق منابع، دستور کامپایل، هشها و گزارش ساخت در toolchain-and-validation.json و build-report.txt هستند. مجوزهای ST و CMSIS در ZIP پروژه حفظ شدهاند.