调用STM32F4 库函数FLASH_ProgramWord() 出错问题

在操作STM32F4的内部Flash时,遇到使用FLASH_ProgramWord() 函数出错的问题。解决方法包括在擦除前清除Flash标志,确保正确使用擦除和写入函数,特别是注意写入地址必须为4的整倍数,否则会导致FLASH_ERROR_PROGRAM错误。详细分析了STM32F4的Flash结构和操作注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近操作STM32F4的内部flash,吓了一跳。以前的STM32F107的时候还是4k一页,现在只分了12个Sector,后面几个128K这么大。

从官网下了Flash programming manual,


擦除之前得清除flash flag

/* Clear All pending flags */
FLASH_ClearFlag( FLASH_FLAG_EOP |  FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);


同时查看擦除函数,看着函数说明,正确的传参数就OK了

/**
  * @brief  Erases a specified FLASH Sector.
  *   
  * @param  FLASH_Sector: The Sector number to be erased.
  *          This parameter can be a value between FLASH_Sector_0 and F

// 擦除函数 FLASH_Status FLASH_EraseSector2(void) { FLASH_Status status = FLASH_COMPLETE; // 解锁Flash FLASH_Unlock(); // 清除所有错误标志 FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); // 擦除操作 status = FLASH_EraseSector(SECTOR_NUMBER, VoltageRange_3); if(status != FLASH_COMPLETE) return status; // 等待操作完成 while (FLASH_GetStatus() != FLASH_COMPLETE); // 重新锁定Flash FLASH_Lock(); return status; } FLASH_Status FLASH_ProgramSector2(uint32_t *data, uint32_t count) { if(count > 4096) count = 4096; FLASH_Status status = FLASH_COMPLETE; uint32_t timeout = 0; // 解锁Flash FLASH_Unlock(); // 清除所有错误标志 FLASH_ClearFlag(FLASH_FLAG_ALL_ERRORS); // 禁用中断 __disable_irq(); for(uint32_t i = 0; i < count; i++) { uint32_t address = SECTOR2_BASE_ADDR + (i * 4); // 编程双字 status = FLASH_ProgramWord(address, data[i]); if(status != FLASH_COMPLETE) break; // 等待操作完成,带超时 timeout = 0xFFFF; // 设置超时计数器 while((FLASH_GetStatus() == FLASH_BUSY) && (timeout != 0)) { timeout--; } if (timeout == 0) { DEBUG("编译超时\r\n"); break; } // 检查操作后的状态 status = FLASH_GetStatus(); if (status != FLASH_COMPLETE) { break; } } // 启用中断 __enable_irq(); // 重新锁定Flash FLASH_Lock(); return status; } // 校验整个扇区3 uint8_t FLASH_VerifySector2(uint32_t *expectedData, uint32_t count) { uint32_t *flashPtr = (uint32_t *)SECTOR2_BASE_ADDR; for(uint32_t i = 0; i < count; i++) { if(flashPtr[i] != expectedData[i]) { DEBUG("校验失败: 位置 %lu, 期望 0x%llX, 实际 0x%llX\r\n",i, expectedData[i], flashPtr[i]); return 0; } } return 1; } 将双字编程改成单字编程
最新发布
08-01
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值