请教各位大神: 使用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; } |
【STM32F0开发日志/评测/笔记】+互补PWM波的产生
STM32F030 PB14和PB15无法输出PWM求助
【STM32F030探索套件】序列之五 外部中断
【STM32F0开发日志---二】+ucosii.2.92移植在STM32F030
上传个STM32F0+5110+内部温度传感器的菜鸟实例
【STM32F030探索套件使用问题】STM32F030 SPI方式驱动ST7565LCD失败
求一份STM32F051 I2C驱动LCD 12864的例程
STM32F0 M0 向结构体赋值进入HardFault异常
STM32F0 ADC-DMA方式采集2路数据时出现问题
STM32F030C8T6,TIM16定时慢很多问题?
如下:
USART_Cmd(USART1, DISABLE);
FLASH_ErasePage(0x08007000);
USART_Cmd(USART1, ENABLE);
另外在Keil中调试时会一直进入中断,跳不出来
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复位就很正常了。
建议:擦除时一个扇区一个扇区的来,中间间隔喂狗,调整好喂狗时间间隔,算好时间,数据手册有擦除一个扇区所需要的时间参数,自己计算好吧。
好好检查下UART接收及相关数据处理的代码,你接收过来的数据是
怎么处理的?
我把串口数据的接收和处理都注释掉了(只留清除中断挂起标志操作),仍然存在这个问题。说明并不是串口数据处理的问题;极有可能是FLASH擦除过程被频繁中断导致的,但为什么会这样,我不清楚。
建议你在所有东西都不运行的时候在擦除或者写入,我通常再断电或上点的时候做这些处理,如果在陈序运行过程时先写个buf[]来寄存他,掉电了在储存。
评分
查看全部评分
会不会是flash操作的时候,关闭了中断,导致串口接收数据不完整?
然后处理这个串口数据的程序因为数据不完整卡住了?
纯属猜测。
另外建议每次写数据前,将flash都擦除偶数次试试。。最近碰到一个奇葩的问题就是,如果flash擦除奇数次,就容易产生硬件错误。偶数次就不会。现在都是每次写数据前,擦除两次。。具体原因还没有查清楚。