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单片机,禁止系统启动时的变量初始化。)