国民技术RTC备份寄存器RTC_BKP

 根据手册资料知道RTC_BKP的地址,代码如下

#include "main.h"
#include "usart.h"

void USART2_Configuration(void)
{
	USART_InitType USART_InitStructure;
	GPIO_InitType GPIO_InitStructure;
    GPIO_InitStruct(&GPIO_InitStructure);
	
	RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);
    RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_USART2, ENABLE);
	
	GPIO_InitStructure.Pin            = GPIO_PIN_4;
    GPIO_InitStructure.GPIO_Mode      = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Alternate = GPIO_AF4_USART2;
    GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
    
    GPIO_InitStructure.Pin            = GPIO_PIN_5;
    GPIO_InitStructure.GPIO_Pull      = GPIO_Pull_Up;
    GPIO_InitStructure.GPIO_Alternate = GPIO_AF4_USART2;
    GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
	
	USART_StructInit(&USART_InitStructure);
    USART_InitStructure.BaudRate            = 115200;
    USART_InitStructure.WordLength          = USART_WL_8B;
    USART_InitStructure.StopBits            = USART_STPB_1;
    USART_InitStructure.Parity              = USART_PE_NO;
    USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
    USART_InitStructure.Mode                = USART_MODE_RX | USART_MODE_TX;

    USART_Init(USART2, &USART_InitStructure);
    USART_Enable(USART2, ENABLE);
}

int fputc(int ch, FILE* f)
{
    USART_SendData(USART2, (uint8_t)ch);
    while (USART_GetFlagStatus(USART2, USART_FLAG_TXDE) == RESET);
    return (ch);
}
#include "n32l40x.h"
#include "n32l40x_rtc.h"
#include "User_RTCBKP_Config.h"


uint16_t BKP_Datas[BACKUP_REGISTER_SIZE]={BKP_DAT1, BKP_DAT2, BKP_DAT3, BKP_DAT4, BKP_DAT5, \
                                          BKP_DAT6, BKP_DAT7, BKP_DAT8, BKP_DAT9, BKP_DAT10,\
                                          BKP_DAT11,BKP_DAT12,BKP_DAT13,BKP_DAT14,BKP_DAT15,\
                                          BKP_DAT16,BKP_DAT17,BKP_DAT18,BKP_DAT19,BKP_DAT20};

uint32_t Read_Backup_Datas[BACKUP_REGISTER_SIZE]={0x00};


void User_RTCBKP_Init(void)
{
    RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_PWR, ENABLE);
    /* Allow access to RTC */
    PWR_BackupAccessEnable(ENABLE);
    RCC_EnableRtcClk(DISABLE);
    /* Enable the LSE OSC32_IN PC14 
       LSI is turned off here to ensure that only one clock is turned on */
    RCC_EnableLsi(DISABLE);  
    RCC_ConfigLse(RCC_LSE_ENABLE,0x28);
    while (RCC_GetFlagStatus(RCC_LDCTRL_FLAG_LSERD) == RESET){}
    RCC_ConfigRtcClk(RCC_RTCCLK_SRC_LSE);
    /* Enable the RTC Clock */
    RCC_EnableRtcClk(ENABLE);
    RTC_WaitForSynchro();
}


void BKP_WriteBkpData(uint32_t BKP_DAT, uint32_t Data)
{
    __IO uint32_t tmp = 0;
    /* Check the parameters */
    assert_param(IS_BKP_DAT(BKP_DAT));
    tmp = (uint32_t)&RTC->BKP1R;
    tmp += BKP_DAT;
    *(__IO uint32_t*)tmp = Data;
}


uint32_t BKP_ReadBkpData(uint32_t BKP_DAT)
{
    __IO uint32_t tmp = 0;
    uint32_t value = 0;
    /* Check the parameters */
    assert_param(IS_BKP_DAT(BKP_DAT));
    tmp = (uint32_t)&RTC->BKP1R;
    tmp += BKP_DAT;
    value = (*(__IO uint32_t*)tmp);
    return value;
}

#ifndef __USER_RTCBKP_CONFIG_H__
#define __USER_RTCBKP_CONFIG_H__


#define  BKP_DAT1     ((uint16_t)0x0000)
#define  BKP_DAT2     ((uint16_t)0x0004)
#define  BKP_DAT3     ((uint16_t)0x0008)
#define  BKP_DAT4     ((uint16_t)0x000C)
#define  BKP_DAT5     ((uint16_t)0x0010)
#define  BKP_DAT6     ((uint16_t)0x0014)
#define  BKP_DAT7     ((uint16_t)0x0018)
#define  BKP_DAT8     ((uint16_t)0x001C)
#define  BKP_DAT9     ((uint16_t)0x0020)
#define  BKP_DAT10    ((uint16_t)0x0024)
#define  BKP_DAT11    ((uint16_t)0x0028)
#define  BKP_DAT12    ((uint16_t)0x002C)
#define  BKP_DAT13    ((uint16_t)0x0030)
#define  BKP_DAT14    ((uint16_t)0x0034)
#define  BKP_DAT15    ((uint16_t)0x0038)
#define  BKP_DAT16    ((uint16_t)0x003C)
#define  BKP_DAT17    ((uint16_t)0x0040)
#define  BKP_DAT18    ((uint16_t)0x0044)
#define  BKP_DAT19    ((uint16_t)0x0048)
#define  BKP_DAT20    ((uint16_t)0x004C)

#define  IS_BKP_DAT(DAT)                                                                                    \
             (((DAT) == BKP_DAT1)  || ((DAT) == BKP_DAT2)  || ((DAT) == BKP_DAT3)  || ((DAT) == BKP_DAT4)   \
           || ((DAT) == BKP_DAT5)  || ((DAT) == BKP_DAT6)  || ((DAT) == BKP_DAT7)  || ((DAT) == BKP_DAT8)   \
           || ((DAT) == BKP_DAT9)  || ((DAT) == BKP_DAT10) || ((DAT) == BKP_DAT11) || ((DAT) == BKP_DAT12)  \
           || ((DAT) == BKP_DAT13) || ((DAT) == BKP_DAT14) || ((DAT) == BKP_DAT15) || ((DAT) == BKP_DAT16)  \
           || ((DAT) == BKP_DAT17) || ((DAT) == BKP_DAT18) || ((DAT) == BKP_DAT19) || ((DAT) == BKP_DAT20) )

#define  BACKUP_REGISTER_SIZE        20

extern uint16_t BKP_Datas[BACKUP_REGISTER_SIZE];
extern uint32_t Read_Backup_Datas[BACKUP_REGISTER_SIZE];

extern void BKP_WriteBkpData(uint32_t BKP_DAT, uint32_t Data);
extern uint32_t BKP_ReadBkpData(uint32_t BKP_DAT);
extern void User_RTCBKP_Init(void);


#endif /* __USER_RTCBKP_CONFIG_H__ */
/**
 * @}
 */

#include "main.h"
#include "usart.h"
#include "n32l40x_flash.h"
#include "User_RTCBKP_Config.h"

#ifdef USE_FULL_ASSERT
void assert_failed(const uint8_t* expr, const uint8_t* file, uint32_t line)
{
    while (1)
    {
    }
}
#endif

#define USE_USART

int main(void)
{
	int i = 0;
	
	#ifdef USE_USART
	USART2_Configuration();
	#endif
	User_RTCBKP_Init();
	
	for(i=0;i<BACKUP_REGISTER_SIZE;i++)
	{
		Read_Backup_Datas[i]=BKP_ReadBkpData(BKP_Datas[i]);
		printf("BKP_DAT%u=%d\r\n",i+1,(unsigned int)Read_Backup_Datas[i]);
	}
	
	for(i=0;i<BACKUP_REGISTER_SIZE;i++)
	{
		BKP_WriteBkpData(BKP_Datas[i], i);
	}
}

 串口打印如下:

第一次上电

BKP_DAT1=0
BKP_DAT2=0
BKP_DAT3=0
BKP_DAT4=0
BKP_DAT5=0
BKP_DAT6=0
BKP_DAT7=0
BKP_DAT8=0
BKP_DAT9=0
BKP_DAT10=0
BKP_DAT11=0
BKP_DAT12=0
BKP_DAT13=0
BKP_DAT14=0
BKP_DAT15=0
BKP_DAT16=0
BKP_DAT17=0
BKP_DAT18=0
BKP_DAT19=0
BKP_DAT20=0

NRST脚复位

BKP_DAT1=0
BKP_DAT2=1
BKP_DAT3=2
BKP_DAT4=3
BKP_DAT5=4
BKP_DAT6=5
BKP_DAT7=6
BKP_DAT8=7
BKP_DAT9=8
BKP_DAT10=9
BKP_DAT11=10
BKP_DAT12=11
BKP_DAT13=12
BKP_DAT14=13
BKP_DAT15=14
BKP_DAT16=15
BKP_DAT17=16
BKP_DAT18=17
BKP_DAT19=18
BKP_DAT20=19

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值