[STM32L5] 求问想把数据存在main flash中要如何操作

[复制链接]
2372|23
 楼主| qiangweii 发表于 2021-11-7 17:20 | 显示全部楼层 |阅读模式
我有一堆比较大的数据想存在flash中,但是info flash太小了,想存在main flash中。
但是同样的程序在info flash中是可以正常写入的,在main flash中却不行了,单片机总是会reset。

求问想把数据存在main flash中要如何操作?
这两个是我擦除和写入flash的函数,在info flash内是可以正常执行的。但是在main flash里面调用会reset掉!

void FERASE(U16 address)
{
//_DINT();
U8 *Erase_address ;
Erase_address = (U8 *)address ;
FCTL1 = FWKEY + ERASE ;
FCTL3 = FWKEY ;
*Erase_address = 0 ;
FCTL1 = FWKEY ;
FCTL3 = FWKEY + LOCK ;
//_EINT();
}

void FWRITE(U16 address, U8* data,U16 length)
{
//_DINT();
U16 i ;
U8* Wr_Addr ;
Wr_Addr =(U8*)address ;

FCTL1 = FWKEY + WRT ; // Set WRT bit for write operation
FCTL3 = FWKEY ;
//while(FCTL3 & BUSY);
for(i=0;i<length;i++)
{
*Wr_Addr= data ;
Wr_Addr++ ;
}
FCTL1 = FWKEY ;
FCTL3 = FWKEY + LOCK ;
//while(FCTL3 & BUSY);
//_EINT();
}
litengg 发表于 2021-11-7 17:23 | 显示全部楼层
可以自己定义存的地址,还要改什么linker文件.
androidbus 发表于 2021-11-7 17:30 | 显示全部楼层
这两个是我擦除和写入flash的函数,在info flash内是可以正常执行的。但是在main flash里面调用会reset掉!
feiqi1 发表于 2021-11-7 17:33 | 显示全部楼层
void FERASE(U16 address)
{
//_DINT();
U8 *Erase_address ;
Erase_address = (U8 *)address ;
FCTL1 = FWKEY + ERASE ;
FCTL3 = FWKEY ;
*Erase_address = 0 ;
FCTL1 = FWKEY ;
FCTL3 = FWKEY + LOCK ;
//_EINT();
}

void FWRITE(U16 address, U8* data,U16 length)
{
//_DINT();
U16 i ;
U8* Wr_Addr ;
Wr_Addr =(U8*)address ;

FCTL1 = FWKEY + WRT ; // Set WRT bit for write operation
FCTL3 = FWKEY ;
//while(FCTL3 & BUSY);
for(i=0;i<length;i++)
{
*Wr_Addr= data ;
Wr_Addr++ ;
}
FCTL1 = FWKEY ;
FCTL3 = FWKEY + LOCK ;
//while(FCTL3 & BUSY);
//_EINT();
}
sourceInsight 发表于 2021-11-7 17:39 | 显示全部楼层
1. 确保FLASH的目标写入地址没有被程序占用,程序占用FLASH的大小及范围可通过IAR option里生成MAP文件查看。
2. 确保目标地址有效,而不是空地址或保留地址,FLASH地址有错MCU会RESET.
boy1990 发表于 2021-11-7 17:43 | 显示全部楼层
你想占用mainflash,怕是会影响你系统的稳定性的啊,我么用的时候都不会用mainflash 的啊。
CallReceiver 发表于 2021-11-7 17:48 | 显示全部楼层
完全可以,本人就是那么用的
hfdy01 发表于 2021-11-7 17:52 | 显示全部楼层
要注意范围和页大小,最好做个页起始对齐,存没有这个问题,主要是擦除。
xia00 发表于 2021-11-7 17:55 | 显示全部楼层
给你一段参考代码
开发环境:IAR C。

/****************************************************************************************

*NAME:       void FLASHInit(void)
*FUNCTION:   FLASH初始化
*Parameter:  无参数
*RETURN:     无返回值
*****************************************************************************************/
void FLASHInit(void)
{
FCTL2=FWKEY+FSSEL_1+FN3+FN4;//时钟源为MCLK,25分频
}

/****************************************************************************************
*NAME:       void FLASH_Writew(unsigned int *Address,unsigned int nValue)
*FUNCTION:   将一个WORD类型的数据写入到指定的FLASH偶数起始地址
*Parameter:  Address,写入起始地址;nValue,写入值
*RETURN:     无返回值
*****************************************************************************************/
void FLASH_Writew(unsigned int *Address,unsigned int nValue)
{
FCTL1=FWKEY+WRT;             // WRT = 1
FCTL3=FWKEY;             // LOCK = 0
while((FCTL3&BUSY)==BUSY);    //等待FLASH存储器完成操作
*Address=nValue;
FCTL1=FWKEY;        // WRT = 0
FCTL3=FWKEY+LOCK;   // LOCK = 1
while((FCTL3&BUSY)==BUSY);    //等待FLASH存储器完成操作
}

/****************************************************************************************
*NAME:       void FLASH_Writeb(unsigned int *Address,unsigned char nValue)
*FUNCTION:   将一个BYTE类型的数据写入到指定的FLASH地址
*Parameter:  Address,写入地址;nValue,写入值
*RETURN:     无返回值
*****************************************************************************************/
void FLASH_Writeb(unsigned int *Address,unsigned char nValue)
{
FCTL1=FWKEY+WRT;             // WRT = 1
FCTL3=FWKEY;             // LOCK = 0
while((FCTL3&BUSY)==BUSY);    //等待FLASH存储器完成操作
*Address=nValue;
FCTL1=FWKEY;        // WRT = 0
FCTL3=FWKEY+LOCK;   // LOCK = 1
while((FCTL3&BUSY)==BUSY);    //等待FLASH存储器完成操作
}

/****************************************************************************************
*NAME:       void FLASH_Erase(unsigned int *Address)
*FUNCTION:   将FLASH里面的内容擦除掉
*Parameter:  Address,写入地址(段内任意)
*RETURN:     无返回值
*****************************************************************************************/
void FLASH_Erase(unsigned int *Address)
{
FCTL3=FWKEY;                 // LOCK = 0
while((FCTL3&BUSY)==BUSY);    //等待FLASH存储器完成操作
FCTL1=FWKEY+ERASE;             //ERASE=1
*Address=0;            //向段内地址任意写,启动擦除操作
FCTL1=FWKEY;
FCTL3=FWKEY+LOCK;
while((FCTL3&BUSY)==BUSY);    //等待FLASH存储器完成操作
}

/****************************************************************************************
*NAME:       unsigned int FLASH_Readw(unsigned int *Address)
*FUNCTION:   读指定FLASH偶数地址开始的字内容
*Parameter:  Address,读出地址
*RETURN:     返回读出值
*****************************************************************************************/
unsigned int FLASH_Readw(unsigned int *Address)
{
unsigned int Rdata;
Rdata=*Address;
return Rdata;
}

/****************************************************************************************
*NAME:       unsigned char FLASH_Readb(unsigned int *Address)
*FUNCTION:   读指定FLASH地址的字节内容
*Parameter:  Address,读出地址
*RETURN:     返回读出值
*****************************************************************************************/
unsigned char FLASH_Readb(unsigned int *Address)
{
unsigned char Rdata;
Rdata=*Address;
return Rdata;

}
bbapple 发表于 2021-11-7 17:57 | 显示全部楼层
你把相关数据写到程序存出去了吧还是?
handleMessage 发表于 2021-11-7 18:00 | 显示全部楼层
单片机的flash擦出的时候最小的擦除单位是sector的。
zhouhuanの 发表于 2021-11-7 18:03 | 显示全部楼层
信息存储区是按照sector擦除的,而程序flash是以扇区block为单位擦除的。
Listate 发表于 2021-11-7 18:06 | 显示全部楼层
一擦除,你存储的信息自然就呗复位掉了。
Mozarts 发表于 2021-11-7 18:09 | 显示全部楼层
是不是数据保存超出范围了?
_gege 发表于 2021-11-7 18:13 | 显示全部楼层
芯片复位不一定是程序的问题。
Edisons 发表于 2021-11-7 18:16 | 显示全部楼层
info flash和main flash什么区别?
laozhongyi 发表于 2021-11-7 18:19 | 显示全部楼层
这个Flash还需要link文件吗?
wanglaojii 发表于 2021-11-7 18:22 | 显示全部楼层
这个地址可能存在问题,不要超出范围。
观海 发表于 2021-12-3 20:03 | 显示全部楼层
难道flash分主副吗
guanjiaer 发表于 2021-12-3 20:05 | 显示全部楼层
link文件是干嘛用的啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

1521

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部