////////////////////////////////////////////////////////////////////////////////// //文件名:FU6813_FLASH.c // //说明:FU6812系列芯片的DAM底层驱动 // //Log // //Timer Writer Thing Ver // //2018-06-07 Any 优化、重做 V1.8// ////////////////////////////////////////////////////////////////////////////////// #include /** * 预编程一个FLASH扇区 * * @param FlashAddress 要擦除的扇区内的任一地址 * @return 执行结果: * FLASH_FAIL_FROZEN FLASH操作被冻结 * FLASH_FAIL_UNLOCK FLASH编程未解锁 * FLASH_FAIL_ERASE FLASH擦除失败 * FLASH_SUCCESS FLASH操作成功 */ uint8 PreProgram_Flash(uint16 FlashAddress) { bool bEA; bEA = EA; EA = 0; //关闭总中断 if (FlashAddress <= 0x7f00) { FLA_CR = FLAEN | FLAPRE; //扇区预编程使能 FLA_KEY = 0x5a; FLA_KEY = 0x1f; //FLASH解锁 if(ReadBit(RST_SR,RSTFED) == RSTFED) { GP10 = 0; GP11 = 1; } if ((FLA_KEY & (FLAKSTA0 | FLAKSTA1)) == FLAKSTA1) //检测FLASH是否被冻结 { EA = bEA; //恢复总中断 return FLASH_FAIL_FROZEN; } *(uint8 xdata *)FlashAddress = 0xff; //写任意数据 FLA_CR = FLAACT; //开始预编程,完成后FLASH再次上锁 } EA = bEA; //恢复总中断 if(ReadBit(FLA_CR, FLAERR)) return FLASH_FAIL_ERASE; //读取操作结果 return FLASH_SUCCESS; } /** * 擦除一个FLASH扇区 * * @param FlashAddress 要擦除的扇区内的任一地址 * @return 执行结果: * FLASH_FAIL_FROZEN FLASH操作被冻结 * FLASH_FAIL_UNLOCK FLASH编程未解锁 * FLASH_FAIL_ERASE FLASH擦除失败 * FLASH_SUCCESS FLASH操作成功 */ uint8 Erase_Flash(uint16 FlashAddress) { bool bEA; bEA = EA; EA = 0; //关闭总中断 if (FlashAddress <= 0x7f00) { FLA_CR = FLAEN | FLAERS; //扇区擦除使能 FLA_KEY = 0x5a; FLA_KEY = 0x1f; //FLASH解锁 if(ReadBit(RST_SR,RSTFED) == RSTFED) { GP10 = 0; GP11 = 1; } if ((FLA_KEY & (FLAKSTA0 | FLAKSTA1)) == FLAKSTA1) //检测FLASH是否被冻结 { EA = bEA; //恢复总中断 return FLASH_FAIL_FROZEN; } *(uint8 xdata *)FlashAddress = 0xff; //写任意数据 FLA_CR = FLAACT; //开始擦除,完成后FLASH再次上锁 } EA = bEA; //恢复总中断 if(ReadBit(FLA_CR, FLAERR)) return FLASH_FAIL_ERASE; //读取操作结果 return FLASH_SUCCESS; } /** * 单字节写FLASH * * @param FlashAddress 要操作的FLASH地址 * @param FlashData 要写入的数据 * @return 执行结果: * FLASH_FAIL_FROZEN FLASH操作被冻结 * FLASH_FAIL_UNLOCK FLASH编程未解锁 * FLASH_FAIL_WRITE FLASH写入失败 * FLASH_SUCCESS FLASH操作成功 */ uint8 WriteByte_Flash(uint16 FlashAddress, uint8 FlashData) { bool bEA; bEA = EA; EA = 0; //关闭总中断 if (FlashAddress <= 0x7f00) { FLA_CR = FLAEN; //使能写入 FLA_KEY = 0x5a; FLA_KEY = 0x1f; //FLASH预编程解锁 if ((FLA_KEY & (FLAKSTA0 | FLAKSTA1)) == FLAKSTA1) //检测FLASH是否被冻结 { EA = bEA; //恢复总中断 return FLASH_FAIL_FROZEN; } *(uint8 xdata *)FlashAddress = FlashData; //写任意数据 FLA_CR = FLAACT; //开始预编程,完成后FLASH再次上锁 } EA = bEA; //恢复总中断 if(ReadBit(FLA_CR, FLAERR)) return FLASH_FAIL_WRITE; //读取操作结果 return FLASH_SUCCESS; } /** * 向FLASH写数据 * * @param FlashAddress 要操作的FLASH地址 * @param FlashData 要写入的数据 * @return 执行结果: * FLASH_FAIL_FROZEN FLASH操作被冻结 * FLASH_FAIL_UNLOCK FLASH编程未解锁 * FLASH_FAIL_WRITE FLASH写入失败 * FLASH_SUCCESS FLASH操作成功 */ uint8 Write_Flash(uint16 FlashAddress, uint8* FlashData, uint16 sizes) { bool bEA; uint8 WriteByte; bEA = EA; EA = 0; //关闭总中断 while (sizes) { if (FlashAddress <= 0x7f00) { WriteByte = *FlashData; FLA_CR = FLAEN; FLA_KEY = 0x5a; FLA_KEY = 0x1f; if ((FLA_KEY & (FLAKSTA0 | FLAKSTA1)) == FLAKSTA1) { EA = bEA; //恢复总中断 return FLASH_FAIL_FROZEN; } *(uint8 xdata *)FlashAddress = WriteByte; FLA_CR = FLAACT; if(ReadBit(FLA_CR, FLAERR)) { EA = bEA; //恢复总中断 return FLASH_FAIL_WRITE; } } FlashAddress++; FlashData++; sizes--; } EA = bEA; //恢复总中断 return FLASH_SUCCESS; } /** * 读取指定FLASH地址的内容 * * @param FlashAddress 要读取的FLASH的地址 * @return 该地址的内容 */ uint8 Read_Flash(uint16 FlashAddress) { return *(uint8 code *)FlashAddress; }