<span style="font-family: Tahoma, "Microsoft Yahei", Simsun; background-color: rgb(255, 255, 255);">STM8的库函数中已经提供了块操作函数FLASH_ProgramBlock(),但是要进行块操作,还必须进行一系列的配置,否则,程序代码会死在这个函数里边的。</span>
# t9 \- i' {* b8 k" X: b9 {# E' b: \$ v2 Q& u* [; O% k
1. 修改stm8s_conf.h的注释,让#include "stm8s_flash.h"得以编译; V+ U$ Y" f9 H7 M p1 u5 E
, {1 }% a, C$ Q$ c* n3 l 2.修改stm8s.h的注射,让使Flash功能能够从RAM中运行2 q$ y; N' h* r. q1 a6 b
+ u7 a: q4 M! t( t: `
#if !defined (RAM_EXECUTION)/ @- T- V1 N7 F/ X% U
#define RAM_EXECUTION (1) // 块写入时,必须打开这里的注射
) e% ~1 ?. K+ k* N. j$ W#endif /* RAM_EXECUTION */- ]/ }" }7 E2 Q) |3 y9 v3 X
" a) m3 U/ v8 A
* d% C* m$ i# U: d6 M4 S5 H 3.修改完成后,将产生不少警告,消除的方法,暂时还没有找到,但不影响代码的运行。; j. Z! v9 ~) Q0 U
# h1 `* v* g( t1 q2 Q' U. y
' A9 y4 @$ P k% Y- D附上代码:
+ j! A% T: Y) f9 c3 J# V3 t' c3 I: ]2 G5 o( w. A, t1 h* V, R1 e
- #include "fy_flash.h"
* K2 X6 \* Q' d! n
% d) s1 |( l0 s+ L8 K- l# t- , a% e8 E2 a" r# m
- //操作flash前需要取消注释stm8s.h中154行的/* #define RAM_EXECUTION (1) */
2 }1 L# P$ e; ]7 q: X( T% o - 6 b" C) @3 D( t3 y
, a% q% ^3 U: [6 m( ?* y S* F- //从块的指定的第三个字节读取数据(词条序号)
8 S: O) i+ ^& H2 [ - u8 Flash_ReadByte_3(u8 Block)
9 f$ Y2 l& Q- x" V - {
& ^$ K6 E. H7 t2 ? - u32 addr;
6 g& {2 U7 X' D7 j
' L! H$ g! p# J7 i1 v" w$ e- addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;9 A0 }8 y9 d4 ~4 f6 K# F+ z( _" v4 ?
- return FLASH_ReadByte(addr+2);+ h7 x0 q4 v8 x
- }
8 Y& z% X- l2 b4 Q# {$ S& G - ; {: X$ P0 M9 _. Z& _
- //向Flash指定的块写入内容
8 E- e: C6 t3 W - void Flash_WriteBlock(u8 Block , u8 *buf)
9 h+ M/ v& Q6 U# H - { / `6 B: _& T d& ]! P- u& \5 I
- if(Block>FLASH_PROG_BLOCKS_NUMBER) return;
, Q* \0 q8 L5 S* Y8 P- s - 0 Y2 @& `' u1 D$ I6 M1 z( i
- FLASH_Unlock(FLASH_MEMTYPE_PROG); //解锁flash! K9 Z5 \. @! d" P. X
- while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET); //等待解锁标志位置位
3 n( X( W4 R7 R. }% N g- @ - % n2 v0 I: E6 `' h( B" P3 D
- //块标准编程,写入前,硬件自动删除内容) V7 c& @8 M L9 Z
- FLASH_ProgramBlock(Block, FLASH_MEMTYPE_PROG, FLASH_PROGRAMMODE_STANDARD,buf);
( Z* T* j# w- D0 M9 C. {, x - //等待操作完成
$ }0 E* L4 ^' u4 p, m$ Z: P - FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG);7 ?/ R! B9 S7 @# d! d h
- //操作完上锁1 Q9 ~4 B6 K9 Q$ \8 f- m5 E
- FLASH_Lock(FLASH_MEMTYPE_PROG);
- ]' U; Y: }# R# n6 C( M6 T - }& C( G. D* G# S. z
S( x* k: y) _0 k# v- //从Flash指定数量的块读取内容
# {8 q8 Z% ?/ Q5 ^8 S5 l! W4 T - void Flash_ReadBlock(u8 Block ,u8 *buf)
, j3 D9 o5 c; {$ r" P- v0 e - {
4 w" ?& E0 Z4 ^9 A& }* o$ b - u8 i;7 c0 \4 e/ `( Z' ^
- u32 addr;! c: u/ T) I$ ]% I4 K; \- `
- u8 sta=0;
' g$ W$ ^* `* z: z: \ - if(Block>FLASH_PROG_BLOCKS_NUMBER) return;2 v$ S" o7 t0 \) H3 E( x9 P
- , S- z+ v0 U2 s. z' T
- //计算地址
- l1 X! @* o7 Z/ _ - addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;
& X* X. I& O3 O( b! G2 [' G8 } h - 1 _+ S% ^6 ?6 C- V C/ y
- for(i=0;i<FLASH_BLOCK_SIZE;i++)
" O& C- ?- W' b- v1 ^0 k - {8 X* ], V2 R7 n/ k" |: B) R
- *(buf+i) = FLASH_ReadByte(addr+i); //读取一块数据
/ D7 }' E8 a6 u. B( F - /* if(buf<i>=='\r' &&</i> sta==0) sta=1;
8 P9 f9 r7 `" i$ |% u H* C - else if(buf=='\n' && sta==1) return;
; O" a( W$ x$ j) K, H4 N - else sta=0;
6 m$ H* g2 [) C+ ^ - */3 v' ]" m, }* L% `$ w7 M/ K
- }! K0 R$ [) @# F3 R
- }
6 p1 q: \$ |5 D/ s$ t/ p3 m/ a' m - & y* s% l1 n5 r9 Z9 W: O
- ! y/ q" s. X8 @4 l) }/ R
- void Flash_Test(void)
; E% ?3 J9 [7 x( _# s: c - {
6 j4 ], k% t9 h! `( ^# u - u8 write_buf[FLASH_BLOCK_SIZE]="MARS->This is a Flash Data Memory write and read test...\r\n";
5 ^ ^3 J6 S5 f - u8 read_buf[FLASH_BLOCK_SIZE];! F5 d/ R3 ^ h
- Flash_WriteBlock(120,write_buf);
0 {& I- E! D1 }; I# B) V9 _' M6 a1 ] - Flash_ReadBlock(120,read_buf);# M3 I0 n5 V8 @7 k( ?
- UART1_SendString(read_buf);. Z2 j' } E& I$ n: J( x9 ~
- while(1)
0 Y" L$ o& Q: c5 N6 X0 q - {/ ~6 V# [& |9 ^2 K; Y
- LED_TOG;Delay_ms(350);! I2 \7 N+ |8 Z7 m
- }
" t) Q/ B" r6 p& J - }
% P5 ^0 A* T# f1 i( ] P+ b" w# x - /*********************************************END OF FILE********************************
复制代码 2 {% f N; G0 f4 M) X) J1 I' w* U
. d p) z, G6 F1 t5 Z6 K
" |# }% a6 T2 P1 K
|