/*************************************************************
Function : Backup_Init
Description: 备份寄存器初始化
Input : none
return :
*************************************************************/
void Backup_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);//初始化电源控制时钟与备份寄存器时钟
PWR_BackupAccessCmd(ENABLE); //允许访问备份寄存器
BKP_ClearFlag();//清除入侵引脚事件标志位
if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)//上电复位
{
RCC_ClearFlag();//清除复位标志位
if(Backup_CheckData(0x0001) != 0)//备份寄存器数据错误或,没有数据 {
Backup_WriteData(0x0001);//写入数据
}
}
}
uint16_t BKPDataReg[42] ={//对大容量微处理器来说,它有42个备份寄存器,地址偏移为:0x04~0x48,0x40~0xBC
BKP_DR1, BKP_DR2, BKP_DR3, BKP_DR4, BKP_DR5, BKP_DR6, BKP_DR7, BKP_DR8,
BKP_DR9, BKP_DR10, BKP_DR11, BKP_DR12, BKP_DR13, BKP_DR14, BKP_DR15, BKP_DR16,
BKP_DR17, BKP_DR18, BKP_DR19, BKP_DR20, BKP_DR21, BKP_DR22, BKP_DR23, BKP_DR24,
BKP_DR25, BKP_DR26, BKP_DR27, BKP_DR28, BKP_DR29, BKP_DR30, BKP_DR31, BKP_DR32,
BKP_DR33, BKP_DR34, BKP_DR35, BKP_DR36, BKP_DR37, BKP_DR38, BKP_DR39, BKP_DR40,
BKP_DR41, BKP_DR42
};
/*************************************************************
Function : Backup_WriteData
Description: 向备份寄存器写的数据
Input : firstBackupData - 数据的首数据
return : none
*************************************************************/
static void Backup_WriteData(u32 firstBackupData)
{
u32 index;
PRINTF("Begin to wite data to backup registers\r\n");
for(index = 0; index < 42; index++)
{ /向备份寄存器写数据
BKP_WriteBackupRegister(BKPDataReg[index], firstBackupData + index);/
PRINTF("BKP_DR%d: %d\r\n", index + 1, firstBackupData + index);
}
}
/*************************************************************
Function : Backup_CheckData
Description: 检查备份寄存器的数据是否正确
Input : firstBackupData-第一个备份寄存器数据
return : 0-正确 其他-错误
*************************************************************/
static u8 Backup_CheckData(u32 firstBackupData)
{
u32 index;
PRINTF("Begin to check backup registers\r\n");
for(index = 0; index < 42; index++)
{ //检查备份寄存器的数据是否正确
if(BKP_ReadBackupRegister(BKPDataReg[index]) != (firstBackupData + index))
{
PRINTF("BKP_DR%d data check impare!\r\n", index + 1);
return (index + 1);
}
else
{
PRINTF("BKP_DR%d data check OK!\r\n", index + 1);
}
}
return 0;
}
#ifndef __BACKUP_H__
#define __BACKUP_H__
#include "stm32f10x.h"
void Backup_Init(void);
#endif
/*************************************************************
Function : main
Description: main入口
Input : none
return : none
*************************************************************/
int main(void)
{
BSP_Init();
PRINTF("\nmain() is running!\r\n");
Backup_Init();
while(1)
{
LED1_Toggle();
Delay_ms(1000);
}
}
上一篇:STM32 独立看门狗定时器IWDG复位
下一篇:STM32 RTC时钟日历
推荐阅读最新更新时间:2024-03-16 15:14