<span style="font-family: Tahoma, "Microsoft Yahei", Simsun; background-color: rgb(255, 255, 255);">STM8的库函数中已经提供了块操作函数FLASH_ProgramBlock(),但是要进行块操作,还必须进行一系列的配置,否则,程序代码会死在这个函数里边的。</span>- t* B8 l" n0 ~3 L# I6 F
w/ B- C# @# l3 Y: t" `9 I0 R 1. 修改stm8s_conf.h的注释,让#include "stm8s_flash.h"得以编译
# L3 [+ H6 t8 b0 }
0 I z4 J) }6 o 2.修改stm8s.h的注射,让使Flash功能能够从RAM中运行
' |) d* S, M$ L$ p6 |. Q
- V: h. W B' C ]#if !defined (RAM_EXECUTION)
3 L1 z4 ]& j3 T# {; t #define RAM_EXECUTION (1) // 块写入时,必须打开这里的注射8 K* w. S) ` p! @0 s! l/ a
#endif /* RAM_EXECUTION */
9 \, w2 n2 {+ _- ~, K+ c; W: d6 x0 S
; _! H) i& c% B+ r6 L; x 3.修改完成后,将产生不少警告,消除的方法,暂时还没有找到,但不影响代码的运行。. k$ |1 p* z+ P$ F2 L
& _9 I' c) y9 ~$ x' A
2 e. _5 M) @/ `# I ~( h
附上代码:2 J1 e3 k$ n7 t9 T7 t) ` W6 h
5 w C8 y, `+ u+ K' B3 a. z' U
- #include "fy_flash.h"/ b" K* b" g( \3 Q: c8 X( G
- & r* M2 r3 ]+ k4 P# r( s @* i
) @# K4 \. k+ e4 k7 g, a, W, E- //操作flash前需要取消注释stm8s.h中154行的/* #define RAM_EXECUTION (1) */
# s6 V# H* V9 x3 I) E
/ t& O& u0 A B. e9 u! m9 Q- - X4 e+ l/ m0 C1 T; W& {* d
- //从块的指定的第三个字节读取数据(词条序号), m3 ]# E, Q! }' j$ P
- u8 Flash_ReadByte_3(u8 Block)
/ r9 ~& a P1 R& f3 |5 O/ V - {
: g7 l6 J' C0 S5 F$ a4 g; ^ - u32 addr;
; M4 H% ~. C& S4 T+ H1 _- A: M - ; P6 ^# [. V4 w5 p5 y, K
- addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;6 t; t% U9 {7 x1 l" S& ^
- return FLASH_ReadByte(addr+2);% @4 V- S( g/ w+ C9 _) P Q
- }
6 c! Q" P# _, a7 C, b( |8 u4 y
. G; _& |( S! [$ V4 y1 v- //向Flash指定的块写入内容- L& t; c3 h& y3 k) g( L* f
- void Flash_WriteBlock(u8 Block , u8 *buf): o, {" c% ?% j7 ~2 H
- {
2 |" {: Y9 @" ]; B7 H3 |6 F3 p+ N - if(Block>FLASH_PROG_BLOCKS_NUMBER) return;
. v+ W0 }+ T+ |8 F9 ?- h) r, o
# M1 h: N3 C4 Z# v n- FLASH_Unlock(FLASH_MEMTYPE_PROG); //解锁flash6 G# ]' f3 F/ n, W, ~: w: s
- while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET); //等待解锁标志位置位0 G6 q, m0 ]: X, p
) G5 H& U }6 L. c% R6 F% L- //块标准编程,写入前,硬件自动删除内容# m, L' N( Q3 `# u
- FLASH_ProgramBlock(Block, FLASH_MEMTYPE_PROG, FLASH_PROGRAMMODE_STANDARD,buf);7 G$ l7 U3 B* h% e! o7 o* j+ m
- //等待操作完成
9 y* Z( p! c5 j; p, J: I - FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG);8 p4 z' b8 S7 A; \; V: H
- //操作完上锁
6 z. ^7 j2 V G- P+ A - FLASH_Lock(FLASH_MEMTYPE_PROG);
+ ?) V* s1 o" ] - }9 ], o8 K+ ?9 o, `" e2 q2 N" G
9 K4 I" z, b0 m0 Q6 c- //从Flash指定数量的块读取内容3 r7 y' |6 R, s
- void Flash_ReadBlock(u8 Block ,u8 *buf)
' V; I( u; W6 w4 @ - {) W& [; b% g3 |3 H1 X8 ?" w
- u8 i;" S+ q2 P( N. k! h; R4 w0 B
- u32 addr;
0 k. [; Q4 s, V( E - u8 sta=0;
5 U! L0 F4 Y1 g, Y$ D6 r6 P7 [ - if(Block>FLASH_PROG_BLOCKS_NUMBER) return;
* {5 R) I" E( {- }' b$ E5 h
- @ ^. Z' u" y( O. p) c4 p- //计算地址
/ ]5 T$ r( k( z/ @/ m$ N - addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;! {/ k% V4 I: ^* s# R8 G
) c# c! w) s7 Q- for(i=0;i<FLASH_BLOCK_SIZE;i++)
2 y# u; N7 C/ G x5 r - {( L9 k7 x" V- y9 H a" |7 ^& A
- *(buf+i) = FLASH_ReadByte(addr+i); //读取一块数据) E+ L0 K! S; S n, ]" u7 L$ W' e
- /* if(buf<i>=='\r' &&</i> sta==0) sta=1;6 Z h/ e& W# ?
- else if(buf=='\n' && sta==1) return;
- ~ q& @; O- J: _$ ]) D6 [: Z - else sta=0;/ _ m' a$ s# a% S9 g' Z
- */7 g4 E4 g4 }2 G9 p" l
- }: S* I! S3 y9 u) {2 Z+ {/ X
- }
: q" j0 |+ t! h9 o
6 Y. Z3 K& E7 L1 G5 W) t' G
1 p1 V, Z3 c5 w* R) E8 {0 U- void Flash_Test(void)0 y5 O2 e8 K5 Z+ q# b- W2 D
- {
, a9 _; }, `$ X' j, x; G2 {. S4 c - u8 write_buf[FLASH_BLOCK_SIZE]="MARS->This is a Flash Data Memory write and read test...\r\n";( Y7 g U5 S9 N3 v, f
- u8 read_buf[FLASH_BLOCK_SIZE];
! o$ G8 v5 U. [& G - Flash_WriteBlock(120,write_buf);/ Y$ }9 M& q9 l: a3 @
- Flash_ReadBlock(120,read_buf);1 Y( m2 r4 V4 [
- UART1_SendString(read_buf);/ n1 V8 Z& B8 _1 L3 [ Y
- while(1)# W& W: h: x! Z) K! x1 @/ i1 r: x W
- {" b& X' f8 D% _2 D. J
- LED_TOG;Delay_ms(350);3 |$ N* @6 }$ S$ v B( G! J
- }
" i! H$ F4 J# D' S - }
+ a) y$ u: p: h% }' s" d( l5 m - /*********************************************END OF FILE********************************
复制代码 / u8 z1 M$ Z9 H3 X- a4 ~& {/ A5 _: P ^
+ ^! p6 S; Q, I: V) p g) x
7 z" K+ B% O, M2 g0 } |