之前接手了一个项目,它有个操作是将一些初始化数据写入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();
- }
|