初级会员

- 积分
- 81
- 金钱
- 81
- 注册时间
- 2020-3-6
- 在线时间
- 26 小时
|
1金钱
本帖最后由 城南一偶 于 2020-3-30 18:28 编辑
大家好
由于我没有LED 所以我就想将flash数据显示在上位机文本框中
由于板子的电容较小可能不能使用PVD掉电检测
参考的是原子的flash做eeprom实验 想实现的是单片机插拔USB数据 重新上电后回将上次接受到的上位机传回的数据返回到上位机
目前 程序flash写入数据不完整 这个有什么好的解决方案吗
主MAIN中程序
while(1)
{
if((rec_flag & 0x80) == 0x80)
{
cnt = rec_flag & 0x3F;
rec_flag = 0;
for(i = 0; i <= cnt; i++)
{
SendChar(rec_buf);
USART_SendData(PC_USART, rec_buf);
STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)rec_buf,SIZE); //放到USART2中断中
}
}
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE);
printf("%s",datatemp);
}
这个应该如何出写程序呢
#if STM32_FLASH_WREN
void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
{
u16 i;
for(i=0;i<NumToWrite;i++)
{
FLASH_ProgramHalfWord(WriteAddr,pBuffer);
WriteAddr+=2;
}
}
#if STM32_FLASH_SIZE <256
#define STM_SECTOR_SIZE 1024
#else
#define STM_SECTOR_SIZE 2048
#endif
u16 STMFLASH_BUF[STM_SECTOR_SIZE/2];
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
{
u32 secpos;
u16 secoff;
u16 secremain;
u16 i;
u32 offaddr;
if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;
FLASH_Unlock();
offaddr=WriteAddr-STM32_FLASH_BASE;
secpos=offaddr/STM_SECTOR_SIZE;
secoff=(offaddr%STM_SECTOR_SIZE)/2;
secremain=STM_SECTOR_SIZE/2-secoff;
if(NumToWrite<=secremain)secremain=NumToWrite;
while(1)
{
STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);
for(i=0;i<secremain;i++)
{
if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;
}
if(i<secremain)
{
FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);
for(i=0;i<secremain;i++)
{
STMFLASH_BUF[i+secoff]=pBuffer;
}
STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);
}else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);
if(NumToWrite==secremain)break;
else
{
secpos++;
secoff=0;
pBuffer+=secremain;
WriteAddr+=secremain;
NumToWrite-=secremain;
if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;
else secremain=NumToWrite;
}
};
FLASH_Lock();
}
#endif
|
|