OpenEdv-开源电子网

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

STM32H750 IAP 写flash异常hal库HAL_FLASH_Program函数进行写入,再回读,和写之前的数据对比不一致,换成寄存器版本还是一样

[复制链接]

3

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2021-1-7
在线时间
7 小时
发表于 2022-4-8 15:19:34 | 显示全部楼层 |阅读模式
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;
}

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

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2022-4-10 18:30:23 | 显示全部楼层

回帖奖励 +1 金钱

帮顶                    
回复 支持 反对

使用道具 举报

6

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2013-8-15
在线时间
60 小时
发表于 2022-4-15 10:24:53 | 显示全部楼层
本帖最后由 heyangfengyue 于 2022-4-15 10:27 编辑

我也遇到了同样的问题,MCU是STM32H743,只能写入内部FLASH的512个bit,地址在0x081e0000。用的是原子例子程序该的,例子程序是写入字符串,经过测试,超过32个字符,也是显示不了的。。。。期待解决啊。我贴一下我的测试代码图片。
QQ图片20220415102137.png QQ图片20220415102257.png QQ图片20220415102325.png

FLASH中的值

FLASH中的值

回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2021-1-7
在线时间
7 小时
 楼主| 发表于 2022-4-15 11:19:05 | 显示全部楼层
heyangfengyue 发表于 2022-4-15 10:24
我也遇到了同样的问题,MCU是STM32H743,只能写入内部FLASH的512个bit,地址在0x081e0000。用的是原子例子 ...

你这个不知道是啥问题。
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2021-1-7
在线时间
7 小时
 楼主| 发表于 2022-4-15 11:23:28 | 显示全部楼层
本帖最后由 lmx123456 于 2022-4-15 11:27 编辑

后面通过一次擦除多次写的方式解决了写不完整的问题。在写两次之后校验每一个字节,最后再回读写入的数据,计算总校验。两道校验来保证写入正确。总之写入还是不能一次成功。后面测试其他程序的时候发现,在0x08000000开始地址运行的程序放到ITCM地址运行就会存在错误。这个问题待解决
回复 支持 反对

使用道具 举报

0

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
364
金钱
364
注册时间
2020-10-15
在线时间
55 小时
发表于 2023-6-29 17:37:38 | 显示全部楼层
遇到同样问题,帮顶
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-18 06:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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