denote

denote

0个粉丝

8

问答

0

专栏

2

资料

denote  发布于  2013-11-21 21:55:14
采纳率 0%
8个问答
2582

再说STM32中使用Flash模拟EEPROM

这是一片讲得很透彻的帖子,其实Flash也没那么难用
原帖:[url]http://www.amobbs.com/thread-5288587-1-1.html[/url]
关于这个话题已经有很多贴了,况且官方也出了操作例程,但是感觉还是比较繁琐!

    最近要用到这个功能,例程看了半天还是不怎么明白,最后只好仔细阅读了下,感觉其实挺简单的,就是按照资料上说的操作相关的寄存器就可以了。
   
    附上源程序:

#define                PAGE_ADDR                                (0x08000000 + 63 * 1024)


/***************************************************************************************************
* 函数名称: MemReadByte()
* 函数功能: 从存储器中读出num字节数据
* 入口参数: *dat:读出数据的保存地址
*                        num        :读出的字节数
* 出口参数: 0:操作失败;1:操作成功
* 使用说明: 无
* 创建日期: 2010年12月15日
***************************************************************************************************/
uint8 MemReadByte(uint16 *data,uint16 num)                                
{
        uint16 *temp_addr = (uint16 *)PAGE_ADDR;
        
        while(num --)
        {
                *data ++ = *temp_addr ++;
        }
                                                                                                        
        return 1;                                                                                                        
}

/***************************************************************************************************
* 函数名称: MemWriteByte()
* 函数功能: 向存储器中写入num字节数据
* 入口参数: *dat:待写入数据
*                        num        :写入的字节数
* 出口参数: 0:操作失败;1:操作成功
* 使用说明: 无
* 创建日期: 2010年12月15日
***************************************************************************************************/
uint8 MemWriteByte(uint16 *data,uint16 num)                                
{
        FLASH_Status temp_stat;
        uint32 temp_addr = PAGE_ADDR;
               
        FLASH_Unlock();                                                                                                        // Flash解锁,允许操作相关的寄存器
        temp_stat = FLASH_ErasePage(PAGE_ADDR);                                                        // 擦出制定的页
        
        if(temp_stat != FLASH_COMPLETE)
        {
                FLASH_Lock();
                return 0;
        }
        
        while(num --)
        {
                temp_stat = FLASH_ProgramHalfWord(temp_addr,*data);
                if(temp_stat != FLASH_COMPLETE)
                {
                        FLASH_Lock();
                        return 0;
                }
        
                temp_addr += 2;
                data++;
        }
        
        FLASH_Lock();        
        return 1;
}


#include "app_cfg.h"                                       

uint16        write_buf[10] = {0,1,2,3,4,5,6,7,8,9};

int main(void)
{
        uint16 cnt;
               
           STM32Init();  
        
        MemWriteByte(write_buf,10);  
        for(cnt = 0;cnt < 10;cnt ++)
        {
                write_buf[cnt] = 11;
        }
        MemReadByte(write_buf,10);
         
    while(1)                                                                          
    {
        ;        
    }  
}

     上面的程序是在63K开始的Flash中写入10个16位的数据,然后在把他读出来,当然在每次写时需要擦除一整页,只要数据不是非常频繁修改,不会影响Flash的使用寿命!

     简单吧,呵呵!
我来回答
回答0个
时间排序
认可量排序
易百纳技术社区暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区