久芯网

STM32F030 FLASH存储问题

avatar hhhhhhhaa 提问时间: 2023-09-18 17:42:08 / 未解决
最新在用STM32F030 因为没有外部存储设备,现在用的是芯片的FLASH来当存储,现在遇到的问题是刷一次程序后,第一次读取可以读取到,当第二次或者多次写入或者擦除的时候读取不到数据,这种情况是为什么啊?很疑惑,看正点原子和野火 都可以,但是实际用的时候不知道为什么只能读取一次正确的数据,剩下的读取到的都是FF FF




如需获得 STM32F030 等器件的更多信息,请点击链接或 点击此处 联系在线客服!

15个回答
  • avatar hhhhhhhaa
    回答时间: 2023-09-18 18:02:49

    #include "stmflash.h" #include "delay.h" //#include "usart.h" //读取指定地址的半字(16位数据) //faddr:读地址(此地址必须为2的倍数!!) //返回值:对应数据. uint16_t STMFLASH_ReadHalfWord(uint32_t faddr) { return *(uint16_t*)faddr; } #if STM32_FLASH_WREN //如果使能了写 //不检查的写入 //WriteAddr:起始地址 //pBuffer:数据指针 //NumToWrite:半字(16位)数 void STMFLASH_Write_NoCheck(uint32_t WriteAddr,uint16_t *pBuffer,uint16_t NumToWrite) { uint16_t i; for(i=0;i=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址 FLASH_Unlock(); //解锁 offaddr=WriteAddr-STM32_FLASH_BASE; //实际偏移地址. secpos=offaddr/STM_SECTOR_SIZE; //扇区地址 0~127 for STM32F103RBT6 secoff=(offaddr%STM_SECTOR_SIZE)/2; //在扇区内的偏移(2个字节为基本单位.) secremain=STM_SECTOR_SIZE/2-secoff; //扇区剩余空间大小 if(NumToWrite<=secremain)secremain=NumToWrite;//不大于该扇区范围 while(1) { STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//读出整个扇区的内容 for(i=0;i(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完 else secremain=NumToWrite;//下一个扇区可以写完了 } }; FLASH_Lock();//上锁 } #endif //从指定地址开始读出指定长度的数据 //ReadAddr:起始地址 //pBuffer:数据指针 //NumToWrite:半字(16位)数 void STMFLASH_Read(uint32_t ReadAddr,uint16_t *pBuffer,uint16_t NumToRead) { uint16_t i; for(i=0;i

  • avatar hhhhhhhaa
    回答时间: 2023-09-18 18:24:25
    butterflyspring 发表于 2020-10-20 16:47
    检查一下 FLASH_ProgramHalfWord(WriteAddr,pBuffer);中有没有等待操作完成的判断。

    FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) { FLASH_Status status = FLASH_COMPLETE; /* Check the parameters */ assert_param(IS_FLASH_PROGRAM_ADDRESS(Address)); /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); if(status == FLASH_COMPLETE) { /* If the previous operation is completed, proceed to program the new data */ FLASH->CR |= FLASH_CR_PG; *(__IO uint16_t*)Address = Data; /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT); /* Disable the PG Bit */ FLASH->CR &= ~FLASH_CR_PG; } /* Return the Program Status */ return status; }

  • avatar 废鱼
    回答时间: 2023-09-18 18:42:44

    掉电就丢失了,说明你写的可能不对。调试模式下,执行完写入功能后,memory直接查看FLASH的地址,如果内容对,说明在断电前或者上电前被某个函数给擦除了。断电以后,用ISP软件,flashlaoder或者STM32CubeProgrammer,在boot模式下读取对应的FLASH地址,如果还是存在的,那么就是上电时被擦除了。

  • avatar hhhhhhhaa
    回答时间: 2023-09-18 19:10:12

    就是原子哥写的底层

  • avatar hhhhhhhaa
    回答时间: 2023-09-18 19:29:36

    是我哪里没有学到位吗?

  • avatar wangzhao123
    回答时间: 2023-09-18 20:01:06
    hhhhhhhaa 发表于 2020-10-7 16:02
    是我哪里没有学到位吗?

    读取FLASH的源代码没问题,看你读取的是否是同一个地址的数据

  • avatar hhhhhhhaa
    回答时间: 2023-09-18 20:19:35

    防止沉了,自己回复

  • avatar hhhhhhhaa
    回答时间: 2023-09-18 20:36:47

    还是没有知道的吗,还是说大家都放假啦,STM32的FLASH到底能不能断电保存数据呢?

  • avatar 废鱼
    回答时间: 2023-09-18 21:09:12

    1、FLASH可以用来存储一些数据,但不能太频繁,避免写坏 2、从代码上看操作应该没问题,考虑检查一下写入地址和读取地址是正确。

  • avatar hhhhhhhaa
    回答时间: 2023-09-18 21:33:55
    安 发表于 2020-10-8 16:07
    1、FLASH可以用来存储一些数据,但不能太频繁,避免写坏 2、从代码上看操作应该没问题,考虑检查一下写入地 ...

    写入和读取的地址是正确的,不断电没有问题,但是一断电就不行了,读取到的就是FF

  • avatar 小歆-2051663
    回答时间: 2023-09-18 21:52:24
    hhhhhhhaa 发表于 2020-10-9 14:55
    写入和读取的地址是正确的,不断电没有问题,但是一断电就不行了,读取到的就是FF ...

    我也感觉是地址错误,能否提供一下你读写的Flash地址。

  • avatar hhhhhhhaa
    回答时间: 2023-09-18 22:25:22
    小歆-2051663 发表于 2020-10-9 15:16
    我也感觉是地址错误,能否提供一下你读写的Flash地址。

    好的,我读写的地址是0x08000000+14*1024

  • avatar hhhhhhhaa
    回答时间: 2023-09-18 22:52:39
    小歆-2051663 发表于 2020-10-9 15:16
    我也感觉是地址错误,能否提供一下你读写的Flash地址。

    因为030的内存是16K 我读写第14页应该是没有影响的,程序只有10K大小

  • avatar hhhhhhhaa
    回答时间: 2023-09-18 23:21:24
    wangzhao123 发表于 2020-10-7 16:05
    读取FLASH的源代码没问题,看你读取的是否是同一个地址的数据

    0x08000000+14*1024 读写的地址都是这个,应该是没错的啊,我的程序只有10K大小,030的内存是16K 我读写第14页应该没错啊

  • avatar butterflyspring
    回答时间: 2023-09-18 23:39:42

    检查一下 FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);中有没有等待操作完成的判断。

会员中心 微信客服
客服
回到顶部