|
我们的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 寄存器的访问; 从代码上面看也是这样 - RCC_APB1PeriphClockCmd( RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE );
- PWR_BackupAccessCmd( ENABLE );
- BKP_ClearFlag();
- BKP_WriteBackupRegister( BKP_DR1, 0x55AA);
在App里面我们将BKP_DR1置位后,在系统复位后,我们只需要在Bootloader里面读取一下BKP_DR1寄存器,然后再执行对应的业务逻辑即可。
- val = BKP->DATAR1;
- if(val == 0x55AA)
- {
- /* upload firmware */
- }
- else
- {
- /* do normal */
- }
很是高效!大家有机会的话不要错过!
|