OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3005|回复: 2

STM32H7内部flash的bank2 读写错误

[复制链接]

5

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2017-8-22
在线时间
8 小时
发表于 2020-1-11 18:06:36 | 显示全部楼层 |阅读模式
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, &sector_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擦写

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-1-11 18:06:37 | 显示全部楼层
回复

使用道具 举报

5

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2017-8-22
在线时间
8 小时
 楼主| 发表于 2020-1-12 08:17:24 | 显示全部楼层

寄存器版本测试OK,但是按照参考手册说法,同一个bank不能进行RWW,实测可以,原因暂时不明白,最后感谢原子哥半夜回复
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-11 16:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表