如何把MM32的RAM的一块区域当做备份寄存器用
在MCU应用中,常常会使用备份域寄存器保存一些数据,在MCU热复位时,备份域数据不被清除。当使用的MM32没有带备份寄存器时,使用以下方式可以划分一块20字节RAM区域当做备份域使用。
- 设置keil配置里面的【Target】标签里面on-chip下的
IRAM1:start为0x20000000,size为0x1FEC,不勾选“no init”
IRAM2:start为0x20001FEC,size为0x14,要勾选“no init”
- 增加simbkp.h,文件内容为
#ifndef __SIMBKP_H__
#define __SIMBKP_H__
#include "types.h"
#define SIMBPK_BASE 0x20001FEC //将RAM最后20字节作为备份寄存器
/// @brief Sim Bkp Register Structure Definition
typedef struct {
union {
u8 DR[20];
struct {
u8 DR0;
u8 DR1;
u8 DR2;
u8 DR3;
u8 DR4;
u8 DR5;
u8 DR6;
u8 DR7;
u8 DR8;
u8 DR9;
u8 DR10;
u8 DR11;
u8 DR12;
u8 DR13;
u8 DR14;
u8 DR15;
u8 DR16;
u8 DR17;
u8 DR18;
u8 DR19;
};
};
} SIMBKP_TypeDef;
#define SIMBKP ((SIMBKP_TypeDef*) SIMBPK_BASE)
#endif
- 在main里面实现测试功能,如果是不断电复位可以看到LED灯会快闪,重新上电LED灯会慢闪。
s32 main(void)
{
u8 i,result;
LED_Init();
DELAY_Init();
CONSOLE_Init(115200);
for (i = 0; i < 20; i++)
{
arry[i] = i;
}
result = strncmp((char *)arry, (char *)SIMBKP->DR, 20);
if (0 == result)
{
printf("SIMBKP data is : ");
for (i = 0; i < 20; i++)
{
printf("%d ", SIMBKP->DR[i]);
}
printf("\r\n");
while (1)
{
LED1_TOGGLE();
LED2_TOGGLE();
LED3_TOGGLE();
LED4_TOGGLE();
DELAY_Ms(100);
}
}
else
{
for (i = 0; i < 20; i++)
{
SIMBKP->DR[i] = arry[i];
}
printf("write data into SIMBKP\r\n");
while (1)
{
LED1_TOGGLE();
LED2_TOGGLE();
LED3_TOGGLE();
LED4_TOGGLE();
DELAY_Ms(500);
}
}
}