加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

STM flash数据读取

发布时间:2020-12-15 18:11:59 所属栏目:百科 来源:网络整理
导读://///////////**************************.h文件*********************************/////////////////////////////////// #ifndef _FLASH_CTRL_H_ #define _FLASH_CTRL_H_ #ifdef STM32F10X_HD #define FLASHADDRSTART 0x0807F800 // #define FLASHADDREND 0

/////////////**************************.h文件*********************************///////////////////////////////////

#ifndef _FLASH_CTRL_H_
#define _FLASH_CTRL_H_

#ifdef STM32F10X_HD
#define FLASHADDRSTART 0x0807F800 //
#define FLASHADDREND 0x08080000 //
#elif STM32F10X_MD
#define FLASHADDRSTART 0x0801FC00 //
#define FLASHADDREND 0x0801FFFF //
#elif STM32F10X_LD
#define FLASHADDRSTART 0x08001000 //
#define FLASHADDREND 0x080013FF ? //
#endif

?#ifdef? STM32F10X_HD //大容量产品,flash>=256K
#define FLASH_PAGE_SIZE??? ((u16)0x800)//2K
#elif STM32F10X_MD //小容量产品,flash <256K
#define FLASH_PAGE_SIZE? ((u16)0x400)//1K
#else
#define FLASH_PAGE_SIZE? ((u16)0x400)//1K
#endif

#define UCHAR unsigned char
#define CHAR? char
#define ULONG unsigned long?
#define UINT unsigned int
#define boolen UCHAR

#ifndef true
#define true 1
#endif

#ifndef false
#define false 0
#endif

#define BLOCK_SIZE?64

typedef struct _tagFLASHWORDBUFF
{
?ULONG ulItems[BLOCK_SIZE/4];
}?
FLASHWORDBUFF;

typedef struct _tagFLASHHALFWORDBUFF
{
?UINT ulItems[BLOCK_SIZE/2];?
}FLASHHALFWORDBUFF;

typedef struct _tagFLASHBYTEBUFF
{
?UCHAR ulitems[BLOCK_SIZE];
}
FLASHBYTEBUFF;

boolen writeFlash(UCHAR* str,UINT len);
UINT readByteFlash(UINT len);
UINT readHalfWordFlash(UINT len);
UINT readWordFlash(UINT len);

#endif

/////////////////////////********************.c文件***************************///////////////////////////////////////////////

/* Includes ------------------------------------------------------------------*/
#include "flashctrl.h"
#include "stm32f10x_flash.h"

/* Private variables ---------------------------------------------------------*/
vu32 NbrOfPage = 0x00;
u32 EraseCounter = 0x00,Address = 0x00;
volatile FLASH_Status FLASHStatus;

FLASHBYTEBUFF flashBytebuff;
FLASHHALFWORDBUFF flashHalfWrodbuff;
FLASHWORDBUFF flashWordbuff;
/* Public function------------------------------------------------------------*/
/******************************************************************************
* Function Name: writeFlash
* Description? : Erease the range (FLASHADDREND - FLASHADDRSTART) of flash,and
*??????????????? Write the string to it.
* input??????? : the writed of string - str,the len of str
* output?????? : write or erease success return 1,otherwise return 0.
*******************************************************************************/
boolen writeFlash(UCHAR* str,UINT len)
{
?FLASH_Unlock();
?NbrOfPage = ( FLASHADDREND - FLASHADDRSTART ) / FLASH_PAGE_SIZE;
?FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);?
?FLASHStatus = FLASH_COMPLETE;
?for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
?{
?? ? ?FLASHStatus = FLASH_ErasePage(FLASHADDRSTART + (FLASH_PAGE_SIZE * EraseCounter));
? }
?if(FLASHStatus != FLASH_COMPLETE )//擦除不成功
?{
??return false;
?}
?Address = FLASHADDRSTART;
?while((Address < FLASHADDREND ) && (FLASHStatus == FLASH_COMPLETE))
?{
??//instr = (*str)|((*(str+1))<<8);
??if(len == 0) break;
??FLASHStatus = FLASH_ProgramWord(Address,*(u32*)str);//一次性写入四个字节=1个字
??Address = Address + 4;
??len-=4;
??str+=4;
??//str+=2;
??if(len < 4)
??{
???//由于是按字的写入方式,即一次性写入4个字节的数据,
???//所有后面剩余的(4-len%4)%4个字节的补零处理
???FLASHStatus = FLASH_ProgramWord(Address,*(u32*)str);
???break;
??}
?}
?FLASH_Lock();
?if(FLASHStatus != FLASH_COMPLETE)
?{
??return false;
?}
?else return true;
}
/******************************************************************************
* Function Name: readByteFlash
* Description? : read specified length string from flash,the begin flash is : FLASHADDRSTART
*??????????????? A byte by byte to read.
* input??????? : the readed of string - str,the len of str
* output?????? : return the length of string take away 1
*******************************************************************************/
UINT readByteFlash(UINT len)//
{
?UINT i=0;
?Address = FLASHADDRSTART;
?for(i=0;i<len;i++)
?{?
??flashBytebuff.ulitems[i] = (*(__IO int8_t*) Address);
??Address+=1;
?}
?return i;
}
/******************************************************************************
* Function Name: readHalfWordFlash
* Description? : read specified length string from flash,the begin flash is : FLASHADDRSTART
*??????????????? A Halfword by halfword to read.
* input??????? : the readed of string - str,the len of str
* output?????? : return the length of string take away 1
*******************************************************************************/
UINT readHalfWordFlash(UINT len)//
{
?UINT i=0;
?Address = FLASHADDRSTART;
?for(i=0;i<len/2;i++)
?{?
??flashHalfWrodbuff.ulItems[i] = (*(__IO uint16_t*) Address);
??Address+=2;
?}
?if(len/2 )
?{
??flashHalfWrodbuff.ulItems[i] = (*(__IO uint16_t*) Address);
?}
?return i;
}
/******************************************************************************
* Function Name: readWordFlash
* Description? : read specified length string from flash,the begin flash is : FLASHADDRSTART
*??????????????? A word by word to read.
* input??????? : the readed of string - str,the len of str
* output?????? : return the length of string take away 1
*******************************************************************************/
UINT readWordFlash(UINT len)
{?

?UINT i=0; ?Address = FLASHADDRSTART; ?for(i=0;i<len/4;i++) ?{? ??flashWordbuff.ulItems[i] = (*(__IO uint32_t*) Address); ??Address+=4; ?? ?} ?if(len/4) ?{ ??flashWordbuff.ulItems[i] = (*(__IO uint32_t*) Address); ?} ?return i; } /***********************************the end of file*****************************************/ /***********************************2013-04-02**********************************************/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读