完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请教各位大神:
使用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 res = FLASH_ErasePage(addr + FLASH_PAGE_SIZE*i); } FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR); FLASH_Lock(); return 1; } |
|
相关推荐
9个回答
|
|
楼主,感觉你这个问题是系统架构问题哦,你要知道,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复位就很正常了。 建议:擦除时一个扇区一个扇区的来,中间间隔喂狗,调整好喂狗时间间隔,算好时间,数据手册有擦除一个扇区所需要的时间参数,自己计算好吧。 |
|
|
|
|
|
|
|
我把串口数据的接收和处理都注释掉了(只留清除中断挂起标志操作),仍然存在这个问题。说明并不是串口数据处理的问题;极有可能是FLASH擦除过程被频繁中断导致的,但为什么会这样,我不清楚。 |
|
|
|
你要了解一下擦除FLASH时间哦,他的时间是很长的,所以在擦除和写入数据很容易出问题的,不知道你是接受玩字节写不写入FLASH?
建议你在所有东西都不运行的时候在擦除或者写入,我通常再断电或上点的时候做这些处理,如果在陈序运行过程时先写个buf[]来寄存他,掉电了在储存。 |
|
|
|
我记得擦除都是一页一页擦除的,好像都是MS级别的!
|
|
|
|
我也碰到这个问题,楼主最后解决没
|
|
|
|
有没有可能是串口那边的问题,看下你串口处理程序。
会不会是flash操作的时候,关闭了中断,导致串口接收数据不完整? 然后处理这个串口数据的程序因为数据不完整卡住了? 纯属猜测。 另外建议每次写数据前,将flash都擦除偶数次试试。。最近碰到一个奇葩的问题就是,如果flash擦除奇数次,就容易产生硬件错误。偶数次就不会。现在都是每次写数据前,擦除两次。。具体原因还没有查清楚。 |
|
|
|
楼主,这个问题解决没?
|
|
|
|
我也碰到这样的问题,擦除前把串口关掉就可以,想不通。
如下: USART_Cmd(USART1, DISABLE); FLASH_ErasePage(0x08007000); USART_Cmd(USART1, ENABLE); 另外在Keil中调试时会一直进入中断,跳不出来 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32串口接受中断使用C++STL中的queue导致所有中断失效
4028 浏览 1 评论
2772 浏览 0 评论
STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计
1293 浏览 0 评论
3622 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
3436 浏览 4 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-3 21:57 , Processed in 0.545582 second(s), Total 54, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号