STM32F407VGT6 标准库 往Flash中写入数据,写入完成后再次读取,发现没有写入成功。printf 打印擦除和写入的步骤发现,返回的 FLASH_Status 都是 7。关于错误码,在网上找到的一些解释都比较模糊,没有具体的案例说明问题出现的原因和解决方案。 把其他的代码全部注释掉,只保留Flash和串口打印相关的代码,再次执行,发现返回值都是9,说明擦除和写入无异常。 请问出现这种问题的原因在哪里?如果是程序的问题,该从哪方面排查? 部分代码: /************************************************************************** *函 数:给指定地址写入指定长度的数据 *参 数: * @address:要写入数据的首地址 * @data:要写入的数据 * @len:数据长度 *备 注:要实现确保写入数据的区域没有写入其他数据,如果有,会执行全扇区的擦除, * 可能会导致其他数据丢失。 **************************************************************************/ void FLASH_WriteData(uint32_t address, uint8_t *data, uint32_t len) { uint32_t end_address = address + len; uint32_t index_address = address; if(index_address < FLASH_BASE_ADDRESS || index_address > FLASH_END_ADDRESS)//地址不合法 { return; } FLASH_Unlock(); FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存 while(index_address < end_address) { if(*(vu32*)index_address != 0xFFFFFFFF)//内容不为0xFFFFFFFF { FLASH_Status i = FLASH_EraseSector(FLASH_getSectorNum(index_address), VoltageRange_3);//擦除所在扇区 printf("Erase FLASH_Status: %d\n", i); if(FLASH_getSectorNum(index_address) == FLASH_Sector_11)//是最后一个扇区 { break; } index_address = FLASH_getSectorHeadAddress(index_address) + FLASH_getSectorSize(index_address);//所在扇区已经擦除,直接跳转到下一个扇区的首地址 } else { index_address += 4; } } index_address = address; while(index_address < end_address)//按8bit大小写入数据 { FLASH_Status i = FLASH_ProgramByte(index_address, *data); printf("write FLASH_Status: %d\n", i); index_address ++; data++; } FLASH_DataCacheCmd(ENABLE);//FLASH擦除期间,必须禁止数据缓存 FLASH_Lock(); } |
STM32哪款单片机已使用CMSIS-FreeRTOS实现FreeRTOS例程?
Boot0通过10k电阻接地,Boot1作为输入使用被配置成外部中断,现在存在的问题是可能会导致单片机加密无法运行,且无法解密,RDP显示为FF,这是怎么导致的?
STM32F401下载失败问题
STM32CubeMX生成FreeRTOS MDK版本无法使用AC6编译器
外部中断升降沿类型判断
定时器正交编码器功能
STM32F427串口接收和发送中断同时使能,出现接收中断丢数的现象。
为什么生成代码时一直卡在generating user source code 救救孩子吧。
easylogger打印失败
为什么ETH配置中没有Advanced Parameters?
擦除之前是否进行了擦除操作,另外,擦除的时候尽量关闭一下中断功能。
标准库里也有例程,写得很清晰的。
\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Examples\FLASH\FLASH_Program
先验证sector擦除是否成功;
然后验证单位数据的写操作;
再就是注意那些基本的信息给对,比方地址啊、扇区号等。