打印
[菜农助学交流]

烈火-M0 4K DATAFLASH当做1K 32Bit EEPROM用,非常方便!

[复制链接]
13480|42
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
plc_avr|  楼主 | 2011-11-26 13:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  M0有 4K DATAFLASH,可以当做1K 32Bit EEPROM用,非常方便!
  前几天说共享,说到要做到,呵呵,现将资料整理一下上传,可以不用再外扩EEPROM了,谁用谁知道。注意在用DATA FLASH前,请先将DATA FLASH使能,要不然没办法存数据进去。
设置见截图:

运行图片:

源码:
#include <stdio.h> 
#include "NUC1xx.h"
#include "Driver\DrvSYS.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvUART.h"
#include "Driver\DrvFMC.h"

uint32_t temp1,temp2,temp3;

#define DATA_Flash_Start_ADD 0x0001F000
#define PAGE_SIZE 128 //512 byte

void DATA_FLASH_Write(uint32_t add,uint32_t data);
uint32_t DATA_FLASH_Read(uint32_t add);

//============================================================================
// DATA FLASH当做EEPROM用。4k 8BIT当做1K 32位用,这样读写更方便!---烈火狂龙
// u32addr : 0-1024   写入地址
// u32data : 0-0xFFFFFFFF 写入数据
//============================================================================
void DATA_FLASH_Write(uint32_t u32addr,uint32_t u32data)
{
uint32_t data_buff[128]={0};
uint32_t i=0;

__set_PRIMASK(1);//关闭全局中断,不关中断就等着出错吧,呵呵。

UNLOCKREG();
DrvFMC_EnableISP();

for(i=0;i<AGE_SIZE;i++)
DrvFMC_Read(DATA_Flash_Start_ADD+i*4+ u32addr/128*512, &data_buff);//读出一页

DrvFMC_Erase(DATA_Flash_Start_ADD+u32addr/128*512);//擦除一页

data_buff[u32addr%128]=u32data; //修改要写入的数据

for(i=0; i<AGE_SIZE; i++) //写入数据
DrvFMC_Write(DATA_Flash_Start_ADD+i*4+ u32addr/128*512, data_buff);


DrvFMC_DisableISP();
LOCKREG();
__set_PRIMASK(0);//打开全局中断

}

//============================================================================
// u32addr : 0-1024   读取地址
//============================================================================
uint32_t DATA_FLASH_Read(uint32_t u32add)
{
uint32_t u32data;
__set_PRIMASK(1);//关闭全局中断,不关中断就等着出错吧,呵呵。
UNLOCKREG();
DrvFMC_EnableISP();
DrvFMC_Read(u32add*4+DATA_Flash_Start_ADD, &u32data);
DrvFMC_DisableISP();
LOCKREG();
__set_PRIMASK(0);//打开全局中断
return u32data;
}



//============================================================================
//                主程序
//============================================================================
int32_t main (void)
{
STR_UART_T sParam;

/* Unlock the protected registers */
UNLOCKREG();
/* Enable the 12MHz oscillator oscillation */
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);

/* Waiting for 12M Xtal stalble */
DrvSYS_Delay(5000);

/* HCLK clock source. 0: external 12MHz; 4:internal 22MHz RC oscillator */
DrvSYS_SelectHCLKSource(0);
/*lock the protected registers */
LOCKREG();

DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0); /* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */

/* Set UART Pin */
DrvGPIO_InitFunction(E_FUNC_UART0);

/* UART Setting */
sParam.u32BaudRate = 115200;
sParam.u8cDataBits = DRVUART_DATABITS_8;
sParam.u8cStopBits = DRVUART_STOPBITS_1;
sParam.u8cParity = DRVUART_PARITY_NONE;
sParam.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES;

/* Set UART Configuration */
if(DrvUART_Open(UART_PORT0,&sParam) != E_SUCCESS)
{
printf("UART0 open failed\n");
return FALSE;
}

printf("================================================\n\r");
printf(" 菜农新唐M0助学板范例 \n\r");
printf(" 实验十: DATA FLASH读写例程  \n\r");
printf(" 烈火狂龙 论坛ID: plc_avr \n\r");
printf("================================================\n\r");

if(DATA_FLASH_Read(0)==0xFFFFFFFF)
{
DATA_FLASH_Write(0,0);
DATA_FLASH_Write(1,1);
DATA_FLASH_Write(2,2);
}
else
{
temp1 = DATA_FLASH_Read(0);
printf("当前DATA FLASH 地址0数据: %ld\n", temp1);
temp2 = DATA_FLASH_Read(1);
printf("当前DATA FLASH 地址1数据: %ld\n", temp2);
temp3 = DATA_FLASH_Read(2);
printf("当前DATA FLASH 地址2数据: %ld\n", temp3);

DATA_FLASH_Write(0,temp1+1);
DATA_FLASH_Write(1,temp2+1);
DATA_FLASH_Write(2,temp3+1);
}
printf("演示结束,按板子上面复位,可以看到DATA FLASH数据累加并保存\n");

while(1)
{

}

}
//============================================================================
// END
//============================================================================



工程包:
DATA_FLASH_RW.rar (1.73 MB)

相关帖子

沙发
plc_avr|  楼主 | 2011-11-26 13:47 | 只看该作者
自已做沙发.......;P

使用特权

评论回复
板凳
plc_avr|  楼主 | 2011-11-26 13:56 | 只看该作者
如果要写连续的地址存储,请自行修改写入函数,要不然页擦写的次数多了,会影响使用寿命。

使用特权

评论回复
地板
dong_abc| | 2011-11-26 16:34 | 只看该作者
还有这个功能,我也试试。

使用特权

评论回复
5
hotpower| | 2011-11-26 18:52 | 只看该作者
flash和eeprom还是有差异的,不过不频繁的写,flash还是不错的

使用特权

评论回复
6
sh007| | 2011-11-26 20:21 | 只看该作者
这个不错 得学习一下!

使用特权

评论回复
7
Cortex-M0| | 2011-11-27 04:40 | 只看该作者
烈火中勇生~~~

使用特权

评论回复
8
Swallow_0322| | 2011-11-27 07:33 | 只看该作者
顶烈火!

使用特权

评论回复
9
zhouyc168| | 2011-11-27 09:58 | 只看该作者
如果要写连续的地址存储,请自行修改写入函数,要不然页擦写的次数多了,会影响使用寿命。

使用特权

评论回复
10
Ryanhsiung| | 2011-11-28 12:59 | 只看该作者
好东东,顶一下

使用特权

评论回复
11
Ryanhsiung| | 2011-11-28 14:23 | 只看该作者
本帖最后由 Ryanhsiung 于 2011-11-28 15:09 编辑

仔细一下,写的不是很好
注:写的不正规,不易移植及应用

使用特权

评论回复
12
weshiluwei6| | 2011-11-28 15:11 | 只看该作者
支持火哥 牛人啊

使用特权

评论回复
13
plc_avr|  楼主 | 2011-11-28 16:23 | 只看该作者
仔细一下,写的不是很好
注:写的不正规,不易移植及应用
Ryanhsiung 发表于 2011-11-28 14:23

想要移值也不是难事,我的实际工程原先就是分开好的,后来做例程时头文件和C合并了。省得大家看的累。哈哈。

使用特权

评论回复
14
plc_avr|  楼主 | 2011-11-28 16:29 | 只看该作者
DATA_FLASH_RW.c

//============================================================================
// DATA FLASH当做EEPROM用。4k 8BIT当做1K 32位用,这样读写更方便!
// u32addr : 0-1024   写入地址
// u32data : 0-0xFFFFFFFF 写入数据
//============================================================================
void DATA_FLASH_Write(uint32_t u32addr,uint32_t u32data)
{
           uint32_t data_buff[128]={0};
       uint32_t i=0;
           
           __set_PRIMASK(1);//关闭全局中断

           UNLOCKREG();
       DrvFMC_EnableISP();

           for(i=0;i<AGE_SIZE;i++)
              DrvFMC_Read(DATA_Flash_Start_ADD+i*4+ u32addr/128*512, &data_buff);//读出一



       DrvFMC_Erase(DATA_Flash_Start_ADD+u32addr/128*512);//擦除一页

           data_buff[u32addr%128]=u32data;  //修改要写入的数据

           for(i=0; i<AGE_SIZE; i++)                //写入数据
              DrvFMC_Write(DATA_Flash_Start_ADD+i*4+ u32addr/128*512, data_buff);

      
       DrvFMC_DisableISP();
           LOCKREG();
           __set_PRIMASK(0);//打开全局中断

}

//============================================================================
// u32addr : 0-1024   读取地址
//============================================================================
uint32_t DATA_FLASH_Read(uint32_t u32add)
{
       uint32_t u32data;
           __set_PRIMASK(1);//关闭全局中断
       UNLOCKREG();
       DrvFMC_EnableISP();
       DrvFMC_Read(u32add*4+DATA_Flash_Start_ADD, &u32data);
       DrvFMC_DisableISP();
           LOCKREG();
           __set_PRIMASK(0);//打开全局中断
       return u32data;
}
DATA_FLASH_RW.h

#ifndef        __DATA_FLASH_RW_H
#define        __DATA_FLASH_RW_H

#define DATA_Flash_Start_ADD   0x0001F000
#define PAGE_SIZE   128        //512 byte

void DATA_FLASH_Write(uint32_t add,uint32_t data);
uint32_t DATA_FLASH_Read(uint32_t add);

#endif

文件打包:
DATA_FLASH_RW.rar (913 Bytes)

使用特权

评论回复
15
Ryanhsiung| | 2011-11-28 18:01 | 只看该作者
本帖最后由 Ryanhsiung 于 2011-11-28 18:05 编辑

这是我写的你看一下,指教一下

https://bbs.21ic.com/icview-289376-1-1.html

DataFlash.rar

1.56 KB

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
dwh000 + 4 程序包邮bug!
16
plc_avr|  楼主 | 2011-11-28 21:00 | 只看该作者
写的不错,呵呵,向你学习.

使用特权

评论回复
17
autopccopy| | 2011-12-4 10:08 | 只看该作者
flash和eeprom还是有差异的,不过不频繁的写,flash还是不错的
hotpower 发表于 2011-11-26 18:52


官方起码保证10W次吧,理论上20W次是没问题的。。。;P

使用特权

评论回复
18
haolaishi| | 2011-12-4 22:07 | 只看该作者
:lol

使用特权

评论回复
19
mcs8098| | 2011-12-20 12:42 | 只看该作者
COOL!

使用特权

评论回复
20
lixupengarm| | 2011-12-30 23:34 | 只看该作者
关注下!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:烈火DIY Mini四轴飞行器群:234879071  http://fire-dragon.taobao.com/

42

主题

1633

帖子

23

粉丝