之前接手了一个项目,它有个操作是将一些初始化数据写入DATAFlash区。
其做法是使用ICP下载工具在下载时配置ISD9160芯片的CONFIG[1:0],并下载DATAFlash和APROM。
这个做法繁琐、而且工厂生产时、生产人员去配置下载工具时可能会出错,所以又做了一个下载配置文件,也就是生产时需要3个文件才能完成对芯片的烧录:下载配置文件、DATAFlash.bin、APROM.bin。
现在用新方法将芯片配置过程和初始化数据一起包含于APROM.bin。
具体操作有2步:
1、配置芯片、从Flash中划出1K作为DATAFlash// DATAFlash配置
#define CONFIG0_TEST_CODE 0xFFFFFFFE // 使能DATAFlash
#define CONFIG1_TEST_CODE 0x00023000 // DATAFlash基地址(对应1K)
// 灯的模式和亮度参数存放于DATAFlash区,地址为0x23000开头的3个位置
#define LAMP_DATA_ADDR CONFIG1_TEST_CODE
void config_init(void)
{
int32_t i32Err;
uint32_t u32Data;
uint32_t config0Bak, config1Bak;
// 开始操作
UNLOCKREG();
// 开启ISP模块
SYSCLK->AHBCLK.ISP_EN = 1;
DrvFMC_EnableISP(1);
// 检查boot源
LOG(("Boot Source ................................ "));
if(DrvFMC_GetBootSelect() == LDROM) {
printf("[LDROM]\n");
printf("WARNING: This code should be in AP mode but it is in LD mode now.\n\n");
while(1){}
} else {
printf("[APROM]\n");
}
// 读取IC配置CONFIG[1:0]
printf("Read config0 ............................... ");
DrvFMC_Read(CONFIG_BASE, &config0Bak);
printf("[0xx]\n", config0Bak);
printf("Read config1 ............................... ");
DrvFMC_Read(CONFIG_BASE+4, &config1Bak);
printf("[0xx]\n", config1Bak);
// 检查CONFIG[1:0]是否已经配置好
printf("Configuration .............................. ");
i32Err = 0;
if((config0Bak != CONFIG0_TEST_CODE) || (config1Bak != CONFIG1_TEST_CODE)) {
i32Err = 1;
printf("[NOT MATCH]\n");
} else {
printf("[MATCH]\n");
printf("CONFIG0 .................................... [0x%x]\n",CONFIG0_TEST_CODE);
printf("DataFlash BASE ADDR ........................ [0x%x]\n",CONFIG1_TEST_CODE);
}
// IC配置不对或未配置、则修改配置
if(i32Err) {
// 擦除CONFIG[1:0]
printf("Erase config region ........................ ");
DrvFMC_EnableConfigUpdate(TRUE);
DrvFMC_Erase(CONFIG_BASE);
DrvFMC_Read(CONFIG_BASE, &u32Data);
if(u32Data != 0xFFFFFFFF) { printf("[FAIL]\n"); }
else { printf("[OK]\n"); }
// 修改CONFIG[1:0]
printf("Program config region ...................... ");
DrvFMC_Write(CONFIG_BASE, CONFIG0_TEST_CODE);
DrvFMC_Write(CONFIG_BASE+4, CONFIG1_TEST_CODE);
// 检查CONFIG[1:0]是否修改成功
i32Err = 0;
DrvFMC_Read(CONFIG_BASE, &u32Data);
if(u32Data != CONFIG0_TEST_CODE) { i32Err = 1; }
DrvFMC_Read(CONFIG_BASE+4, &u32Data);
if(u32Data != CONFIG1_TEST_CODE) { i32Err = 1; }
if(i32Err) {
printf("[FAIL]\n");
} else {
printf("[OK]\n");
printf("CONFIG0 .................................... [0x%x]\n",CONFIG0_TEST_CODE);
printf("DataFlash BASE ADDR ........................ [0x%x]\n",CONFIG1_TEST_CODE);
}
}
// 关闭ISP模块
DrvFMC_EnableISP(0);
SYSCLK->AHBCLK.ISP_EN = 0;
// 结束操作
LOCKREG();
}
|