深圳单片机开发网
 
-- 
深圳单片机交流网
收藏本站
联系站长
关于本站
首页 信息发布 产品宣传 论坛交流 学习文章 技术人生 项目源码 技术资料 人才收录
 今天是: 2018年7月17日 星期 二
欢迎光临!单片机群号:154389772 25930265 71062262 21829895 64584393 26583231  
热门文章推荐


当前位置:首页>>>单片机学习文章>> 关于STM32的flash读写数据
关于STM32的flash读写数据
作者:tamson给他留言 [转载] 字体:
发表于:
2016-01-27 14:54:19
(碧海蓝天)
今天调试程序的时候需要把掉电前的数据存储到flash中之后等待下次初始化的时候把数据读进来。
刚刚开始的时候去找了一些stm32的flash的操作,真的是废话连篇的真正能用到的没几句话,这里我把自己调试好的flash读写数据的子函数跟大家分享一下。
void FLASH_WriteByte(u32 addr ,u16 flashdata1)
{
 FLASH_Status FLASHstatus = FLASH_COMPLETE;
 FLASH_Unlock();//解锁
 FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
 FLASHstatus=FLASH_ErasePage(addr);//擦除整页
 FLASHstatus=FLASH_ProgramHalfWord(addr, flashdata1);//写入数据
 FLASH_Lock();//锁定
}
这个子函数就是将数据flashdata1写到地址addr中去。数据的长度是可变的。
当需要读入数据的时候可以直接访问地址,如:rdata=*(u16 *)0x08014000;   //读flash中默认数据
0x08014000是存储的地址。

这样大家应该很清楚了吧。flash读写数据还是比较简单的,这里希望能帮到大家。

但是在写入数据的时候,又遇到了另一个问题,就是程序运行的时候进入到这个HardFault_Handler函数中死循环了,不知道大家有没有遇到过这个问题,后来我查了一些资料,发现可能是存储器的分配有问题。然后把地址改到更大的地方,又试了试,发现已经可以了。建议大家这样试一试。

下面是我找的关于
防止误擦除有用程序代码的方法

方法一:首先要计算程序代码有多少,把FLASH存取地址设置在程序代码以外的地方,这样就不会破坏用户程序。原则上从0x0800 0000 + 0x1000 以后的FLASH空间都可以作为存储使用。如果代码量占了 0x3000, 那么存储在 0x0800 0000+ 0x4000 以后的空间就不会破坏程序了。

方法二:先在程序中定义一个const 类型的常量数组,并指定其存储位置(方便找到写入、读取位置),这样编译器就会分配你指定的空间将常量数组存入FLASH中。当你做擦除。读写操作时,只要在这个常量数组所在的地址范围就好。
  const uint8_t table[10] __at(0x08010000) = {0x55} ;
  MDK3.03A开始就支持关键字 __at() 。
  需要加#include 

方法三:在程序中定义一个const 类型的常量数组,无需指定其存储位置。只要定义一个32位的变量存储这个数组的FLASH区地址就行。



  uint32_t address;//STM32的地址是32位的

  const uint8_t imageBuffer[1024] = {0,1,2,3,4,5,6,7};

  address = (uint32_t) imageBuffer;

方法四:利用写保护的方式(没研究明白)

    if(SET != FLASH_OB_GetRDP())
    {
        printf("Flash read protection not set, protection.....\n");
        FLASH_Unlock();
        FLASH_OB_Unlock();

        //FLASH_OB_WRPConfig();
        FLASH_OB_RDPConfig(OB_RDP_Level_1);
        //FLASH_OB_UserConfig();
        //FLASH_OB_BORConfig();

        printf("protection done\n");
        FLASH_OB_Launch();
        FLASH_OB_Lock();
        FLASH_Lock();
    }
(本文引自www.mcujl.com/article.asp?conID=3168)

下一篇:没有了

---------------------------------------------------------------------------------------------------
[打印文章] [关闭本页] [返回顶部]
本网站部分资料转自网上,如有侵权请来信告明,我们会尽快删除  | 网站地图
Copyright @ 2007-2010 深圳单片机开发网,单片机交流网.版权所有
网站管理员:詹工,李工
网站支持:zcl843@163.com QQ:380476830