打印
[STM32F4]

stm32f407 掉电保存问题

[复制链接]
546|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
houcs|  楼主 | 2023-1-14 23:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何读取stm32f407的flash,给个可用的例程,想做掉电保存

使用特权

评论回复
沙发
huangchui| | 2023-1-14 23:10 | 只看该作者

看看跟flash有关的头文件。

使用特权

评论回复
板凳
jlyuan| | 2023-1-14 23:11 | 只看该作者

感觉你是要做FLASH的存取操作吧,你可以去ST官网搜索下载AN3969.

使用特权

评论回复
地板
juventus9554| | 2023-1-14 23:13 | 只看该作者
EEPROM emulation in STM32F40x/STM32F41x microcontrollers (AN3969)

使用特权

评论回复
5
houcs|  楼主 | 2023-1-14 23:15 | 只看该作者

u32 STMFLASH_ReadWord(u32 faddr)
{
        return *(vu32*)faddr;
}  


uint16_t STMFLASH_GetFlashSector(u32 addr)
{
        if(addr<ADDR_FLASH_SECTOR_1)return FLASH_Sector_0;
        else if(addr<ADDR_FLASH_SECTOR_2)return FLASH_Sector_1;
        else if(addr<ADDR_FLASH_SECTOR_3)return FLASH_Sector_2;
        else if(addr<ADDR_FLASH_SECTOR_4)return FLASH_Sector_3;
        else if(addr<ADDR_FLASH_SECTOR_5)return FLASH_Sector_4;
        else if(addr<ADDR_FLASH_SECTOR_6)return FLASH_Sector_5;
        else if(addr<ADDR_FLASH_SECTOR_7)return FLASH_Sector_6;
        else if(addr<ADDR_FLASH_SECTOR_8)return FLASH_Sector_7;
        else if(addr<ADDR_FLASH_SECTOR_9)return FLASH_Sector_8;
        else if(addr<ADDR_FLASH_SECTOR_10)return FLASH_Sector_9;
        else if(addr<ADDR_FLASH_SECTOR_11)return FLASH_Sector_10;
        return FLASH_Sector_11;        
}


void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)        
{
  FLASH_Status status = FLASH_COMPLETE;
        u32 addrx=0;
        u32 endaddr=0;        
  if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return;        //非法地址
        FLASH_Unlock();                                                                        //解锁
  FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
               
        addrx=WriteAddr;                                //写入的起始地址
        endaddr=WriteAddr+NumToWrite*4;        //写入的结束地址
        if(addrx<0X1FFF0000)                        //只有主存储区,才需要执行擦除操作!!
        {
                while(addrx<endaddr)                //扫清一切障碍.(对非FFFFFFFF的地方,先擦除)
                {
                        if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除这个扇区
                        {   
                                status=FLASH_EraseSector(STMFLASH_GetFlashSector(addrx),VoltageRange_3);//VCC=2.7~3.6V之间!!
                                if(status!=FLASH_COMPLETE)break;        //发生错误了
                        }else addrx+=4;
                }
        }
        if(status==FLASH_COMPLETE)
        {
                while(WriteAddr<endaddr)//写数据
                {
                        if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE)//写入数据
                        {
                                break;        //写入异常
                        }
                        WriteAddr+=4;
                        pBuffer++;
                }
        }
  FLASH_DataCacheCmd(ENABLE);        //FLASH擦除结束,开启数据缓存
        FLASH_Lock();//上锁
}

void STMFLASH_Read(u32 ReadAddr,u32 *pBuffer,u32 NumToRead)           
{
        u32 i;
        for(i=0;i<NumToRead;i++)
        {
                pBuffer[i]=STMFLASH_ReadWord(ReadAddr);//读取4个字节.
                ReadAddr+=4;//偏移4个字节.        
        }
}


void Test_Write(u32 WriteAddr,u32 WriteData)
{
  STMFLASH_Write(WriteAddr,&WriteData,1);

}

使用特权

评论回复
6
supernan| | 2023-1-14 23:16 | 只看该作者
这个问题, 通常情况下, 保存不是问题

使用特权

评论回复
7
supernan| | 2023-1-14 23:19 | 只看该作者
倒是可靠检测掉电, 保证保存需要的时间, 是个问题

使用特权

评论回复
8
wenfen| | 2023-1-14 23:21 | 只看该作者
用cube能生成现成的代码吗?

使用特权

评论回复
9
lizye| | 2023-1-14 23:24 | 只看该作者
可以参考原子哥的例程

使用特权

评论回复
10
jiajs| | 2023-1-14 23:25 | 只看该作者
那其实就小很小的一部分就可以啊

使用特权

评论回复
11
pengf| | 2023-1-14 23:31 | 只看该作者
挺简单的  回头我发你邮箱吧

使用特权

评论回复
12
huangchui| | 2023-1-14 23:32 | 只看该作者
没使用库函数读取过

使用特权

评论回复
13
jlyuan| | 2023-1-14 23:34 | 只看该作者
我还没有处理过flash呢

使用特权

评论回复
14
chenjunt| | 2023-1-14 23:36 | 只看该作者
正常对flash进行读取就可以啊

使用特权

评论回复
15
chuxh| | 2023-1-14 23:39 | 只看该作者
需要保存多少数据啊

使用特权

评论回复
16
zyf部长| | 2023-1-14 23:41 | 只看该作者
原子那边有很多这样的例程

使用特权

评论回复
17
llljh| | 2023-1-14 23:42 | 只看该作者
对保存的地址有详细要求吗

使用特权

评论回复
18
xxrs| | 2023-1-14 23:44 | 只看该作者
官网有这方面的说明**

使用特权

评论回复
19
houcs|  楼主 | 2023-1-14 23:46 | 只看该作者
唉,还是没有什么结果,算了,多谢大家啦

使用特权

评论回复
20
SantaBunny| | 2023-2-13 16:48 | 只看该作者
正常对flash进行读取就行

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

743

主题

8382

帖子

5

粉丝