本帖最后由 LOVE_ELEC 于 2013-2-22 11:04 编辑
tj_zhaozq 发表于 2013-2-21 22:16 
把详细情况和状态说清楚些。
1. 程序的功能。
2. 有没有使用外部资源。
程序功能是对芯片内部的Flash的擦出和写操作!(所用芯片型号为 MC9S12XDT256)
工作流程:操作地址、页、写入数据、写入数据个数设置——Flash擦除—— Flash写(主函数部分)
源码:(该部分代码全部存在 RAM 中)
写Flash函数部分:
ErrorStatus Flash_Program(Transfer_Information Transfer_InformationStruct)
{
byte Inum;
Transfer_Information *Tinformation;
Tinformation = &Transfer_InformationStruct;
while (!FCLKDIV_FDIVLD)
{
FLASH_READ_REG8(&FCLKDIV);
}
while (!FSTAT_CBEIF)
{
FLASH_READ_REG8(&FSTAT);
}
if (FSTAT_PVIOL || FSTAT_ACCERR)
{
FLASH_WRITE_REG8(FSTAT,0x30);
}
FLASH_WRITE_REG8(FPROT,NoProtection); /*Set Flash Protect Range*/
for (Inum = 0; Inum < Tinformation->WByteNum; Inum++)
{
PPAGE = Tinformation->Page;
*((volatile word *)(Tinformation->Addr)) = (*(Tinformation->DFaddr));
FLASH_WRITE_REG8(FCMD,Flash_Command_Program);
FSTAT |= 0x80;
while (!FSTAT_CBEIF)
{
FLASH_READ_REG8(&FSTAT);
}
Tinformation->Addr += 2;
Tinformation->DFaddr++;
}
while (!FSTAT_CCIF)
{
FLASH_READ_REG8(&FSTAT);
}
return SUCCESS;
}
擦出Flash函数部分:
ErrorStatus Flash_SectorErase(Transfer_Information Transfer_InformationStruct)
{
Transfer_Information *Tinformation;
Tinformation = &Transfer_InformationStruct;
while (!FCLKDIV_FDIVLD)
{
FCLKDIV = FCLKDIV_FDIV5_MASK | FCLKDIV_FDIV3_MASK | FCLKDIV_FDIV1_MASK;
FLASH_READ_REG8(&FCLKDIV);
}
while (!FSTAT_CBEIF)
{
FLASH_READ_REG8(&FSTAT);
}
if (FSTAT_PVIOL || FSTAT_ACCERR)
{
FLASH_WRITE_REG8(FSTAT,0x30);
}
PPAGE = Tinformation->Page;
*((volatile word *)(Tinformation->Addr)) = 0xFF; /*OxFF 将被忽略*/
FLASH_WRITE_REG8(FCMD,Flash_Command_SectorErase);
FSTAT |= 0x80;
while (!FSTAT_CCIF);
return SUCCESS;
}
请指教!
|