123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- #include <drive_eeprom.h>
- #include <stm32f10x_conf.h>
- /******************************************************************************
- * flash的写函数:输入:
- u32 StartAddr flash起始地址
- u32 *p_data 待写入数据指针
- u32 size写入数据的数量 输出:0:正确执行
- 非0:出错 注意:输入数据一定是u32 的指针,即数据一定是按照4字节对齐写入的。
- 所以:size也是u32的个数(字节数的4分之一)
- *******************************************************************************/
- u8 writeFlash(u32 StartAddr,u32 *p_data,u32 size)
- {
- volatile FLASH_Status FLASHStatus;
- u32 EndAddr=StartAddr+size*4;
- vu32 NbrOfPage = 0;
- u32 EraseCounter = 0x0, Address = 0x0;
- int i;
- int MemoryProgramStatus=1;
- //为一是通过
- FLASH_Unlock(); //解锁函数
- NbrOfPage=((EndAddr-StartAddr)/PageSize)+1;//有多少个页被擦除//清除所有已有标志
- FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
- //擦页
- FLASHStatus=FLASH_COMPLETE;
- for(EraseCounter=0;(EraseCounter<NbrOfPage)&&(FLASHStatus==FLASH_COMPLETE);EraseCounter++)
- {
- FLASHStatus=FLASH_ErasePage(StartAddr+(PageSize*EraseCounter));
- }
- //开始写数据
- Address = StartAddr;
- i=0;
- while((Address<EndAddr)&&(FLASHStatus==FLASH_COMPLETE))
- {
- FLASHStatus=FLASH_ProgramWord(Address,p_data[i++]);
- Address=Address+4;
- }
- //检验数据是否出错
- Address = StartAddr;
- i=0;
- while((Address < EndAddr) && (MemoryProgramStatus != 0))
- {
- if((*(vu32*) Address) != p_data[i++])
- { MemoryProgramStatus = 0;
- return 1;
- }
- Address += 4;
- }
- return 0;
- }
- // 读取内部flash
- int readFlash(u32 StartAddr,u32 *p_data,u32 size)
- {
- u32 EndAddr=StartAddr+size*4;
- int MemoryProgramStatus=1;
- u32 Address = 0x0;
- int i=0;
- Address = StartAddr;
- while((Address < EndAddr) && (MemoryProgramStatus != 0))
- {
- p_data[i++]=(*(vu32*) Address);
- Address += 4;
- }
- return 0;
- }
- /*
- 调用例子 flash_write(0x0800C000,&data[0],10);
- flash_read(0x0800C000,&data_temp[0],10);
- */
- /*
- 测试读写flash
- void wite(void)
- {
- float pi=5888.55;
- char i;
- float test;
- u32 byte[4];
- u32 read[4];
- char bufg[16];
- memcpy(byte,&pi,sizeof(float)); //将1个float型数据拆分成4个char
- writeFlash(0x0800C000,&byte[0],4);
- delayms(1000);
- readFlash(0x0800C000,&read[0],4);
- memcpy(&test,read,sizeof(float)); //将4个char型数据转换成1个float
- sprintf(bufg,"%.2f",test);
- Send_Debug_Info(bufg,strlen(bufg));
- }
- */
|