[STM32F1] stm32怎么保护一段ram区,使得在非掉电复位的时候数据保持

[复制链接]
6703|15
 楼主| atchboy 发表于 2017-3-8 11:37 | 显示全部楼层 |阅读模式
如题。不是备份寄存器(BKP)
feelhyq 发表于 2017-3-8 12:41 | 显示全部楼层
用指针的方式,使用指针指向某一块内存,然后对指针进行操作就行了。
lxyppc 发表于 2017-3-8 12:48 来自手机 | 显示全部楼层
好像stm32的内存都可以在非掉电复位时保存
复位时会执行一段编译器插入的代码对内存进行初始化
只要跳过这段初始化代码
或者让某一块内存不经过初始化
就能实现了
Xflyan 发表于 2017-3-8 12:59 | 显示全部楼层
使用 __no_init 指定位置定义一段存储区,这样非掉电重启的时候不会被初始化清零,如
__no_init uint8_t no_init_ram @0x20004000;
应该可以这样,未验证
 楼主| atchboy 发表于 2017-3-8 13:42 | 显示全部楼层
能具体一点么,比如说我先怎么保护一段ram区,然后把需要保留的变量就定义在这个区域。stm32 有没有具体的相关文档,我一直没找到。
 楼主| atchboy 发表于 2017-3-9 10:17 | 显示全部楼层
别沉啊
 楼主| atchboy 发表于 2017-3-9 10:17 | 显示全部楼层
大神们请帮忙
 楼主| atchboy 发表于 2017-3-13 16:06 | 显示全部楼层
知道了,随便看了个stm32F4系列的单片机,它的sram就有三种区域,有一块就是带电池备份的sram。应该就是可以用这块的功能。
typeof 发表于 2017-3-13 17:11 | 显示全部楼层
这个只能使用外接电源。
typeof 发表于 2017-3-13 17:12 | 显示全部楼层
ram肯定是掉电丢失,除非放在rom里面。
fengzaideng 发表于 2017-3-14 09:44 | 显示全部楼层
Xflyan 发表于 2017-3-8 12:59
使用 __no_init 指定位置定义一段存储区,这样非掉电重启的时候不会被初始化清零,如
__no_init uint8_t no ...

对就是这种方法,N年前就验证过了啊。不过的看使用的是IAR还是Keil
 楼主| atchboy 发表于 2017-3-15 12:20 | 显示全部楼层
fengzaideng 发表于 2017-3-14 09:44
对就是这种方法,N年前就验证过了啊。不过的看使用的是IAR还是Keil

这个stm32F103能用么?在keil编译器里没有__no_init的关键字么?能否说一下具体的方式?
Xflyan 发表于 2017-3-15 13:52 | 显示全部楼层
KEIL 定义变量到指定地址:
  1. uint8_t no_init_ram[4096] __attribute__((at(0x20004000)));


no_init.png
fengzaideng 发表于 2017-3-15 14:23 | 显示全部楼层
atchboy 发表于 2017-3-15 12:20
这个stm32F103能用么?在keil编译器里没有__no_init的关键字么?能否说一下具体的方式? ...

uint8_t  xxx  __attribute__((section("NO_INIT"),zero_init));
 楼主| atchboy 发表于 2017-3-20 14:41 | 显示全部楼层
Xflyan 发表于 2017-3-15 13:52
KEIL 定义变量到指定地址:

老师,多谢了。已经验证,可以使用。方法二,另外可以定义指针,然后指向某个地址(确认这个地址不会被占用或其他程序操作),此时软件复位也不会初始化指针指向地址的内容。因为复位只会初始化有确定地址的变量,因为指针初始化的时候是null,所以你确定的地址是不会被初始化的。方法二需要注意的是,确定地址不会使用。我认为可以结合malloc函数使用方法二。但是最好使用xflyan的方法,配置ram   no_init。
lingergy 发表于 2020-7-15 15:39 | 显示全部楼层
成功了,谢谢上面各位大神
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

55

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部