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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版