求一个flash存储和读写的方案

2019-10-15 02:17发布

我已经调通了flash。
现在我的需求是这样:
我每隔1分钟存储一次信息,包括:时间,应力,信号幅值。。。。。大概100字节。
这样存最多可以存半个月的信息吧。

会有上位机软件不定期向我获取flash里的信息。它的指令里会给我两个时间参数,我要把这段时间内的历史数据发给上位机。

我的问题是这样:
1,如何把指令里的时间段和我的FLASH存储地址对应起来
2,考虑到停电的情况,flash里存储的信息并不是连续的。也就是说我要知道上位机想要获取的时间段内我自身有没有掉电。
3,半个月后我会用新的信息把最老的信息覆盖掉,这就导致flash最早的有效信息不一定在哪个地址上。


因为以前没做过这样的事,感觉有点思路但还是很乱。
请有经验的前辈指点一下。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
XUZJWWSZ
1楼-- · 2019-10-15 22:06
flash.h
/****************************************Copyright (c)**************************************************
**
**                                 http://www.powermcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name:                         SST25VF016B.h
** Last modified Date:         2010-10-29
** Last Version:                 1.0
** Descriptions:                 SPI flash 操作函数
**
**------------------------------------------------------------------------------------------------------
** Created          By:                 AVRman
** Created date:                 2010-10-29
** Version: 1.0
** Descriptions:                 First version
**
**------------------------------------------------------------------------------------------------------
** Modified by:        
** Modified date:        
** Version:
** Descriptions:         
**
********************************************************************************************************/

#ifndef __SST25VF016B_H
#define __SST25VF016B_H

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"

/* Private typedef -----------------------------------------------------------*/
/* 定义操作SST25VF016B所需的数据 */
typedef enum ERTYPE{Sec1,Sec8,Sec16,Chip} ErType;  
typedef enum IDTYPE{Manu_ID,Dev_ID,Jedec_ID} idtype;

/* Private define ------------------------------------------------------------*/
#define MAX_ADDR                0x1FFFFF        /* 定义芯片内部最大地址 */
#define        SEC_MAX             511         /* 定义最大扇区号 */
#define SEC_SIZE                0x1000      /* 扇区大小        */

/* 宏,用于定义SST25VF016B的片选引脚 */
#define RCC_APB2Periph_GPIO_SPI_FLASH_CS      RCC_APB2Periph_GPIOB
#define SPI_FALSH_CS_PORT                     GPIOB
#define SPI_FALSH_CS_PIN                      GPIO_Pin_0

#define SPI_FLASH_CS_LOW()       GPIO_ResetBits(GPIOB, GPIO_Pin_0)
#define SPI_FLASH_CS_HIGH()      GPIO_SetBits(GPIOB, GPIO_Pin_0)

/* Private function prototypes -----------------------------------------------*/
void  SPI_FLASH_Init(void);
uint8_t SSTF016B_RD(uint32_t Dst, uint8_t* RcvBufPt ,uint32_t NByte);
uint8_t SSTF016B_RdID(idtype IDType,uint32_t* RcvbufPt);
uint8_t SSTF016B_WR(uint32_t Dst, uint8_t* SndbufPt,uint32_t NByte);

uint8_t SSTF016B_Erase(uint32_t sec1, uint32_t sec2);
void SPI_FLASH_Test(void);
void df_write_open(uint32_t addr);
void df_write(uint8_t *buf,uint16_t size);
void df_read(uint8_t *buf,uint16_t size);
void df_read_open(uint32_t addr);
void df_write_close(void);

#endif
/*********************************************************************************************************
      END FILE
*********************************************************************************************************/

XUZJWWSZ
2楼-- · 2019-10-16 00:06
Flashdrive.c
/****************************************Copyright (c)**************************************************                        
---------------------------------------------------------------------------------------------------
** Created by:                        AVRman
** Created date:                2010-10-29
** Version:                                1.0
** Descriptions:                The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:                       
** Modified date:       
** Version:
** Descriptions:               
********************************************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "SST25VF016B.h"
#include "FlashDriver.h"

/* Private variables ---------------------------------------------------------*/
static uint32_t CurReadAddr;        /* 当前读的地址 */
static uint32_t CurWriteAddr;        /* 当前写页地址        */

/*******************************************************************************
* Function Name  : df_read_open
* Description    : 读初始化功能函数
* Input          : - addr: 打开后读到的初始地址
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void df_read_open(uint32_t addr)
{
  CurReadAddr=addr;        /* 当前读的地址        */
}


/*******************************************************************************
* Function Name  : df_write_open
* Description    : 写初始化功能函数
* Input          : - addr: 要写的初始地址
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void df_write_open(uint32_t addr)
{
CurWriteAddr=addr;        /* 当前写地址 */
}

/*******************************************************************************
* Function Name  : df_read
* Description    : 读FLASH函数
* Input          : - buf: 接受数据的指针
*                  - size: 读取数据的大小
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void df_read(uint8_t *buf,uint16_t size)
{
  if( CurReadAddr + size <= MAX_ADDR )
  {
    SSTF016B_RD(CurReadAddr,buf,size);
    CurReadAddr+=size;
  }
}

/*******************************************************************************
* Function Name  : df_write
* Description    : 写FLASH函数
* Input          : - buf: 写数据的指针
*                  - size: 要写数据的大小
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void df_write(uint8_t *buf,uint16_t size)
{
  if( CurWriteAddr + size <= MAX_ADDR )
  {
    SSTF016B_WR(CurWriteAddr,buf,size);
    CurWriteAddr+=size;
  }
}

/*******************************************************************************
* Function Name  : df_read_seek
* Description    : 调整读取FLASH的地址       
* Input          : - addr: 新的地址
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void df_read_seek(uint32_t addr)
{
df_read_close();
df_read_open(addr);
}

/*******************************************************************************
* Function Name  : df_write_seek
* Description    : 调整写FLASH的地址
* Input          : - addr: 新的地址
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void df_write_seek(uint32_t addr)
{
df_write_close();
df_write_open(addr);
}

/*******************************************************************************
* Function Name  : df_read_close
* Description    : None
* Input          : None
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void df_read_close(void)
{
/* 此处不做任何处理 */
}

/*******************************************************************************
* Function Name  : df_write_close
* Description    : None
* Input          : None
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void df_write_close(void)
{
}

/*********************************************************************************************************
      END FILE
*********************************************************************************************************/
XUZJWWSZ
3楼-- · 2019-10-16 06:06
Flashdrive.h
/****************************************Copyright (c)**************************************************
**
**                                 http://www.powermcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name:                         FlashDriver.h
** Last modified Date:         2010-10-29
** Last Version:                 1.0
** Descriptions:                 SPI flash 功能函数
**
**------------------------------------------------------------------------------------------------------
** Created          By:                 AVRman
** Created date:                 2010-10-29
** Version: 1.0
** Descriptions:                 First version
**
**------------------------------------------------------------------------------------------------------
** Modified by:        
** Modified date:        
** Version:
** Descriptions:         
**
********************************************************************************************************/
#ifndef __FLASHDRIVER_H
#define __FLASHDRIVER_H

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"

/* Private function prototypes -----------------------------------------------*/
void df_read_open(uint32_t addr);
void df_write_open(uint32_t addr);
void df_read(uint8_t *buf,uint16_t size);
void df_write(uint8_t *buf,uint16_t size);
void df_read_seek(uint32_t addr);
void df_write_seek(uint32_t addr);
void df_read_close(void);
void df_write_close(void);

#endif
/*********************************************************************************************************
      END FILE
*********************************************************************************************************/

XUZJWWSZ
4楼-- · 2019-10-16 10:53
 精彩回答 2  元偷偷看……
1005934646
5楼-- · 2019-10-16 14:39
XUZJWWSZ 发表于 2017-1-12 03:48
代码贴在下面4个楼层了

多谢你的分享,大赞
隨颩洏過
6楼-- · 2019-10-16 16:45
本帖最后由 隨颩洏過 于 2017-2-16 13:28 编辑

楼主您好!
      我现在要做的项目也遇到你说的这样的问题:上位机软件不定期向我获取flash里的信息。它的指令里会给我两个时间参数,我要把这段时间内的历史数据发给上位机。想问一下你是怎么解决这个问题的呢?我也是用的外部Flash,要按时间点作为索引读取历史数据,跟你的要求一样!能指点一下吗?非常感谢!

一周热门 更多>