在线时间10 小时
UID2108853
注册时间2014-9-4
NXP金币0
该用户从未签到
注册会员

- 积分
- 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 */
}
} |
|