搜索
bottom↓
回复: 6

发一个STM32f103c8t6的Flash程序

[复制链接]

出0入0汤圆

发表于 2016-8-12 10:26:54 | 显示全部楼层 |阅读模式
首先是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
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       













阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2016-9-16 16:03:29 | 显示全部楼层
参考你的程序,多谢分享。

出0入0汤圆

发表于 2016-9-16 16:53:09 | 显示全部楼层
我也来送上一个赞。。。

出0入0汤圆

发表于 2019-8-25 12:35:52 | 显示全部楼层
就喜欢这个网站,需要的软件例程都有,自己根据情况改吧改吧就能用!

出0入0汤圆

发表于 2020-6-28 10:00:22 | 显示全部楼层
非常有用,谢谢好哥们

出0入0汤圆

发表于 2020-6-30 10:53:39 | 显示全部楼层
多谢你分享的参考程序。

出0入0汤圆

发表于 2020-6-30 16:27:52 | 显示全部楼层
楼主好人,多谢分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 14:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表