flash.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "includes.h"
  2. ////读取指定地址的半字(16位数据)
  3. ////faddr:读地址(此地址必须为2的倍数!!)
  4. ////返回值:对应数据.
  5. uint16_t STMFLASH_ReadHalfWord(uint32_t faddr)
  6. {
  7. return *(volatile uint16_t*)faddr;
  8. }
  9. ////从指定地址开始读出指定长度的数据
  10. ////ReadAddr:起始地址
  11. ////pBuffer:数据指针
  12. ////NumToWrite:半字(16位)数
  13. void STMFLASH_Read(uint32_t ReadAddr,uint16_t *pBuffer,uint16_t NumToRead)
  14. {
  15. uint16_t i;
  16. for(i=0;i<NumToRead;i++)
  17. {
  18. pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节.
  19. ReadAddr+=2;//偏移2个字节.
  20. }
  21. }
  22. /**********************************************************************************************************
  23. *写页数据,擦除整页1024字节,并写入Byte数据,数据可少于1024Btye,但必须是偶数。
  24. ************************************************************************************************************/
  25. void WritePageData(unsigned long WriteAddr,unsigned char *pData,unsigned short DataLen)
  26. {
  27. uint32_t First_Page;
  28. uint32_t EraseCounter;
  29. unsigned short i;
  30. unsigned short datas;
  31. FLASH_Status status;
  32. FLASH_Unlock();//先解锁
  33. FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR); //清楚相应的标志位
  34. if(WriteAddr<FLASH_Start_Addr || WriteAddr>=FLASH_End_Addr) return;//非法地址
  35. if(WriteAddr&0x0000003FF)return;//非页首地址
  36. status=FLASH_ErasePage(WriteAddr);//擦除这个页
  37. if(status!=FLASH_COMPLETE){
  38. return;
  39. }
  40. /* 写入FLASH */
  41. for(i = 0; i < DataLen; i+=2)
  42. {
  43. //数据8位融合为16位
  44. datas = (((unsigned short)pData[i+1])<<8) + ((unsigned short)pData[i]);
  45. FLASH_ProgramHalfWord((WriteAddr+i),datas);
  46. }
  47. /* 上锁 */
  48. FLASH_Lock();
  49. }
  50. /**********************************************************************************************************
  51. ************************************************************************************************************/
  52. void ReadFlashData(unsigned long ReadAddr,unsigned char *pData,unsigned short DataLen)
  53. {
  54. unsigned int i,j;
  55. unsigned short temp;
  56. j=0;
  57. for(i=0;i<DataLen;i+=2)
  58. {
  59. temp=STMFLASH_ReadHalfWord(ReadAddr+i);
  60. pData[j++]=(unsigned char)(temp&0xff);
  61. pData[j++]=(temp>>8)&0xff;
  62. }
  63. }