中级会员
 
- 积分
- 256
- 金钱
- 256
- 注册时间
- 2018-8-8
- 在线时间
- 50 小时
|
30金钱
我创建了一个数组u8 data[]={"abcdefghijklmn"}; 先把该数组的数据写入flash的0x08010000,然后读取。
第一次读取得到的数据为abcdefghijklmn,正确。但是再次写入,读取后,前面的四个字节就会丢失,变成了efghijklmn;
然后重复写入、读取,就会变成ijklmn。。。mn。。。
最后一直是mn。求各位大佬帮忙看看。。。
下面上代码:
————————————————————————————————————————————————————————————————————
main函数:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "key.h"
- #include "lcd.h"
- #include "sdram.h"
- #include "stmflash.h"
- int main(void)
- {
- u8 key;
- u8 i=0;
- u8 data[]={"abcdefghijklmn"};
- #define SIZE sizeof(data)/4+((sizeof(data)%4)?1:0)
- u8 buff[SIZE];
- HAL_Init();
- Stm32_Clock_Init(360,25,2,8);
- delay_init(180);
- uart_init(115200);
- LED_Init();
- KEY_Init();
- SDRAM_Init();
- LCD_Init();
-
- LCD_Clear(WHITE);
- POINT_COLOR=RED;
- BACK_COLOR=0xffff;
- LCD_ShowString(10,30,260,32,32,"Apollo STM32F429");
- LCD_ShowString(10,70,192,32,32,"FLASH TEST");
- POINT_COLOR=BLUE;
- printf("%d,%d\r\n",sizeof(data),sizeof(buff));
- while(1)
- {
- printf("1-%s\r\n",buff);
- key=KEY_Scan(0);´
- if(key==KEY0_PRES)
- {
- FlashRead(0x08010000,(u32*)buff,SIZE);
- LCD_ShowString(10,130,192,16,16,buff);
- printf("2-%s\r\n",buff);
- }
- if(key==KEY1_PRES)
- {
- FlashWrite(0x08010000,(u32*)data,SIZE);
- }
- delay_ms(10);
- i++;
- if(i==20)
- {
- i=0;
- LED0=!LED0;
- }
- }
- }
复制代码 flash读写函数:
- #include "stmflash.h"
- u32 GetFlashSector(u32 addr)
- {
- if(addr<ADDR_FLASH_SECTOR_1) return FLASH_SECTOR_0;
- else if(addr<ADDR_FLASH_SECTOR_2) return FLASH_SECTOR_1;
- else if(addr<ADDR_FLASH_SECTOR_3) return FLASH_SECTOR_2;
- else if(addr<ADDR_FLASH_SECTOR_4) return FLASH_SECTOR_3;
- else if(addr<ADDR_FLASH_SECTOR_5) return FLASH_SECTOR_4;
- else if(addr<ADDR_FLASH_SECTOR_6) return FLASH_SECTOR_5;
- else if(addr<ADDR_FLASH_SECTOR_7) return FLASH_SECTOR_6;
- else if(addr<ADDR_FLASH_SECTOR_8) return FLASH_SECTOR_7;
- else if(addr<ADDR_FLASH_SECTOR_9) return FLASH_SECTOR_8;
- else if(addr<ADDR_FLASH_SECTOR_10)return FLASH_SECTOR_9;
- else if(addr<ADDR_FLASH_SECTOR_11)return FLASH_SECTOR_10;
- else if(addr<ADDR_FLASH_SECTOR_12)return FLASH_SECTOR_11;
- else if(addr<ADDR_FLASH_SECTOR_13)return FLASH_SECTOR_12;
- else if(addr<ADDR_FLASH_SECTOR_14)return FLASH_SECTOR_13;
- else if(addr<ADDR_FLASH_SECTOR_15)return FLASH_SECTOR_14;
- else if(addr<ADDR_FLASH_SECTOR_16)return FLASH_SECTOR_15;
- else if(addr<ADDR_FLASH_SECTOR_17)return FLASH_SECTOR_16;
- else if(addr<ADDR_FLASH_SECTOR_18)return FLASH_SECTOR_17;
- else if(addr<ADDR_FLASH_SECTOR_19)return FLASH_SECTOR_18;
- else if(addr<ADDR_FLASH_SECTOR_20)return FLASH_SECTOR_19;
- else if(addr<ADDR_FLASH_SECTOR_21)return FLASH_SECTOR_20;
- else if(addr<ADDR_FLASH_SECTOR_22)return FLASH_SECTOR_21;
- else if(addr<ADDR_FLASH_SECTOR_23)return FLASH_SECTOR_22;
- return FLASH_SECTOR_23;
- }
- u32 Flash_ReadOneWord(u32 addr)
- {
- return *(vu32*)addr;
- }
- void FlashRead(u32 addr,u32 *rbuff,u32 NumToRead)
- {
- u32 i;
- for(i=0;i<NumToRead;i++)
- {
- rbuff[i]=Flash_ReadOneWord(addr);
- addr+=4;
- }
- }
- void FlashWrite(u32 addr,u32 *wbuff,u32 NumToWrite)
- {
- FLASH_EraseInitTypeDef FLASH_EraseInit;
- u32 endaddr;
- u32 sectorerror=0;
- u32 eraseaddr;
- eraseaddr=addr;
- endaddr=addr+NumToWrite*4;
- HAL_FLASH_Unlock();
-
- if(addr<0x08000000||addr>0x1FFF0000||addr%4) return;
-
- while(eraseaddr<endaddr)
- {
- if(Flash_ReadOneWord(eraseaddr)!=0xffffffff)
- {
- FLASH_EraseInit.Banks=FLASH_BANK_1;
- FLASH_EraseInit.NbSectors=1;
- FLASH_EraseInit.Sector=GetFlashSector(eraseaddr);
- FLASH_EraseInit.TypeErase=FLASH_TYPEERASE_SECTORS;
- FLASH_EraseInit.VoltageRange=FLASH_VOLTAGE_RANGE_3;
- if(HAL_FLASHEx_Erase(&FLASH_EraseInit,§orerror)!=HAL_OK)
- {
- break;
- }
- }else eraseaddr+=4;
- FLASH_WaitForLastOperation(50000);
- }
- if(FLASH_WaitForLastOperation(50000)==HAL_OK)
- {
- while(addr<endaddr)
- {
- if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,addr,*wbuff)!=HAL_OK)
- {
- break;
- }
- addr+=4;
- wbuff++;
- }
- }
- HAL_FLASH_Lock();
-
- }
复制代码
|
|