查看: 2400|回复: 4

[分享] 请教MK10DX256VLL7内部FLASH模拟EEPROM的方法

[复制链接]

该用户从未签到

6

主题

15

帖子

0

注册会员

Rank: 2

积分
172
最后登录
2017-8-11
发表于 2015-3-31 13:47:12 | 显示全部楼层 |阅读模式
请教大侠:
     我的CPU型号是MK10DX256VLL7, 使用CW10.6开发环境, 通过PE将32K的D-FLASH分区为D-FLASH和EEROM, 如下图:

无标题.png
使用EPROM的代码为网站上的案例, 略作修改如下, 我的问题:
1. 虽然已经用PE划分了EEPROM分区,但CW调试时,partition_flash()返回1, 说明PE没有分区成功.
2. 而且, 再次CW调试进入,还是返回1, 说明用partition_flash()也没有分区成功。
哪位大侠指点一下?

#define EEPROMBASEADDRESS_M     0x14000000
#define EEPROM_512_512 0x34   // subsystem A = 512 bytes, subsystem B = 512 bytes
#define DFLASH_SIZE_24    0x09 /* Defines for the dflash_size parameter */
int partition_flash(int eeprom_size, int dflash_size)
{
/* Test to make sure the device is not already partitioned. If it
* is already partitioned, then return with no action performed.
*/
if ((SIM_FCFG1 & SIM_FCFG1_DEPART(0xF)) != 0x00000F00)
{
  return 0;
}
/* Write the FCCOB registers */
FTFL_FCCOB0 = FTFL_FCCOB0_CCOBn(0x80); // Selects the PGMPART command
FTFL_FCCOB1 = 0x00;
FTFL_FCCOB2 = 0x00;
FTFL_FCCOB3 = 0x00;

/* FCCOB4 is written with the code for the subsystem sizes (eeprom_size define) */
FTFL_FCCOB4 = eeprom_size;
/* FFCOB5 is written with the code for the Dflash size (dflash_size define) */
FTFL_FCCOB5 = dflash_size;
/* All required FCCOBx registers are written, so launch the command */
FTFL_FSTAT = FTFL_FSTAT_CCIF_MASK;
/* Wait for the command to complete */
while(!(FTFL_FSTAT & FTFL_FSTAT_CCIF_MASK));
return 1;
}

unsigned char WRITE(unsigned long *pEEPAddr,unsigned long *pRamAddr,unsigned short int num)
{
unsigned long *pusDstAddr = (unsigned long *)((unsigned long)pEEPAddr + EEPROMBASEADDRESS_M);
unsigned long *pusSrcAddr = (unsigned long *)pRamAddr;
unsigned short i;

while(!(FTFL_FCNFG & FTFL_FCNFG_EEERDY_MASK));
for(i=0;i<num/4;i++)
{
  *((unsigned long*)(pusDstAddr)) = *((unsigned long*)(pusSrcAddr));
  pusDstAddr = pusDstAddr + 1;
  pusSrcAddr = pusSrcAddr+ 1;
  while(!(FTFL_FCNFG & FTFL_FCNFG_EEERDY_MASK));
}
return 0;
}

unsigned char READ(unsigned long *pEEPAddr,unsigned long *pRamAddr,unsigned short num)
{
unsigned long *pusDstAddr = (unsigned long *)pEEPAddr;
unsigned long *pusSrcAddr = (unsigned long *)pRamAddr;
unsigned short i;
for(i=0; i<num/4;i++)
{
  while(!(FTFL_FCNFG & FTFL_FCNFG_EEERDY_MASK));
  
  *((unsigned long*)(pusSrcAddr)) = *((unsigned long*)(pusDstAddr));
  pusDstAddr = pusDstAddr + 1;
  pusSrcAddr = pusSrcAddr + 1;
}
while(!(FTFL_FCNFG & FTFL_FCNFG_EEERDY_MASK));
return OK;
}


unsigned char ConfigPara[32];
void InterFlashTest()
{
  unsigned long *pulPara = (unsigned long *)ConfigPara;
  unsigned char i;
  BYTE          result;
  partition_flash(EEPROM_512_512,DFLASH_SIZE_24);
   if ( 0 == READ((unsigned long *)0x14000000, pulPara, 32))
  {
      memset((void *)ConfigPara, 0x55, 32);
      WRITE((unsigned long)0x0, pulPara, 32);
  }
  }
}

回复

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-4-17 17:48:40 | 显示全部楼层
qditer 发表于 2015-4-16 19:12
请问库函数DEFlashPartition,需要每次上电都调用吗?另外DEFlashPartition总是返回错误0x20是怎么回事? ...

不需要每次都分区,第一次分区成功后,下面就不需要分区了。
int partition_flash(int eeprom_size, int dflash_size)
{
      /* Test to make sure the device is not already partitioned. If it
       * is already partitioned, then return with no action performed.
       */
      if ((SIM_FCFG1 & SIM_FCFG1_DEPART(0xF)) != 0x00000F00)
      {
          printf("\nDevice is already partitioned.\n");
          return 0;
      }
这样,如果分过区了,就返回,不做分区,没做分区才分区。
回复 支持 1 反对 0

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-4-1 13:18:30 | 显示全部楼层
楼主你好!
返回1说明是分区成功,返回0说明是已经分区过。
所以你是可以分区的。
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

15

帖子

0

注册会员

Rank: 2

积分
172
最后登录
2017-8-11
 楼主| 发表于 2015-4-3 14:20:12 | 显示全部楼层
我的问题是每次运此行都需要分区, 好像上运行时的分区设置没有保存到寄存器中一样.
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

58

帖子

0

中级会员

Rank: 3Rank: 3

积分
267
最后登录
2016-8-24
发表于 2015-4-16 19:12:56 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2015-4-1 13:18
楼主你好!
返回1说明是分区成功,返回0说明是已经分区过。
所以你是可以分区的。 ...

请问库函数DEFlashPartition,需要每次上电都调用吗?另外DEFlashPartition总是返回错误0x20是怎么回事?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-23 10:33 , Processed in 0.101286 second(s), 27 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表