禁止KEIL初始化RAM为零& 如何判断是软复位还是上电复位

如何禁止KEIL初始化RAM为零

        1.    在KEIL NoInit 打钩,类似下面

        2.    <1> 另须对需要热启动保持的变量用__at关键字指定某个区域

                <2>或者__attribute__((zero_init))  关键字  .bss段

  MDK3.03A开始就支持关键字 __at() 。
  需要加#include

int test1=1;

__attribute__((zero_init)) int test2;

int test3 __at(0x20001000);

查看MAP文件

test1                                   0x20000000   Data           4  main.o(.data)
test2                                     0x2000000c   Data           4  main.o(.bss)
test3                                    0x20001000   Data           4  main.o(.ARM.__AT_0x20001000)

-------------------------------------------------------------------------------------------------------------------------------------

另一种方法:

禁止KEIL初始化RAM为零& 如何判断是软复位还是上电复位_第1张图片

 

 对STM32如何判断是软复位还是上电复位?     

       if (RCC_GetFlagStatus(RCC_FLAG_PORRST) == RESET)
       {
           //这是上电复位
       }
       else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) == RESET)
       {
           //这是外部RST管脚复位
       }
       else if (RCC_GetFlagStatus(RCC_FLAG_SFTRST)== RESET)
       {
           //这是外部RST管脚复位
       }
       //清除RCC中复位标志
       RCC_ClearFlag();

       void RestStm32Cpu(void)
      {   
            __set_FAULTMASK(1);   // 关闭某些中端
            NVIC_SystemReset();     // 复位
      }

从启动代码执行结束到跳转到main函数过程中,编译器还执行了很多库函数,其中__scatterload_zeroinit函数将所有W/R RAM都初始化为0(默认设置下)。为了判断冷、热启动,必须人为控制某些特定RAM在复位时不被编译器初始化为0。通过查找编译器手册,在为处理器的RAM中分出一块小片RAM,设置为NoInit格式(不对其初始化为0),如下图:

禁止KEIL初始化RAM为零& 如何判断是软复位还是上电复位_第2张图片

然后使用__at关键字将冷、热启动标志位定位到这个NoInit区域:

uint32 unStartFlag __at (0x40003FF4);
在程序启动时判断:
if(unStartFlag==0xAA55AA55){
    //热启动处理
}
else{
    //冷启动处理
    unStartFlag=0xAA55AA55;
}

这样,当热启动时,变量unStartFlag所在的内存区域就不会被初始化为0,也实现了冷热启动的判断。

 

 

你可能感兴趣的:(——STM32)