搜索
查看: 2432|回复: 7

[已解决] 关于STM32F103VGT6 FLASH闪存擦除库函数异常

[复制链接]

该用户从未签到

1

主题

10

帖子

0

蝴蝶豆

新手上路

最后登录
2020-3-26
发表于 2017-7-5 09:06:44 | 显示全部楼层 |阅读模式
本帖最后由 xsnbzj 于 2017-7-5 15:28 编辑

这两天,我手上拿到了一颗STM32F103VGT6的芯片,芯片的FLASH容量是1M字节。

在做调用STM32 闪存擦除指令时发现一个问题:
      擦到0x808 0000时,会自动跳转到0x800 0000地址,觉得很奇怪。

也看了STM32的FLASH闪存编程手册,没有提到1024K大容量的信息,最多是512K的。

验证代码:
void EraseFPoApp(void)
{
    u32 u32PageAdd=0;
    FLASH_Unlock();
    u32PageAdd = 0x8064000;
    FLASH_ErasePage(u32PageAdd);
    FLASH_Lock();
} 没问题,可以擦除这页的内容。

但是:
void EraseFPoApp(void)
{
    u32 u32PageAdd=0;
    FLASH_Unlock();
    u32PageAdd = 0x8080000;
    FLASH_ErasePage(u32PageAdd);
    FLASH_Lock();
} 擦除的确是0x800 0000的内容。不知道为什么。

不知道有没有大神遇到过这类情况。还是本身,STM32就有针对VGT6的这个BUG存在。
回复

使用道具 举报

该用户从未签到

29

主题

1285

帖子

59

蝴蝶豆

论坛元老

最后登录
2021-6-27
发表于 2017-7-5 10:57:02 | 显示全部楼层
帮顶                        
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

10

帖子

0

蝴蝶豆

新手上路

最后登录
2020-3-26
 楼主| 发表于 2017-7-5 14:18:55 | 显示全部楼层
感觉STM32F103VG有这个漏洞
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

10

帖子

0

蝴蝶豆

新手上路

最后登录
2020-3-26
 楼主| 发表于 2017-7-6 13:50:57 | 显示全部楼层
顶~~台主求助
回复 支持 反对

使用道具 举报

该用户从未签到

133

主题

4688

帖子

239

蝴蝶豆

版主

最后登录
2021-4-10
发表于 2017-7-6 17:01:30 | 显示全部楼层
楼主,你下载最新的固件库吧。里面描述了大于512K时,如何操作,如下:
STM32F10x_XL devices feature up to 1 Mbyte with dual bank architecture for read-while-write (RWW) capability:
    - bank1: fixed size of 512 Kbytes (256 pages of 2Kbytes each)
    - bank2: up to 512 Kbytes (up to 256 pages of 2Kbytes each)
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

802

帖子

271

蝴蝶豆

版主

最后登录
2020-12-15
发表于 2017-7-6 17:19:25 | 显示全部楼层
对于STM32F1系列的1MB flash芯片,是分两个bank的。每个BANK最大512KB.

你确认下你的代码,估计你给的是BANK2的地址,操作的却是BANK1的 FLASH寄存器,二者是
不一样的。

标准库函数里用到一个宏STM32F10X_XL来区分不同的函数实现。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

10

帖子

0

蝴蝶豆

新手上路

最后登录
2020-3-26
 楼主| 发表于 2017-7-6 18:42:25 | 显示全部楼层
谢谢楼上两位,一语点破,确实我的固件库太老了
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

10

帖子

0

蝴蝶豆

新手上路

最后登录
2020-3-26
 楼主| 发表于 2017-7-11 19:12:26 | 显示全部楼层
问题已经解决,如上面两位版主说的,我在官网下载最新的Library就可以了。
但是在调试时发现一个奇怪的问题,每次第一次进入擦除指令时,总是不能准确的擦除第一页,直到第二次进入才能擦除。
比如擦除的 起始页地址是0x8005000,但是8005000这页是不能擦除的,后面的页都可以一次擦除。

虽然可以有其他方法避免,但是觉得不应该出现这种现象。很奇怪,怎么会出现这种情况,引用不带XL的
就没有问题。

验证代码:
void ErasePageApp(void)
{
    FLASH_Unlock();
    u32PageAddree = 0x8005000+ulPa;
    FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
    FLASH_ErasePage(u32PageAddree);
    ulPa +=(u32)(2*1024);
    FLASH_Lock();
}

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-6 12:06 , Processed in 0.190621 second(s), 44 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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