关于CH32系列MCU设置noinit变量
关于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;
分类:
32位MCU学习
标签:
CH32;noinit;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~