STM32单片机,禁止系统启动时的变量初始化
使用這個功能是在IAP在線升級時需要用的。
最初使用在EEPROM或者FLASH存儲一個標(biāo)志位。程序跳轉(zhuǎn)到BootLoader,BootLoader來判斷是否需要升級。這樣是可以用的,但是這樣有個弊端:如果升級中出現(xiàn)問題,或者其他原因,導(dǎo)致主程序無法正常運(yùn)行,看門狗咬死程序,程序復(fù)位。這樣子的話,程序會一直在 ? ? 引導(dǎo)--引導(dǎo)程序檢測到不需要IAP--跳轉(zhuǎn)到應(yīng)用程序--看門狗咬死--復(fù)位--引導(dǎo),進(jìn)入死循環(huán),程序判斷不了應(yīng)用程序已經(jīng)壞掉。只能去現(xiàn)場來進(jìn)行調(diào)試設(shè)備。
使用,禁止系統(tǒng)啟動時的變量初始化。在BootLoader與應(yīng)用程序,都在同一個地址定義相同的變量,在非斷電初始化的時候,此變量是不會復(fù)位的。在BootLoader中,每初始化一次,對此變量+1,在應(yīng)用程序當(dāng)中賦值為0。當(dāng)次變量大于一定的數(shù)值的時候,則認(rèn)為應(yīng)用程序有問題,重新進(jìn)行IAP。當(dāng)應(yīng)用程序收到升級指令的時候,直接把這個變量賦值為相應(yīng)的值。
STM32的開發(fā)環(huán)境有兩種IAR與KEIL,這兩種的禁止系統(tǒng)啟動時的變量初始化的方式也是不同的。
方法如下:
IAR
直接定義變量: 在什么地址:
__no_init u16 Fg_Noinit@0x20000000;
如果不是IAP使用的話,可以這樣:
_no_init u16 Fg_Noinit;
?
KEIL的方式略微復(fù)雜一些:
首先要在Target中對RAM做配置
?
NoInit某個地址范圍
之后定義變量
__attribute__((at(0x20000000))) u8 Noinit;
總結(jié)
以上是生活随笔為你收集整理的STM32单片机,禁止系统启动时的变量初始化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32_DMA 标准初始化设置解释
- 下一篇: STM32系统学习——DMA(直接储存器