硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4604|回复: 8
收起左侧

[STM32H7] backup RAM 的使用

  [复制链接]

6

主题

122

回帖

140

积分

初级会员

积分
140
发表于 2018-8-20 16:13:38 | 显示全部楼层 |阅读模式
本帖最后由 dy84082666 于 2018-8-20 17:15 编辑

在F7上可以实现掉电保存备份4K内存功能,使用如下代码:

#define BKP_RAM1  (*(__IO uint32_t *) (BKPSRAM_BASE))

main()
{
  ...

  __HAL_RCC_PWR_CLK_ENABLE();     //RCC_APB1ENR->PWREN
  __HAL_RCC_BKPSRAM_CLK_ENABLE(); //RCC_AHB1ENR->BKPSRAMEN
  HAL_PWR_EnableBkUpAccess();     //PWR_CR1->DBP
  HAL_PWREx_EnableBkUpReg();      //PWR_CSR1->BRE

  ...

  BKP_RAM1 = 0xAA55AA55;
}

评分

参与人数 1金币 +50 收起 理由
eric2013 + 50 赞一个!

查看全部评分

回复

使用道具 举报

6

主题

122

回帖

140

积分

初级会员

积分
140
 楼主| 发表于 2018-8-20 16:27:40 | 显示全部楼层
本帖最后由 dy84082666 于 2019-1-21 19:49 编辑

H7的HAL函数与F7的不同,且还有一个需要注意的地方,给我带来不小的困扰。
本来是想发帖求助,后来自己解决了,测试从昨天到今天,一天时间,完成H7的备份RAM区域掉电保护。

#define BKP_RAM1  (*(__IO uint32_t *) (D3_BKPSRAM_BASE))

main()
{

  __HAL_RCC_BKPRAM_CLK_ENABLE(); //RCC_AHB4ENR->BKPRAMEN(H7) // RCC_AHB1ENR->BKPSRAMEN(F7)  //使能备份RAM读写时钟
  //HAL_PWR_EnableBkUpAccess();     //PWR_CR1->DBP(H7/F7) //取消写保护
  HAL_PWREx_EnableBkUpReg();      //PWR_CR2->BREN(H7) // PWR_CSR1->BRE(F7)  使能备份调节器


  BKP_RAM1 = 0xAA55AA55;
}

H7和F7不一样。
首先,你会发现备份域在D3,D3是低功耗外设域,所有有关低功耗的都在这里。
其次,H7上电不对backup RAM进行写保护,E文文档中说只对RTC寄存器和RTC备份寄存器写保护。所以“//”注释掉。

如果在函数中只使用到上面两行,你会发现,RAM不能掉电保存。这也是困扰了我比较久的问题。
解决方法,增加一条语句

  SCB->CACR |= 1<<2;

因为我开了指令和数据Cache,上面语句的作用是DCache透写,关于透写这个名词,就不在这里解释了。资料写的很清楚,而我说不清楚。





补充一个关键点,RTC必须初始化。



评分

参与人数 1金币 +50 收起 理由
eric2013 + 50 赞一个!

查看全部评分

回复

使用道具 举报

2

主题

569

回帖

575

积分

金牌会员

积分
575
发表于 2018-8-21 06:58:16 | 显示全部楼层
楼主能不能出个简单的教程
回复

使用道具 举报

6

主题

122

回帖

140

积分

初级会员

积分
140
 楼主| 发表于 2018-8-21 13:21:54 | 显示全部楼层
leiyitan 发表于 2018-8-21 06:58
楼主能不能出个简单的教程

想使用备份RAM,遇到困难直接在帖子里留言啊,我负责教会,这个功能很简单。
我也是在学习H7这款芯片,教程什么的,真不敢当啊。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2018-8-22 12:32:42 | 显示全部楼层
dy84082666 发表于 2018-8-20 16:27
H7的HAL函数与F7的不同,且还有一个需要注意的地方,给我带来不小的困扰。
本来是想发帖求助,后来自己解 ...

感谢楼主分享
回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2019-6-25 19:07:44 | 显示全部楼层
dy84082666 发表于 2018-8-20 16:27
H7的HAL函数与F7的不同,且还有一个需要注意的地方,给我带来不小的困扰。
本来是想发帖求助,后来自己解 ...

学习一下硬汉哥的MPU配置, cache就可以照常打开了。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2024-4-28 14:44:49 | 显示全部楼层
请教一下,我现在用H743,使用back ram的时候,发现对其uint32_t类型的变量修改,掉电后可以保存;
对于uint8_t变量的修改,修改后的数据读取正常,但是掉电不保存。这是为什么
struct __attribute__((aligned(256))) record
{
   ....
    uint32_t   StartTime;
    uint32_t   stopTime;  
    ....
    uint8_t    all;
    uint8_t    valid;            
    uint8_t     reserved1;
    uint8_t     reserved2;
};
struct record __attribute__((section (".BACKUP_SRAM")))  m_record = {0};

修改的代码:
m_record.StartTime = 1714286661;
m_record.all = 1;

1714286661会保存,1掉电重启后不保存
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2024-4-29 08:10:49 | 显示全部楼层
perfect 发表于 2024-4-28 14:44
请教一下,我现在用H743,使用back ram的时候,发现对其uint32_t类型的变量修改,掉电后可以保存;
对于ui ...

这个没有深究过,不知道跟这个是不是类似

STM32H7软件复位NVIC_SystemReset后,各个RAM继续保持原有数据的问题总结(2019-10-03)
https://www.armbbs.cn/forum.php? ... 5217&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2024-4-30 11:02:21 | 显示全部楼层
eric2013 发表于 2024-4-29 08:10
这个没有深究过,不知道跟这个是不是类似

STM32H7软件复位NVIC_SystemReset后,各个RAM继续保持原有数 ...

看起来有点像了。
我这边还复现到,如果开启了cache,并且赋值后调用SCB_CleanCache,重启后也还是可以保存的。
不过当前项目不能开cache。

我再去看看,多谢啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-13 00:26 , Processed in 0.196930 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表