发一个STM32f103c8t6的Flash程序

2020-01-03 19:07发布

首先是Flash.c文件
/****************************************************************
*Function:        STM32F103系列内部Flash读写操作
*Author:        NanYongBing
*Date:                2016/04/09
****************************************************************/
#include "Flash.h"

#define  STARTADDR   0x0800f000                               //Flash的起始地址

volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;      //



/****************************************************************
*Name:                ReadFlashNBtye
*Function:        从Flash内读取N个字节
*Input:                ReadAddress:Flash和结构体共同的偏移地址  ReadBuf:数据地址       

               
****************************************************************/
void  ReadFlashNBtye(uint32_t ReadAddress, uint32_t *ReadBuf)
{

                ReadAddress = (uint32_t)STARTADDR + ReadAddress;
     
               
    *(ReadBuf) = *(__IO uint32_t*) ReadAddress;

    return;       
}

/****************************************************************
*Name:                WriteFlashOneWord
*Function:        向内部Flash写入32位数据
*Input:                WriteAddress:数据地址(偏移地址)WriteData:写入数据
*Output:        NULL        
****************************************************************/

void WriteFlashOneWord(uint32_t WriteAddress,uint32_t WriteData)
{
        FLASH_UnlockBank1();
        FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
  //FLASHStatus = FLASH_ErasePage(STARTADDR);

        //if(FLASHStatus == FLASH_COMPLETE)
        {
                FLASHStatus = FLASH_ProgramWord(STARTADDR + WriteAddress, WriteData);    //flash.c 中API函数
               
                //FLASHStatus = FLASH_ProgramWord(StartAddress+4, 0x56780000);                      //需要写入更多数据时开启
                //FLASHStatus = FLASH_ProgramWord(StartAddress+8, 0x87650000);                      //需要写入更多数据时开启
        }
        FLASH_LockBank1();
}

/****************************************************************
*Function:        存储结构体中的数据
*Input:                NULL
*Output:        NULL
****************************************************************/
void save_cal(uint32_t * sptr,s32 size)
{
  // s32 size;
        u8 page=0,i=0;
        u32 offset=0;//偏移地址
  //uint32_t *sptr = (uint32_t *)&cal2;
        //size=sizeof(cal2);
        size+=4;//多读一个字节
        page=(size+1024)/1024;
//        printf("sizeof cal = %d, page = %d", size, page);
  FLASH_Unlock();
        for(i=0;i<page;i++)
        {
        FLASH_ErasePage(STARTADDR+i*1024); //擦除一个Flash页面
        }
       
        while(size>0)
        {
        WriteFlashOneWord( offset, *sptr);
        offset+=4;//Flash地址的偏移
        size-=4;//
        sptr+=1;//结构体地址的偏移       
        }       
        FLASH_Lock() ;
}


/****************************************************************
*Function:        读出结构体中的数据
*Input:                NULL
*Output:        NULL
****************************************************************/

void restore_cal (uint32_t *ptr,s32 size)
{
//        s32 size=sizeof(cal2);
        u32 offset=0;//偏移地址
        //uint32_t *ptr=(uint32_t *)&cal2;
  size+=4;
       
        while(size>0)
        {
  ReadFlashNBtye( offset, ptr );
        size-=4;
        offset+=4;
        ptr+=1;
        }       
}
       
Flash.h文件       
#ifndef __FLASH_H__
#define __FLASH_H__

#include "stm32f10x.h"
#include "stm32f10x_flash.h"                     
#include "vna.h"


void WriteFlashOneWord(uint32_t WriteAddress,uint32_t WriteData);

void ReadFlashNBtye(uint32_t ReadAddress, uint32_t *ReadBuf);


void save_cal(uint32_t * sptr,s32 size);

void restore_cal(uint32_t *ptr,s32 size);

#endif


在主函数中定义一个结构体 用于存储自己要存储的数据
struct CAL
{
        int cksum;                                                        // used to determine of config is valid
        int refclk;                                                        // 150mhz clk
        int contrast;                                                // displaycontrast adjustment 0..1023
        int samplerate;                                                // a sample rate index
        int spare1;
        int spare2;
        int spare3;
        char spare4[16];
     int f_num, f_start, f_step;        // freq in hz of calibration points
};

        主函数只要调用下面两个函数就能够  用于向Flash中存储数据和读取数据
        save_cal((uint32_t*)&cal,sizeof(cal));                                // write cal to EEPROM
                                       
        restore_cal((uint32_t*)&cal,sizeof(cal));                        // make sure getting it back works
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       













友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。