作者:mobiledu2502885307 | 来源:互联网 | 2024-10-25 15:49
在STM8S系列微控制器中,尽管库函数已提供块操作功能,如FLASH_ProgramBlock(),但要实现高效可靠的块操作,还需对相关配置参数进行细致调整。本文详细探讨了这些配置步骤,并结合实际案例分析了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); //解锁flashwhile (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/* 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