新手上路
- 积分
- 32
- 金钱
- 32
- 注册时间
- 2017-8-22
- 在线时间
- 8 小时
|
2金钱
问题描述:
芯片为STM32H743IIT6,片内FLASH有2M字节,分为2个bank,每个1M,程序放在bank1的第一个扇区,读写第一个bank的其他各个扇区都正常,但是第二个bank就不正常,具体表现为写入只能正常写入32个字,后续都失败【从读出来数据判断,但是写入时是成功的】,写入代码如下:
int32_t flash_write(uint32_t addr, uint32_t *p_buf, uint32_t words_to_write)
{
FLASH_EraseInitTypeDef FlashEraseInit;
HAL_StatusTypeDef flash_status = HAL_OK;
uint32_t sector_err = 0;
uint32_t addrx = 0;
uint32_t endaddr = 0;
uint32_t bank = 0, sector = 23;
if((!IS_FLASH_ADDRESS(addr)) || (addr % 4))
{
printf("### flash addr [0x%08x] error\r\n", addr);
return 1;
}
if(IS_FLASH_PROGRAM_ADDRESS_BANK1(addr))
{
HAL_FLASHEx_Unlock_Bank1();
bank = FLASH_BANK_1;
sector = get_flash_sector(FLASH_BANK1_BASE, addr);
}
else if(IS_FLASH_PROGRAM_ADDRESS_BANK2(addr))
{
HAL_FLASHEx_Unlock_Bank2();
bank = FLASH_BANK_2;
sector = get_flash_sector(FLASH_BANK2_BASE, addr);
}
addrx = addr;
endaddr = addr + (words_to_write<<2);
while(addrx < endaddr)
{
if(flash_read_32bits(addrx) != 0XFFFFFFFF)
{
FlashEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
FlashEraseInit.Sector = sector;
FlashEraseInit.NbSectors = 1;
FlashEraseInit.Banks = bank;
FlashEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3;
flash_status = HAL_FLASHEx_Erase(&FlashEraseInit, §or_err);
if(flash_status != HAL_OK)
{
printf("### Erase sector %d error : %d \r\n", sector_err, flash_status);
return 2;
}
SCB_CleanInvalidateDCache();
}
else
{
addrx += 4;
}
FLASH_WaitForLastOperation(FLASH_WAITETIME, bank);
}
flash_status = FLASH_WaitForLastOperation(FLASH_WAITETIME, bank);
if(flash_status == HAL_OK)
{
while(addr < endaddr)
{
flash_status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, addr, (uint64_t)p_buf);
if(flash_status != HAL_OK)
{
printf("write data to addr 0x%x error : %d \n", addr, flash_status);
return 3;
}
addr += 32;
p_buf += 8;
}
}
if(IS_FLASH_PROGRAM_ADDRESS_BANK1(addr))
{
HAL_FLASHEx_Lock_Bank1();
}
else if(IS_FLASH_PROGRAM_ADDRESS_BANK2(addr))
{
HAL_FLASHEx_Lock_Bank2();
}
return 0;
}
求大神指点 
两外按照参考手册描述,程序的bank1是不能对bank1擦写的,只能对bank2进行擦写,原子哥的例程也是只对bank1擦写
|
|