目录
1. BKP的应用
2. BKP在系统中的配置
2.1 BKP模块的使能和时钟配置
2.2 备份寄存器的配置
2.3 数据存储和恢复的机制
3. BKP应用实例代码
4. 总结
1. BKP的应用
在嵌入式系统中,BKP(备份寄存器)是一个重要的功能模块,用于存储关键性的系统数据、状态信息以及实时时钟(RTC)的相关数据。通过BKP模块,我们可以在系统断电或重新启动时保持这些数据的持久性,确保系统在下次启动时能够正确地恢复状态。
注意如果使用的最小系统板的话是没有板载电池的,需要自己接上电池或者VB引脚(最小板已引出)接3.3V供电
如图部分开发版是有电池接口可以接电池的
2. BKP在系统中的配置
2.1 BKP模块的使能和时钟配置
在开始使用BKP模块之前,需要先使能BKP时钟和模块。这通常涉及到对相应的寄存器进行配置,以确保BKP模块能够正常工作。在STM32F103系列微控制器中,可以通过设置相关的时钟控制寄存器来使能BKP时钟,然后通过设置相应的使能位来使能BKP模块。
2.2 备份寄存器的配置
BKP模块中的备份寄存器需要根据实际需求进行配置。这包括确定要存储的数据类型、选择备份寄存器的位置、以及设置备份寄存器的初始值等。在配置备份寄存器时,需要考虑数据的重要性、大小和访问频率等因素,以便合理利用有限的备份寄存器资源。
2.3 数据存储和恢复的机制
在系统设计中,需要明确数据存储和恢复的机制。这涉及到将需要持久保存的数据写入到备份寄存器中的方法,以及在系统重新启动时如何从备份寄存器中读取和恢复数据的方法。在实际应用中,可以采用定时存储、事件触发存储等策略来保证数据的及时更新和完整性。
3. BKP应用实例代码
首先是BKP的初始化,这里要注意开启PWR的时钟,因为BKP需要外接小电池才能保持备份寄存器的供电,而PWR模块负责监测Vbat的电压
//备份寄存器初始化
void BKP_Init(void)
{//备份寄存器通常需要在Vbat电压下工作(Vbat是用于保持备份寄存器内容的电源),而PWR模块负责监测Vbat电压RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //开启PWR的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE); //开启BKP的时钟PWR_BackupAccessCmd(ENABLE); //用PWR使能备份寄存器
}
接着就是写数据和读数据了,读写数据使用库函数中提供的BKP_WriteBackupRegister和BKP_ReadBackupRegister函数,注意在stm32f103c8t6中,只有20个字节的后备数据空间,对应10个16位的备份寄存器,因此BKP_DR对应的是BKP_DR1 - BKP_DR10,如果你在c8t6中将数据写入了BKP_DR11,是没有效果的
/*在f103c8t6中,有20个字节的后备数据空间,对应10个16位的备份寄存器
BKP_DR对应BKP_DR1 - BKP_DR10
*/
uint16_t W_Save_data(uint16_t BKP_DR, uint16_t data)
{BKP_WriteBackupRegister(BKP_DR, data); //将需要掉电保存的数据写入备份寄存器if(data == BKP_ReadBackupRegister(BKP_DR)) //读取写入的备份寄存器的数据{return 1; //如果正确读取到备份寄存器的数据,返回1}else return 0;
}uint16_t R_Save_data(uint16_t BKP_DR)
{return BKP_ReadBackupRegister(BKP_DR);
}
接着在主函数中调用初始化函数,通过对备份寄存器的读写操作(代码逻辑自拟哈)即可实现掉电记忆等功能,和普通uint16_t的数组不同的是,BKP备份寄存器掉电和复位是不会清空的
BKP_Init();
while(W_Save_data(BKP_DR1, data[0]) == RESET); //写入测试数据到备份寄存器
data = R_Save_data(BKP_DR1); //读取备份寄存器的数据
4. 总结
在BKP篇的博客中,我们探讨了BKP(备份寄存器)模块的原理和应用。首先,我们介绍了BKP模块的基本原理和工作流程,包括其在STM32F103微控制器中的硬件架构和功能特点。在应用实例代码中,我们实现了数据的备份和恢复功能。希望能对项目开发提供参考。