【单片机笔记】STM8S系列单片机FLASH操作

STM8的库函数中已经提供了块操作函数FLASH_ProgramBlock(),但是要进行块操作,还必须进行一系列的配置,否则,程序代码会死在这个函数里边的。


    1. 修改stm8s_conf.h的注释,让#include "stm8s_flash.h"得以编译

    2.修改stm8s.h的注射,让使Flash功能能够从RAM中运行

#if !defined (RAM_EXECUTION)
    #define RAM_EXECUTION  (1)                                                  // 块写入时,必须打开这里的注射
#endif /* RAM_EXECUTION */


   3.修改完成后,将产生不少警告,消除的方法,暂时还没有找到,但不影响代码的运行。


附上代码:

#include "fy_flash.h"


//操作flash前需要取消注释stm8s.h中154行的/* #define RAM_EXECUTION  (1) */


//从块的指定的第三个字节读取数据(词条序号)
u8 Flash_ReadByte_3(u8 Block)
{ 
  u32 addr;
   
  addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;
  return FLASH_ReadByte(addr+2);
}

//向Flash指定的块写入内容
void Flash_WriteBlock(u8 Block , u8 *buf)
{  
  if(Block>FLASH_PROG_BLOCKS_NUMBER) return;
  
  FLASH_Unlock(FLASH_MEMTYPE_PROG); //解锁flash
  while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET); //等待解锁标志位置位
 
  //块标准编程,写入前,硬件自动删除内容
  FLASH_ProgramBlock(Block, FLASH_MEMTYPE_PROG, FLASH_PROGRAMMODE_STANDARD,buf);
  //等待操作完成
  FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG);
  //操作完上锁
  FLASH_Lock(FLASH_MEMTYPE_PROG);   
}

//从Flash指定数量的块读取内容
void Flash_ReadBlock(u8 Block ,u8 *buf)
{
  u8 i;
  u32 addr;
  u8 sta=0;
  if(Block>FLASH_PROG_BLOCKS_NUMBER) return;
  
  //计算地址
  addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;
  
  for(i=0;i


By Urien 2017年10月26日 16:19:39


你可能感兴趣的:(单片机)