使用FAL对内部FLASH做了分区处理。我的是429 2M的片内flash 使用的是扇区8-11
能够进行读写,但是在进行擦除的时候出了问题,提示擦除成功,但是内容实际没有变化,从而导致flash无法进一步使用。
用...bsp\stm32\libraries\HAL_Drivers\drv_flash\drv_flash_f4.c
这个文件里的配置
const struct fal_flash_dev stm32_onchip_flash_128k = { "onchip_flash_128k", STM32_FLASH_START_ADRESS_128K, FLASH_SIZE_GRANULARITY_128K, (128 * 1024), {NULL, fal_flash_read_128k, fal_flash_write_128k, fal_flash_erase_128k} };
你结构体根据这个改下
1024也不行,而且我觉得按照那个扇区擦除,应该最小的就是1024*128吧 一整扇
@小鱼啊 fal_flash_write 和 stm32_flash_write 咋写的,好像后面这个函数返回的 -1.
stm32_flash_write 函数这里是字节写吗?
@出出啊 按字节写的应该是
@小鱼啊 单步调试过吗,到 HAL_FLASH_Program 这个函数里面的执行过程,在哪儿出错了?
擦除过程调用的 stm32_flash_erase 单步调试进去看一下 FirstSector 和 NbOfSectors 这俩是 8到11之间的不?
这是我搞的 bootloader 给应用系统的分区,前128是bootloader,后面5-11是应用系统。起始地址也 0x8000000 ;size 只有 1M,因为后面的用不上,目前这样使用完全没有问题。
所以还是建议单步调试进入 stm32_flash_xxx 几个函数里看看执行过程有没有异常。
@出出啊

很奇怪,他说我地址这个值溢出了,每次给地址都在第23扇区
@小鱼啊 这个变量值错了,你能确定
FirstSector = GetSector(addr);
这里的 addr 是对的吗?如果addr是对的,那就是 GetSector 函数给你搞错了。打开这个函数瞧瞧吧,这个函数里有地址和扇区的映射关系。扇区对不对都是它转换出来的。
贴上我使用的代码,跟你的比对一下。
@小鱼啊 找到根源了?因为啥?