关于CH32系列MCU设置noinit变量

发布时间 2023-10-24 13:12:55作者: ZaiLi

关于noinit定义:noinit段指的是芯片SRAM的一块内存区域(注意是RAM区而非Flash),在该段定义的变量、或者函数,在除了掉电之外的任何芯片复位的情况下都不会被重新初始化。

关于noinit作用:no_init段常用来保存一些敏感信息,特殊应用场合下的不能被复位的数据或者做复位判断标志等数据。这个功能可以配合flash存储,在短期内以noinit RAM保持数据,在关键节点再将数据写进flash,以达到减少flash擦写次数的操作次数。

1、关于CH32V系列MCU设置noinit变量,具有以下3种方法:

方法1:按照下图配置,使用__attribute__((section(".noinit")))定义变量,但需要注意,noinit变量放在RAM中,不能初始化,变量开始值是一个随机值。

 

方法2:参考下图,需要配置ld文件,ld文件修改如下:

ld文件:
.noinit :
{
     . = ALIGN(4);
     KEEP(*(*.inot*))
}>NOINIT 

main文件:
volatile uint32_t test __attribute__((section(".inot"))) ;

 

方法3:参考下图,需先定义一个结构体,然后位置放在RAM区域内,对结构体变量进行运算。

typedef struct
{
  __IO uint32_t a;
  __IO uint32_t b;
  __IO uint32_t n;
} test;
#define T_V                ((test *) 0X20003000)

 

2、关于CH32F系列MCU设置noinit变量(2种方法)

第一步:按照下图勾选No Init

第二步:按照下图方法1或者方法2配置

方法1:

#define __noinit__ __attribute__((zero_init))   // 变量不初始化为0
__noinit__  int  tmp;                     // 变量前加上宏__noinit__ 

 

方法2:

__attribute__((zero_init))    int  tmp;