加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

stm32篇--内置flash

发布时间:2020-12-15 18:18:04 所属栏目:百科 来源:网络整理
导读:stm32自带内置flash,我对内置flash研究不多,曾试过隔2k内还是一块,不明原因。 stm32的FLASH分为主存储块和信息块。主存储块用于保存具体的程序代码和用户数据,信息块用于负责由stm32出厂是放置2KB的启动程序(Bootloader)和512B的用户配置信息区。 主存

stm32自带内置flash,我对内置flash研究不多,曾试过隔2k内还是一块,不明原因。
stm32的FLASH分为主存储块和信息块。主存储块用于保存具体的程序代码和用户数据,信息块用于负责由stm32出厂是放置2KB的启动程序(Bootloader)和512B的用户配置信息区。
主存储块是以页为单位划分的,一页大小为1KB。范围为从地址0x08000000开始的128KB内。
对Flash 的写入操作要 “先擦除后写入”的原则;
stm32的内置flash 编程操作都是以页为单位写入的,而写入的操作必须要以16位半字宽度数据位单位,允许跨页写,写入非16位数据时将导致stm32内部总线错误。
进行内置flash读写时,必须要打开内部Rc振荡器。
下面是我用到的网络上的一个例子,改一下就可以用了:
#define?FLASH_ADR?0x08008000??//要写入数据的地址

union union_temp16
{
??? unsigned int un_temp16;
??? unsigned char? un_temp8[2];??// example 16: 0x0102? 8:[0]2 [1]1
}my_unTemp16;

configStruct myConf =
{
?"cmnet",
?"",
?"201.2.2.2",
?"9002",
?{
??"test123","",""
?}
};


/******************************************************
flash 字符串写入
每次存入两个字节
*******************************************************/
void FlashWriteStr( u32 flash_add,u16 len,u8* data )
{
?//char cp[12];
?//u8 s = 0;
?u16 byteN = 0;
?FLASH_Unlock();
?FLASH_ErasePage(flash_add);
?//sprintf( cp,"len:%d",len);
?//USART1_Puts(cp);
?while( len )
?{
??
??my_unTemp16.un_temp8[0] = *(data+byteN);
??my_unTemp16.un_temp8[1] = *(data+byteN+1);??
??FLASH_ProgramHalfWord( flash_add+byteN,my_unTemp16.un_temp16 );

??//sprintf( cp,"bye:%drn",s);
??//USART1_Puts(cp);
??if( 1==len )
??{
???//如果数据长度是奇数,为1的时候跳出
???break;???????????????
??}
??else
??{
???byteN += 2;
???len -= 2;
??}?
?}
?FLASH_Lock();
}

/******************************************************
flash 字符串读出到指定data中?
地址与写入data地址同 读出的保存类型也必须一致
*******************************************************/
void FlashReadStr( u32 flash_add,u8* data )
{
?u16 byteN = 0;
?while( len )
?{
??my_unTemp16.un_temp16 = *(vu16*)(flash_add+byteN);
??if( 1==len )
??{
???*(data+byteN) = my_unTemp16.un_temp8[0];
???break;?????
??}
??else
??{??
???*(data+byteN) = my_unTemp16.un_temp8[0];
???*(data+byteN+1) = my_unTemp16.un_temp8[1];
???byteN += 2;
???len -= 2;
??}
?}
}

void FlashInit(void) { ?u32 tmp=*(vu32*)(FLASH_ADR); ?if(tmp==0xffffffff) ?{ ??FlashWriteStr(FLASH_ADR,sizeof(myConf),(u8*)&myConf); ?} ?else ?{ ??FlashReadStr(FLASH_ADR,(u8*)&myConf);? ?} }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读