OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4476|回复: 2

stm32 FLASH用于数据存储

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2017-6-20
在线时间
2 小时
发表于 2017-6-20 21:06:48 | 显示全部楼层 |阅读模式
1金钱
FLASH 模仿EEPROM的用法,在10扇区用于存储数据。在程序运行过程中第一次存储数据后,成功读出。 但是当第二次继续往下写,(地址偏移),进行存储数据时,再次读写,读出的全是FFFF,8位数据也就是255。说明第二次存储时的数据没有被写入、?  这是FLASH的特性所致,还是程序上有问题。
还有一个特别重要的问题,用的写程序段中屏蔽了原子哥程序中的清除操作,否则二次写入数据将出现死机。这里也是一个疑问?FLASH写入数据前不论如何都要整个扇区擦除吗?
附上程序和图。求大家帮忙解答。如果FLASH实现不了在程序运行中多次存储数据这个功能,那么有什么其他的好办法吗? 谢谢大家,希望大家能帮忙!!!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2017-6-20
在线时间
2 小时
 楼主| 发表于 2017-6-20 21:15:14 | 显示全部楼层
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;        //·&#199;·¨μ&#216;&#214;·         FLASH_Unlock();                                                                        //&#189;a&#203;&#248;    FLASH_DataCacheCmd(DISABLE);//FLASH2á3y&#198;ú&#188;&#228;,±&#216;D&#235;&#189;&#251;&#214;1êy&#190;Y&#187;o′&#230;  ****                           addrx=WriteAddr;                                //D′è&#235;μ&#196;&#198;eê&#188;μ&#216;&#214;·         endaddr=WriteAddr+NumToWrite*4;        //D′è&#235;μ&#196;&#189;áê&#248;μ&#216;&#214;·         /*if(addrx<0X1FFF0000)                        //&#214;&#187;óD&#214;÷′&#230;′¢&#199;&#248;,2&#197;Dèòa&#214;′DD2á3y2ù×÷!!   μ&#188;&#214;&#194;′í&#206;ó&#161;£&#196;&#191;&#199;°&#207;è&#198;á±&#206;         {                 while(addrx<endaddr)                //é¨&#199;&#229;ò&#187;&#199;D&#213;&#207;°-.(&#182;&#212;·&#199;FFFFFFFFμ&#196;μ&#216;·&#189;,&#207;è2á3y)                 {                         if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//óD·&#199;0XFFFFFFFFμ&#196;μ&#216;·&#189;,òa2á3y&#213;a&#184;&#246;éè&#199;&#248;                         {                                    status=FLASH_EraseSector(STMFLASH_GetFlashSector(addrx),VoltageRange_3);//VCC=2.7~3.6V&#214;&#174;&#188;&#228;!!                                 if(status!=FLASH_COMPLETE)break;        //·¢éú′í&#206;óá&#203;                         }else addrx+=4;                 }          }*/         if(status==FLASH_COMPLETE)         {                 while(WriteAddr<endaddr)//D′êy&#190;Y                 {                         if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE)//D′è&#235;êy&#190;Y                         {                                  break;        //D′è&#235;òì3£                         }                         FLASH_ProgramWord(WriteAddr,*pBuffer);                         delay_ms(10);                         WriteAddr+=4;                          pBuffer++;                 }          }   FLASH_DataCacheCmd(ENABLE);        //FLASH2á3y&#189;áê&#248;,&#191;a&#198;&#244;êy&#190;Y&#187;o′&#230;         FLASH_Lock();//é&#207;&#203;&#248; }
回复

使用道具 举报

10

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2017-6-21
在线时间
23 小时
发表于 2017-6-21 11:10:40 | 显示全部楼层
片内FLASH写入数据时,如果目标位置非0xFF时,会先擦出整个扇区,第一次写成功是因为待写入位置没有操作过,可以直接写入数据。建议:如果写入数据较多,可以写一个初始化函数,每次将所有数据都重新写入一遍。试试看。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 20:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表