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