drive_eeprom.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include <drive_eeprom.h>
  2. #include <stm32f10x_conf.h>
  3. /******************************************************************************
  4. * flash的写函数:输入:
  5. u32 StartAddr flash起始地址
  6. u32 *p_data 待写入数据指针
  7. u32 size写入数据的数量 输出:0:正确执行
  8. 非0:出错 注意:输入数据一定是u32 的指针,即数据一定是按照4字节对齐写入的。
  9. 所以:size也是u32的个数(字节数的4分之一)
  10. *******************************************************************************/
  11. u8 writeFlash(u32 StartAddr,u32 *p_data,u32 size)
  12. {
  13. volatile FLASH_Status FLASHStatus;
  14. u32 EndAddr=StartAddr+size*4;
  15. vu32 NbrOfPage = 0;
  16. u32 EraseCounter = 0x0, Address = 0x0;
  17. int i;
  18. int MemoryProgramStatus=1;
  19. //为一是通过
  20. FLASH_Unlock(); //解锁函数
  21. NbrOfPage=((EndAddr-StartAddr)/PageSize)+1;//有多少个页被擦除//清除所有已有标志
  22. FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
  23. //擦页
  24. FLASHStatus=FLASH_COMPLETE;
  25. for(EraseCounter=0;(EraseCounter<NbrOfPage)&&(FLASHStatus==FLASH_COMPLETE);EraseCounter++)
  26. {
  27. FLASHStatus=FLASH_ErasePage(StartAddr+(PageSize*EraseCounter));
  28. }
  29. //开始写数据
  30. Address = StartAddr;
  31. i=0;
  32. while((Address<EndAddr)&&(FLASHStatus==FLASH_COMPLETE))
  33. {
  34. FLASHStatus=FLASH_ProgramWord(Address,p_data[i++]);
  35. Address=Address+4;
  36. }
  37. //检验数据是否出错
  38. Address = StartAddr;
  39. i=0;
  40. while((Address < EndAddr) && (MemoryProgramStatus != 0))
  41. {
  42. if((*(vu32*) Address) != p_data[i++])
  43. { MemoryProgramStatus = 0;
  44. return 1;
  45. }
  46. Address += 4;
  47. }
  48. return 0;
  49. }
  50. // 读取内部flash
  51. int readFlash(u32 StartAddr,u32 *p_data,u32 size)
  52. {
  53. u32 EndAddr=StartAddr+size*4;
  54. int MemoryProgramStatus=1;
  55. u32 Address = 0x0;
  56. int i=0;
  57. Address = StartAddr;
  58. while((Address < EndAddr) && (MemoryProgramStatus != 0))
  59. {
  60. p_data[i++]=(*(vu32*) Address);
  61. Address += 4;
  62. }
  63. return 0;
  64. }
  65. /*
  66. 调用例子 flash_write(0x0800C000,&data[0],10);
  67. flash_read(0x0800C000,&data_temp[0],10);
  68. */
  69. /*
  70. 测试读写flash
  71. void wite(void)
  72. {
  73. float pi=5888.55;
  74. char i;
  75. float test;
  76. u32 byte[4];
  77. u32 read[4];
  78. char bufg[16];
  79. memcpy(byte,&pi,sizeof(float)); //将1个float型数据拆分成4个char
  80. writeFlash(0x0800C000,&byte[0],4);
  81. delayms(1000);
  82. readFlash(0x0800C000,&read[0],4);
  83. memcpy(&test,read,sizeof(float)); //将4个char型数据转换成1个float
  84. sprintf(bufg,"%.2f",test);
  85. Send_Debug_Info(bufg,strlen(bufg));
  86. }
  87. */