STM32/STM8技术william hill官网
直播中

马祥

7年用户 775经验值
私信 关注
[问答]

闪存写入时STM32停电

我试图在STM32F405VGT6上检测到停电,它应该在虚拟EEPROM(Flash)中写一个计数器。但是写作过程还不够快。现在,我不能再将Flash初始化,当我调用HAL_FLASH_Program(uint32_t TypeProgram,uint32_t Address,uint64_t Data)函数时,它总是给我一个HAL_ERROR(FLASH_FLAG_PGPERR和FLASH_FLAG_PGSERR)。
我已经尝试使用STUtility工具完全使用STM32,但这也没有用。是因为我打破了我的Flash吗?有没有办法在写入时保护闪光灯免受停电?

回帖(10)

王磊

2018-9-6 13:56:20
看起来你正在使用一个单独的库?也许这一个?查看代码,看看你能找到的地方HAL_ERROR。有一些条件代码将告诉如何引发此异常。
举报

张艳

2018-9-6 13:56:50
尝试使用实用工具进行闪存,然后验证写入数据。如果失败,则闪光灯损坏。在运行时闪烁可能会很快破坏闪存,因为它会在你注意到程序中的错误之前执行数十万次。
举报

马祥

2018-9-6 13:57:45
好吧,我认为闪光灯消失了。我会尝试更换微控制器。
举报

杨平

2018-9-6 13:58:23
错了。即使你使用SWD程序员调试器,实际上也可以编程FLASH内存运行时。没有其他办法。像openOCD或gdbserver这样的程序首先将小程序加载到RAM,然后该程序写入FLASH。
举报

李艳

2018-9-6 13:59:05
尝试执行批量擦除。使用寄存器代替这个的库
关于运行时FLASH编程是错误的。没有其他的FLASH编程方法,即使你使用自己喜欢的调试探针(与SWD或JTAG无关)软件编程芯片(在大多数情况下ooenOCD或gdbserver将小程序加载到编程FLASH的RAM中。没有STM32 FLASH写入的硬件机制。
举报

张艳

2018-9-6 13:59:53
您也可以直接通过SWD编程FLASH,闪存加载器只是通过传输二进制文件来减少协议开销而不是直接编程,从而加速了整个过程。当然,你的观点是没有其他方法存在仍然是正确的。FLASH仍然以相同的方式物理写入,只是通过AHB AP总线而不是D总线上的数据。
举报

李艳

2018-9-6 14:00:55
没有办法直接写FLASH。与FLASH写入协议开销的速度相比,这个是无法估计的
举报

张艳

2018-9-6 14:01:27
你的第一个陈述不正确。AHB AP总线允许您直接访问闪存。这不是一个“硬件机制”,这就是为什么我同意你的答案(只是说明如果你认为我不同意它)。你的第二个陈述似乎是误解了我所说的。SWD的协议开销非常多。在我的脑海中,在标准编程模式下编程的每64位时钟大约为416位。因此,任何措施都不会使开销变得微不足道。
举报

李艳

2018-9-6 14:01:44
FLASH擦除时间2ms,DW编程80us。在4MHz时,它将是每64字节320x8个时钟
举报

张艳

2018-9-6 14:02:26
公平地说,我指的是百分比开销,而不是必要的绝对时间。在对你的数学进行三重检查之后,它让我发现了我最近写的一个SWD程序员的差异。它的运行速度为1.25MHz,但编程大约需要19秒(不完全确定,因为它会跳过空页)~50kB的数据,这与你的数学相差甚远。谢谢你帮助我实现这一点。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分