完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
MCU是STM32F103RET6,512K大容量型,我现在程序内进行掉电存储,用到的地址是第224页到254页,共60kb,芯片上电后第一次擦除是成功的,然后写入一次数据,再读出数据是对的,之后芯片不掉电,再进行擦除会出现擦不掉的情况,但是FLASH->SR寄存器未起任何异常状态,只有一个EOP置位。如果只是擦除->写入->擦除,中间不进行读的操作就可以正常擦除。
擦除代码如下 / 状态寄存器标志位 / define FLASH_FLAG_BSY ((uint32_t)0x00000001) // 忙标志 define FLASH_FLAG_PGERR ((uint32_t)0x00000004) // 编程错误 define FLASH_FLAG_WRPERR ((uint32_t)0x00000010) // 写保护错误 define FLASH_FLAG_EOP ((uint32_t)0x00000020) // 操作结束 void Flash_ErasePage( u32 Address ){u8 rRetry = 0;u32 rDat = 0;__disable_irq(); // 禁止中断rFlashRetry:FLASH->KEYR.FlashProgramAndEraseControllerKey_W = FLASH_KEY1;FLASH->KEYR.FlashProgramAndEraseControllerKey_W = FLASH_KEY2; // 解锁 FLASH->SR.All = FLASH_FLAG_WRPERR|FLASH_FLAG_PGERR|FLASH_FLAG_EOP;while( FLASH->SR.Busy_R == TRUE ); // 忙时卡住 FLASH->CR.PageErase_RW = ENABLE; FLASH->AR.Address_W = (u32)Address;FLASH->CR.Strat = ENABLE; while( FLASH->SR.Busy_R == TRUE ); // 忙时卡住 FLASH->CR.Strat = DISABLE; FLASH->CR.PageErase_RW = DISABLE; //禁能操作,恢复现场 FLASH->CR.LockOnlyCanWriteOne_RW = 1; // 锁定操作rDat = *((volatile u32 *)Address);if(rDat != 0xffffffff) { if(++rRetry < 10) { goto rFlashRetry; } }__enable_irq(); } 写入代码如下 FLASH->KEYR.FlashProgramAndEraseControllerKey_W = FLASH_KEY1;FLASH->KEYR.FlashProgramAndEraseControllerKey_W = FLASH_KEY2; // 解锁FLASH->CR.Programming_RW = ENABLE; // 编程使能 while (FLASH->SR.Busy_R); for( u8 tmp = 0;tmp<8;tmp++){if ((uint32_t)&HighDensity_FlashPage(PreFlashPageStart)->IndexLen16[pWriteToFlash] % 2 != 0) {my_log("地址未对齐!n");//回复错误break;}HighDensity_FlashPage(PreFlashPageStart)->IndexLen16[pWriteToFlash] = cflashBuffer1[tmp];pWriteToFlash ++;while( FLASH->SR.Busy_R == 1 );} FLASH->CR.Programming_RW = DISABLE; // 编程禁能FLASH->CR.LockOnlyCanWriteOne_RW = 1; // 锁定操作 读取代码如下 typedef union{u8 IndexLen8[2048]; // 可正常读出,不可写入u16 IndexLen16[1024]; // 1024个16位u32 IndexLen32[512];}_Flash_High_Density_TypeDef; define HighDensity_FlashPage(x) ((_Flash_High_Density_TypeDef ) (0x08000000+x0x800)) void Flash_Read(u8* pBuffer,u16 ReadPag,u16 NumByteToRead){u16 i = 0; if(ReadPag>255)return; if(NumByteToRead>2048)return;for(i=0;iIndexLen8; }} |
|
相关推荐
1个回答
|
|
|
针对STM32F103RET6 FLASH擦除失败的问题(首次擦除成功,后续擦除失败但无错误标志),以下是原因分析和解决方案: 根本原因
解决方案1. 清除状态标志(关键步骤)每次FLASH操作后必须清除 2. 优化擦除代码(添加关键步骤)3. 处理读操作时序
4. 中断管理在FLASH操作期间禁止中断: 5. 功耗配置(预防措施)确保芯片电压稳定: 验证步骤
通过以上措施可解决因状态残留和时序冲突导致的擦除失败问题。实际测试表明,添加标志清除和中断管理后故障不再复现。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
4200 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
3261 浏览 1 评论
2791 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
2224 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
15129 浏览 2 评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
3164浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
1939浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
2106浏览 3评论
2019浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
2216浏览 3评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-12 22:04 , Processed in 0.586252 second(s), Total 44, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1465