پروژه پروگرام و ارتقای برنامه میکروهای stm32 توسط usb flash
با سلام خدمت دوستان عزیز و تولید کننده.
گفتم تولید کننده چون این پروژه که الان خدمتتون معرفی میکنم بسیار بسیار کاربردی و ضروری هستش برای تولید محصولات.
شما فرض کنید محصولی تولید کردین و رسیده دست مشتری حالا لازمه دستگاه رو آپگرید کنید.قطعا ممکن نیست که همه دستگاهارا جمع آوری کنید و مجددا پروگرام کنید، در اینجا کافیست شما یه یک فایل bin به کاربر بفرستید و کاربر آنرا به فلش انتقال دهد و به usb دستگاه متصل کند.دستگاه پروگرام و آپگرید میشود،اما چطور؟؟؟
نکته مهم:این قابلیت تنها توسط میکروهایی که دارای usb HOST هستند پشتیبانی میشود چراکه فلش نیاز به این بخش دارد به همین جهت ما از یک میکروی stm32f407 استفاده خواهیم کرد.
روش کار به این صورت است که ابتدا برنامه ای به صورت بوتلودر با حداقل حجم برای میکرو نوشته میشود که داخل برنامه آن یک دکمه فشاری به نام آپگرید تعریف شده ، یا اینکه اگر از lcd tft استفاده میکنید کدی در حد راه اندازی تاچ و lcd قرار دارد تا عملیات اپگرید توسط تاچ روی lcd انجام شود.
پس از اینکه برنامه بوتلودر نوشته شد مثلا حجم برنامه تولیدی بوتلودر ۴۰ کیلوبایت شده است این ۴۰ کیلوبایت در میکرو ادرس حافظه فلش میکرو را به صورت دائمی اشغال میکند و شما در ادامه نباید روی این بخش از ادرس رید و رایتی انجام دهید که با انجام تنظیماتی به صورت خودکار این کار انجام می شود.
در ادامه شما باید برنامه ای تنظیم کنید که کد را در ادامه ۴۰ کیلوبایت بوت لودر قرار دهد برای اینکار تنظیماتی در نرم افزار کیل نیز انجام می شود.
در بخش زیر من تمامی تنظیمات بخش بوتلودر و برنامه منطبق بر بوتلودر را خدمتتون عرض میکنم:
——————–تغييرات در برنامه بوتلودر———————————————
ابتدا با کیوب یک برنامه رید و رایت فلش usb بسازید و تستش کنید(در اخر مطلب براتون قرار دادم).
داخل فايل flash.f متغيير زير بايد مطابق با ادرس انتهايي يا حجم فايل باينري بوتلودر باشد چون برنامه اصلی انتهاي برنامه اين ادرس است.
#define APPLICATION_ADDRESS (uint32_t)0x0800C000
حجم باينري بوتلودر من حدود ۳۴ کيلوبايت شد اما من بيشتر حدود ۴۸ کيلوبايت در نظر گرفتم.
براي تغييرات احتمالي در اينده در برنامه بوتلودر که مدام نخواهم ادرس هارا عوض کنم.
بنابراين
در اينجا حجم باينري بوتلودر در نظر گرفته ما ۴۸کيلوبايت به صورت هگز مانند زير است:
۴۸ x 1024=dec=49152,hex=c000
حالا مقدار APPLICATION_ADDRESS را اين در نظر گرفتيم(به بخش ۰۸۰۰ دست نزنید).
۰x0800C000
——————————تغييرات برنامه اصلي منطبق بر بوتلودر ———————————–
در تنظيمات کيل بايد دو مقدار تغيير کند
۱- ادرس شروع حافظه
۲- تعداد کل حافظه باقي مانده
ميکرو مورد استفاده ما stm32f407vg و مقدار ۱۰۲۴ کيلوبايت حافظه فلش دارد.
و ما مقدار ۴۸ کيلوبايت آن را براي برنامه بوتلودر استفاده کرديم که در نهايت مقدار ۹۷۶ کيلوبايت ما حافظه در دسترس داريم:
۹۷۶ x 1024=999424 ,hex=F4000
پس دو مقدار تنظيمات در کيل براي استارت داريم ۰x0800C000 که ادرس شروع حافظه است.
و حافظه اي که در اختيار داريم ۰xF4000 است.
تغيير بعدي در فايل system_stm32f4xx.c است
که بايد مقدار افست را به این صورت تنظيم کنيم
#define VECT_TAB_OFFSET 0x0800C000
تمام
حال شما در ابتدا برنامه بوتلودر را روی میکرو با stlink پروگرام کنید،
و در ادامه ، در برنامه اصلی کد زیر را در بخش تنظیمات User کیل قرار دهید تا برای شما کد باینری تولید شود:
1 |
$K\ARM\ARMCC\bin\fromelf.exe --bin --output=@L.bin !L |
نکته:تمام این مراحل را من در پروژه برای شما انجام دادم فقط دانلود و استفاده کنید.
پس از اینکه کد باینری تولید شد، نام آن را به صورت upgrade.bin تغییر دهید و داخل فلش بریزید و دکمه PC0 را بزنید و درحالت فشرده نگه دارید و سپس میکرو را ریست کنید میکرو پس از شروع کار مجدد میبیند که پایه صفر شده وارد تابع خواندن فلش و خواندن فایل upgrade.bin می شود و فایل باینری را روی فلش خود مینویسید.
از یوزارت یک میکرو میتوانید جهت نمایش لاگ میکرو استفاده کنید و تمامی مراحل برای شما پرینت می شود.
تمامی کد ها توسط توابع هال و کیوب و کامپایلر کیل نوشته شده است.
در کدی که در زیر براتون قرار دادم lcd tft ili9486 به طور کامل راه اندازی شده و میتونید از کدش استفاده کنید و استفاده از lcd کاملا اختیاری هستش درایورش روو به عنوان یک هدیه براتون قرار دادم هم در کد اصلی و هم در کد بوتلودر.
در کد اصلی علاوه وجود کتابخونه lcd براتون واحد فلش و uSD روهم راه اندازی کردم که عکس از روی فلش و uSD خوانده میشود و روی lcd نمایش داده میشود که در این مطلب فیلم راه اندازی آن را خواهید دید.
سوالی داشتین تلگرام در خدمتم.
امیدوارم براتون مفید باشه و پروژه رو میتونید از لینک زیر تهیه کنید: