
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; // 解锁
__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;
} |
stm32编码器模式计数问题
关于ASM330LHH TR调试中的问题
STM32会存在单个IO口坏掉的情况吗?
STM32的DCode bus是连接到bus matrix的吗?参考手册描述和图片是不符吗?
stm32ide怎么正确的导出项目
STM32F105RBT6 2025年 ROSH REACH 报告
STM32CubeMX 使用"FW_F1 V1.8.6"生成FreeRTOS代码缺少"freertos_mpool.h"?
你好,我的setting里面设置都没有问题。但是显示failed download cortexm3
STM32F103C8出現找不到'STM32100B_EVAL/stm32100b_eval.h' file not found
stm32f407无法配置定时器2为全部dma
1、保证擦除过程中供电稳定;
2、保证基本地址、页码参数正确,你现在共擦除的是31页吧;
3、严格按照擦除流程来,以SR_BSY位为0时表示擦除结束;
● Check that no Flash memory operation is ongoing by checking the BSY bit in the
FLASH_CR register
● Set the PER bit in the FLASH_CR register
● Program the FLASH_AR register to select a page to erase
● Set the STRT bit in the FLASH_CR register
● Wait for the BSY bit to be reset
● Read the erased page and verify
原则上要求将所有擦除区域再检查一遍,
即确认是否每个位置都成功擦除了。如果发现有未成功擦除的,得重新擦除。
至于EOP,每次成功编程或擦除完成后它都会被置1.
其实,你可以简化下,就针对某一页进行擦除来检验是否代码实现上有问题。