你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F030 擦除FLASH时 程序跑飞

[复制链接]
holloworld 提问时间:2017-7-25 16:26 /
请教各位大神:
使用STM32F030C8T6芯片,在擦除FLASH过程中,如果串口收到较多的数据(60字节左右),程序便会在擦除FLASH过程中跑飞导致看门狗复位。请问这是什么原因?
注:
1. 串口接收程序比较简单,不会有数组越界问题;
2. 擦除FLASH的程序是验证过的,没有问题;
3. 如果串口收到的数据较少,也不会出现这个问题;
4. 在擦除FLASH前关闭总中断或者串口中断,程序依旧会跑飞;但直接关闭串口可以避免程序跑飞;
5. 没有使用操作系统;
6. 擦除FLASH程序如下:
uint8_t Flash_Erase(uint32_t addr, uint32_t size)
{
        uint32_t i;
        uint32_t num;
        uint8_t res;
       
        if(FLASH_START_ADDR > addr || FLASH_END_ADDR <= addr+size)
        {
                return 0;
        }
        if(addr % FLASH_PAGE_SIZE != 0)
        {
                return 0;
        }
        num = size / FLASH_PAGE_SIZE;
        if(0 != size % FLASH_PAGE_SIZE)
        {
                num++;
        }

        FLASH_Unlock();
        FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR);
        for(i=0;i<num;i++)
        {
                res = FLASH_ErasePage(addr + FLASH_PAGE_SIZE*i);
        }               
        FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR);
        FLASH_Lock();
        return 1;
}


收藏 评论10 发布时间:2017-7-25 16:26

举报

10个回答
a707083746 回答时间:2018-6-28 15:55:59
我也碰到这样的问题,擦除前把串口关掉就可以,想不通。
如下:
USART_Cmd(USART1, DISABLE);
FLASH_ErasePage(0x08007000);
USART_Cmd(USART1, ENABLE);

另外在Keil中调试时会一直进入中断,跳不出来
任风吹吹 回答时间:2017-12-14 10:14:56
楼主,感觉你这个问题是系统架构问题哦,你要知道,MCU在擦除FLASH的过程中是不同同时取指的,原文如下:
An ongoing Flash memory operation will not block the CPU as long as the CPU does not
access the Flash memory.
On the contrary, during a program/erase operation to the Flash memory, any attempt to read
the Flash memory will stall the bus. The read operation will proceed correctly once the
program/erase operation has completed. This means that code or data fetches cannot be
made while a program/erase operation is ongoing.
For program and erase operations on the Flash memory (write/erase), the internal RC
oscillator (HSI) must be ON.

看出啥意思了吗?在你擦除FLASH的过程中代码是没有办法执行的,因为AHB总线已经被FLASH操作占据了,当然也就没法喂狗了,中断也不能响应,这样一来IWDG复位就很正常了。

建议:擦除时一个扇区一个扇区的来,中间间隔喂狗,调整好喂狗时间间隔,算好时间,数据手册有擦除一个扇区所需要的时间参数,自己计算好吧。
xmshao 回答时间:2017-8-2 22:42:36
从描述现象来看,异常一定跟uart接受有关,而且还跟数据多少有关。

好好检查下UART接收及相关数据处理的代码,你接收过来的数据是
怎么处理的?
holloworld 回答时间:2017-8-3 10:49:29
xmshao 发表于 2017-8-2 22:42
从描述现象来看,异常一定跟uart接受有关,而且还跟数据多少有关。

好好检查下UART接收及相关数据处理的代 ...

我把串口数据的接收和处理都注释掉了(只留清除中断挂起标志操作),仍然存在这个问题。说明并不是串口数据处理的问题;极有可能是FLASH擦除过程被频繁中断导致的,但为什么会这样,我不清楚。
dear祝子 回答时间:2017-8-3 14:40:33
你要了解一下擦除FLASH时间哦,他的时间是很长的,所以在擦除和写入数据很容易出问题的,不知道你是接受玩字节写不写入FLASH?
建议你在所有东西都不运行的时候在擦除或者写入,我通常再断电或上点的时候做这些处理,如果在陈序运行过程时先写个buf[]来寄存他,掉电了在储存。

评分

参与人数 1ST金币 +3 收起 理由
zero99 + 3

查看全部评分

dear祝子 回答时间:2017-8-3 14:41:45
我记得擦除都是一页一页擦除的,好像都是MS级别的!
chengoxuan 回答时间:2017-8-28 21:14:05
我也碰到这个问题,楼主最后解决没
喜欢吃青椒麽 回答时间:2017-11-1 10:13:19
有没有可能是串口那边的问题,看下你串口处理程序。
会不会是flash操作的时候,关闭了中断,导致串口接收数据不完整?
然后处理这个串口数据的程序因为数据不完整卡住了?
纯属猜测。
另外建议每次写数据前,将flash都擦除偶数次试试。。最近碰到一个奇葩的问题就是,如果flash擦除奇数次,就容易产生硬件错误。偶数次就不会。现在都是每次写数据前,擦除两次。。具体原因还没有查清楚。
望风听雨 回答时间:2017-12-13 18:05:02
楼主,这个问题解决没?
阿牛P 回答时间:2018-11-28 09:50:23
感谢楼上 问题终于解决了
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版