新手上路
- 积分
- 34
- 金钱
- 34
- 注册时间
- 2021-1-7
- 在线时间
- 7 小时
|
HAL 库的 HAL_FLASH_Program()函数写之后数据是这样的:
2400E2A0 80002C1 80027ED 8002431 80002CD 8000465 8003E59 0 0 0 0 8002BD5 80006AD 0 80027EF 8002D39 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80006BD 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 8003DFD 80002DB 80002DB 0 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 0 0 0 0 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB FFFFFFFF FFFFFFFF
写之前是这样的:总之换了寄存器版本进行写还是一样的,感觉有四分之一没写进去,保持FFFFFFFFFF,经测试擦除完成之后全为FFFFFFFFFF。
2400E2A0 80002C1 80027ED 8002431 80002CD 8000465 8003E59 0 0 0 0 8002BD5 80006AD 0 80027EF 8002D39 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80006BD 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB 8003DFD 80002DB 80002DB 0 80002DB 80002DB 80002DB 80002DB 80002DB 80002DB
申明一点程序是被复制到ITCM 0x00001000开始的地址运行,接收新程序,并打算复制到0x08000000开始的地址并跳转运行,那问题来了,我换成寄存器版本的写函数也有问题,难道跟程序运行的地方有关系吗?还是两个库函数都有问题?导致写失败。
HAL库版本的擦除写函数:
void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)
{
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
if(FlashStatus==HAL_OK)
{
while(WriteAddr<endaddr)//写数据
{
if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD,WriteAddr,(uint64_t)pBuffer)!=HAL_OK)//写入数据
{
break; //写入异常
}
WriteAddr+=32;
pBuffer+=8;
}
}
HAL_FLASH_Lock(); //上锁
}
寄存器版本的擦除写函数:
void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)
{
。。。。。。。。。。。。。。。。。。。。。。。。。。。。
if(FlashStatus==HAL_OK)
{
while(WriteAddr<endaddr)//写数据
{
if(STMFLASH_Write8Word(WriteAddr,pBuffer)!=HAL_OK)//写入数据
{
break; //写入异常
}
WriteAddr+=32;
pBuffer+=8;
}
}
HAL_FLASH_Lock(); //上锁
}
u8 STMFLASH_Write8Word(u32 faddr, u32* pdata)
{
u8 nword=8; //每次写8个字,256bit
u8 res;
res=FLASH_WaitForLastOperation(FLASH_WAITETIME,FLASH_BANK_1);
if(res==0) //OK
{
FLASH->CR1&=~(3<<4); //PSIZE1[1:0]=0,清除原来的设置
FLASH->CR1|=2<<4; //设置为32bit宽
FLASH->CR1|=1<<1; //PG1=1,编程使能
while(nword)
{
*(vu32*)faddr=*pdata; //写入数据
faddr+=4; //写地址+4
pdata++; //偏移到下一个数据首地址
nword--;
}
__DSB(); //写操作完成后,屏蔽数据同步,使CPU重新执行指令序列
res=FLASH_WaitForLastOperation(FLASH_WAITETIME,FLASH_BANK_1); //等待操作完成,一个字编程,最多100us.
FLASH->CR1&=~(1<<1); //PG1=0,清除扇区擦除标志
}
return res;
}
|
|