<span style="font-family: Tahoma, "Microsoft Yahei", Simsun; background-color: rgb(255, 255, 255);">STM8的库函数中已经提供了块操作函数FLASH_ProgramBlock(),但是要进行块操作,还必须进行一系列的配置,否则,程序代码会死在这个函数里边的。</span>
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' &&</i> sta==0) sta=1;
- else if(buf=='\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********************************
复制代码
|