【单片机笔记】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<FLASH_BLOCK_SIZE;i++)
  {
	*(buf+i) = FLASH_ReadByte(addr+i); //读取一块数据
/*	if(buf[i]=='\r' && sta==0)	sta=1;
	else if(buf[i]=='\n' && sta==1)	return;
	else sta=0;
	*/
  }
}


void Flash_Test(void)
{
	u8 write_buf[FLASH_BLOCK_SIZE]="MARS->This is a Flash Data Memory write and read test...\r\n";
	u8 read_buf[FLASH_BLOCK_SIZE];
	Flash_WriteBlock(120,write_buf);
	Flash_ReadBlock(120,read_buf);
	UART1_SendString(read_buf);
	while(1)
	{
	  LED_TOG;Delay_ms(350);
	}
}
/*********************************************END OF FILE**********************************************/


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


  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值