[RISC-V MCU 应用开发] 后备寄存器(BKP)在自更新上的应用

[复制链接]
8|0
记忆花园 发表于 2026-4-27 23:56 | 显示全部楼层 |阅读模式
我们的MCU应用项目,多数场景下有Bootloader和App两个程序。如果在Bootloader写入变量并传给App使用。或者如何在App中设置标志位供Bootloader使用。最典型的应用就是自更新固件,而串联两者便是后备寄存器(BKP)。
CH32V317的后备寄存器有10个,分别为R16_BKP_DATAR1 - 10。这10个后备寄存器有一个强劲儿的特性:在主电源(VDD)掉电后,这些数据仍可以由 VBAT供电而保持,并且不受待机状态、系统复位或电源复位的影响。这里强调一下:后备寄存器不受系统复位影响。因为我们在自更新时,要利用系统复位从App进入Bootloader。
初始化后备寄存器的步骤非常简单:
1)置寄存器 RCC_APB1PCENR 的 PWREN 位和 BKPEN 位来打开电源和后备接口的操作时钟; 2)置电源控制寄存器 PWR_CTLR 的 DBP 位,使能对后备寄存器和 RTC 寄存器的访问;
从代码上面看也是这样
  1. RCC_APB1PeriphClockCmd( RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE );
  2. PWR_BackupAccessCmd( ENABLE );
  3. BKP_ClearFlag();

  4. BKP_WriteBackupRegister( BKP_DR1, 0x55AA);
在App里面我们将BKP_DR1置位后,在系统复位后,我们只需要在Bootloader里面读取一下BKP_DR1寄存器,然后再执行对应的业务逻辑即可。
  1. val = BKP->DATAR1;
  2. if(val == 0x55AA)
  3. {
  4.   /* upload firmware */
  5. }
  6. else
  7. {
  8.   /* do normal */
  9. }  
很是高效!大家有机会的话不要错过!







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

本版积分规则

11

主题

55

帖子

0

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