| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- //////////////////////////////////////////////////////////////////////////////////
- //文件名:FU6813_FLASH.c //
- //说明:FU6812系列芯片的DAM底层驱动 //
- //Log //
- //Timer Writer Thing Ver //
- //2018-06-07 Any 优化、重做 V1.8//
- //////////////////////////////////////////////////////////////////////////////////
- #include <FLASH.h>
- /**
- * 预编程一个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;
- }
|