楼主: frank0229

[已解决] MKE02Z64XXX2的EEPROM(已解决)

[复制链接]

该用户从未签到

3

主题

25

帖子

0

注册会员

Rank: 2

积分
69
最后登录
2014-10-11
 楼主| 发表于 2014-9-19 11:08:27 | 显示全部楼层
是的  我用PE生成,再倒入MDK里面的


LDD_TDeviceData* FLASH1_Init(LDD_TUserData *UserDataPtr)
{
  FLASH1_TDeviceData *DevDataPtr;

  /* Allocate FLASH_LDD device structure */
  /* {Default RTOS Adapter} Driver memory allocation: Dynamic allocation is simulated by a pointer to the static object */
  DevDataPtr = &DevDataPtr__DEFAULT_RTOS_ALLOC;
  DevDataPtr->UserDataPtr = UserDataPtr; /* Store the user data */
  /* Registration of the device structure */
  PE_LDD_RegisterDeviceStructure(PE_LDD_COMPONENT_FLASH1_ID,DevDataPtr);
  DevDataPtr->EnUser = TRUE;           /* Initialize user state variable */
  DevDataPtr->CurrentOperationStatus = LDD_FLASH_IDLE; /* Initialization of the Current operation status variable */
  DevDataPtr->CurrentOperation = LDD_FLASH_NO_OPERATION; /* Initialization of the Current operation type item */
  DevDataPtr->CurrentErrorFlags = 0U;  /* Initialization of the Current error flags item */
  if ((((uint32_t)&DevDataPtr->SafeRoutine) & 3U) != 0U) { /* Is the destination address aligned to 32bit? */
    DevDataPtr->SafeRoutinePtr = (LDD_FLASH_TSafeRoutinePtr)((((uint32_t)&DevDataPtr->SafeRoutine) + 3U) & ~(uint32_t)3); /* If the destination address is not aligned to 4 bytes, and save the destination address into the internal data structure */
  } else {
    DevDataPtr->SafeRoutinePtr = (LDD_FLASH_TSafeRoutinePtr)(void *)&DevDataPtr->SafeRoutine; /* If the destination address is aligned to 4 bytes, save the destination address into the internal data structure */
  }
  *(LDD_FLASH_TSafeRoutine *)(void *)DevDataPtr->SafeRoutinePtr = *(LDD_FLASH_TSafeRoutine *)(void *)&SafeRoutine; /* Copy the safe routine's code to a buffer in the internal data structure to be the code of the routine be runned from */
  #if defined(SIM_PDD_CLOCK_GATE_FTMRH)
  SIM_PDD_SetClockGate(SIM_BASE_PTR, SIM_PDD_CLOCK_GATE_FTMRH, PDD_ENABLE);
  #endif
  /* FTMRH_FCLKDIV: FDIVLD=0,FDIVLCK=0,FDIV=0x10 */
  FTMRH_FCLKDIV = FTMRH_FCLKDIV_FDIV(0x10); /* Set clock divider */
  return DevDataPtr;
}
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-9-19 11:12:22 | 显示全部楼层
楼主你好,我把我之前做的KE02_FLASHLDD的地址给改为了0x10000000,eeprom的地址。
运行之后是可以的,所以应该是你的配置有问题,
稍后我把我的代码给你参考。
我的是CW的,PE配置和它一样。
或者,你可以直接把我的生成代码的FLASH1.C以及FLASH1.h拷贝进你的工程。

回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-9-19 11:13:41 | 显示全部楼层
KE02_FLASH_LDD.rar (139.57 KB, 下载次数: 30)
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-9-19 11:14:34 | 显示全部楼层
32.jpg
我的运行图片,可以看到EEPROM地址有值。

回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

25

帖子

0

注册会员

Rank: 2

积分
69
最后登录
2014-10-11
 楼主| 发表于 2014-9-19 11:16:48 | 显示全部楼层
但是配置我是PE自动生成的,我自己的功能函数仅仅是在MAIN里面调用了FLASH_WRITE  ,在MAIN使用了
/*
** ===================================================================
**     Method      :  FLASH1_MainEngine (component FLASH_LDD)
**
**     Description :
**         Main programming routine.
**         This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
void FLASH1_MainEngine(LDD_TDeviceData *DeviceDataPtr)
{
  FLASH1_TDeviceDataPtr DevDataPtr = (FLASH1_TDeviceDataPtr)DeviceDataPtr;

  uint32 Index;
  uint32_t j;
  uint32_t AlignedFlashAddress;
  uint8_t WrittenData[4];
  uint8_t CurrentFlags;
  
  if (DevDataPtr->CurrentOperationStatus == LDD_FLASH_START) {
    /* First run of current operation */
    FTMRH_PDD_ClearFlags(FTMRH_BASE_PTR, FTMRH_PDD_ACCESS_ERROR_FLAG | FTMRH_PDD_PROTECTION_VIOLATION_FLAG);
    CurrentFlags = 0U;
    DevDataPtr->CurrentErrorFlags = 0U;
    DevDataPtr->CurrentOperationStatus = LDD_FLASH_RUNNING;
  } else if(DevDataPtr->CurrentOperation == LDD_FLASH_READ) {
    /* For Read operation HW flags has no meaning */
    CurrentFlags = 0U;
  } else {
    /* After HW command is done HW flags must be checked */
    CurrentFlags = DevDataPtr->CurrentErrorFlags | FTMRH_PDD_GetFlags(FTMRH_BASE_PTR);
  }
  if (CurrentFlags != 0U) {
    /* Command error detected */
    DevDataPtr->CurrentOperationStatus = LDD_FLASH_FAILED;
    FTMRH_PDD_DisableCommandCompleteInterrupt(FTMRH_BASE_PTR); /* Disable the Command complete interrupt */
    return;
  } else if ((int32_t)DevDataPtr->CurrentDataSize <= 0) {
    /* Command done */
    DevDataPtr->CurrentOperationStatus = LDD_FLASH_IDLE;
    FTMRH_PDD_DisableCommandCompleteInterrupt(FTMRH_BASE_PTR); /* Disable the Command complete interrupt */
    FLASH1_OnOperationComplete(DevDataPtr->UserDataPtr);
  } else {
    /* Command in progress */
    switch (DevDataPtr->CurrentOperation) {
      case LDD_FLASH_WRITE:
        Index = 2U;
        if (DevDataPtr->CurrentFlashAddress >= FLASH1_EEPROM_ADDRESS) {
          /* EEPROM memory is addressed */
          FTMRH_PDD_SetAddress(FTMRH_BASE_PTR, DevDataPtr->CurrentFlashAddress);
          while ((DevDataPtr->CurrentDataSize) && (Index <= 5U)) {
            if ((*(uint8_t*)DevDataPtr->CurrentFlashAddress ^ *(uint8_t*)DevDataPtr->CurrentUserAddress) & *(uint8_t*)DevDataPtr->CurrentUserAddress) {
              /* Only erase operation can change bits from 0 to 1 value */
              DevDataPtr->CurrentErrorFlags |= LDD_FLASH_MULTIPLE_WRITE_ERROR;
              return;
            }
            FTMRH_PDD_SetProgrammedByte(FTMRH_BASE_PTR, Index++, *(uint8_t*)DevDataPtr->CurrentUserAddress++);
            DevDataPtr->CurrentFlashAddress++;
            DevDataPtr->CurrentDataSize--;
          }
        } else {
          /* FLASH memory is addressed */
          FTMRH_PDD_SetAddress(FTMRH_BASE_PTR, DevDataPtr->CurrentFlashAddress & ~(uint32_t)FLASH1_FLASH_WRITABLE_UNIT_MASK);
          while ((DevDataPtr->CurrentDataSize) && (Index <= 5U)) {
            AlignedFlashAddress = DevDataPtr->CurrentFlashAddress & ~(uint32_t)FLASH1_FLASH_WRITABLE_UNIT_MASK;
            for (j=0x00U; j<=0x03U; j++) {
              if ((AlignedFlashAddress < DevDataPtr->CurrentFlashAddress) || (DevDataPtr->CurrentDataSize == 0x00U)) {
                WrittenData[j] = *(uint8_t*)AlignedFlashAddress++;
              } else {
                WrittenData[j] = *(uint8_t*)DevDataPtr->CurrentUserAddress++;
                DevDataPtr->CurrentDataSize--;
              }
            }
            AlignedFlashAddress = DevDataPtr->CurrentFlashAddress & ~(uint32_t)FLASH1_FLASH_WRITABLE_UNIT_MASK;
            if ((*(uint32_t*)AlignedFlashAddress ^ *(uint32_t*)(void*)WrittenData) & *(uint32_t*)(void*)WrittenData) {
              /* Only erase operation can change bits from 0 to 1 value */
              DevDataPtr->CurrentErrorFlags |= LDD_FLASH_MULTIPLE_WRITE_ERROR;
              return;
            }
            DevDataPtr->CurrentFlashAddress = AlignedFlashAddress + 4U;
            FTMRH_PDD_SetProgrammedWord(FTMRH_BASE_PTR, Index++, WrittenData[1], WrittenData[0]);
            FTMRH_PDD_SetProgrammedWord(FTMRH_BASE_PTR, Index++, WrittenData[3], WrittenData[2]);
          }
        }
        break;
      case LDD_FLASH_ERASE:
        FTMRH_PDD_SetAddress(FTMRH_BASE_PTR, DevDataPtr->CurrentFlashAddress);
        DevDataPtr->CurrentFlashAddress += DevDataPtr->CurrentFlashAddressIncrement;
        DevDataPtr->CurrentDataSize -= DevDataPtr->CurrentFlashAddressIncrement;
        break;
      case LDD_FLASH_READ:
        while (DevDataPtr->CurrentDataSize) {
          *(uint8_t*)DevDataPtr->CurrentUserAddress++ = *(uint8_t*)DevDataPtr->CurrentFlashAddress++;
          DevDataPtr->CurrentDataSize--;
        }
        return;
      default:
        DevDataPtr->CurrentDataSize = 0U;
        break;
    }
    ((LDD_FLASH_TSafeRoutinePtr)((uint32_t)(DevDataPtr->SafeRoutinePtr) | 1U))(); /* Run the Safe routine */
  }
}
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

25

帖子

0

注册会员

Rank: 2

积分
69
最后登录
2014-10-11
 楼主| 发表于 2014-9-19 11:17:08 | 显示全部楼层
是不是PE还是有缺陷的
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-9-19 11:22:46 | 显示全部楼层
frank0229 发表于 2014-9-19 11:17
是不是PE还是有缺陷的

我用的PE生成出来就是对的,你应该是配置有问题。
你对照下我的程序界面配置看看,
你flash_ldd界面,EEPROM的地址写了没有?
33.jpg
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

25

帖子

0

注册会员

Rank: 2

积分
69
最后登录
2014-10-11
 楼主| 发表于 2014-9-19 11:24:43 | 显示全部楼层
这是我PE中的配置
捕获.PNG
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

25

帖子

0

注册会员

Rank: 2

积分
69
最后登录
2014-10-11
 楼主| 发表于 2014-9-19 11:25:12 | 显示全部楼层
自动生成的  默认
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-9-19 11:33:26 | 显示全部楼层
frank0229 发表于 2014-9-19 11:25
自动生成的  默认

你先把我的flash.c和头文件拷贝过去用下试试,我这边待会用PE生成个导入keil,稍后给你回复。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-7-21 00:27 , Processed in 0.107772 second(s), 30 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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