<span style="font-family: Tahoma, "Microsoft Yahei", Simsun; background-color: rgb(255, 255, 255);">STM8的库函数中已经提供了块操作函数FLASH_ProgramBlock(),但是要进行块操作,还必须进行一系列的配置,否则,程序代码会死在这个函数里边的。</span>
2 K, L1 ?. d; w9 ^$ X+ E! k- @" r& c: j
1. 修改stm8s_conf.h的注释,让#include "stm8s_flash.h"得以编译) u5 j2 A: {: k0 A. q( s
( A5 J. x. G& b. D
2.修改stm8s.h的注射,让使Flash功能能够从RAM中运行# P, p* T4 m" {5 O- p; ~
! c b2 d! u8 m9 H/ p9 ^#if !defined (RAM_EXECUTION)$ H6 r/ e) x8 u4 i
#define RAM_EXECUTION (1) // 块写入时,必须打开这里的注射4 P0 C+ S2 ?( R
#endif /* RAM_EXECUTION */% T8 l# O# M# H# ^
! H5 b4 v. l4 ~
0 N; C/ i+ |; s2 `$ \ E
3.修改完成后,将产生不少警告,消除的方法,暂时还没有找到,但不影响代码的运行。: H p- H! Y: U; P `
' Q- _1 m+ d+ O! ^/ w1 u
: _$ R. U; l, I附上代码:% M# a# G( R% t4 r
6 L7 `2 Q) u# X0 a6 ~1 V. q+ T- #include "fy_flash.h"
3 k$ S1 B# G# t' A( x: V/ H$ c9 c: G - 9 ?( }8 L$ y2 I$ f# l0 W
- / V6 v! q' Z- @8 Z/ B5 A; J/ `
- //操作flash前需要取消注释stm8s.h中154行的/* #define RAM_EXECUTION (1) */
# g- w9 l* p3 }2 p
% t$ Z6 ^9 O! i0 t, J# \! e3 }% o+ u
: u3 w% ^. m& B& g8 R. M- //从块的指定的第三个字节读取数据(词条序号)* i! E- h+ A& j" v
- u8 Flash_ReadByte_3(u8 Block)
. W, I5 z0 r8 K, w t - { % y9 ]2 L* C9 {* U U2 D/ g
- u32 addr;# B# F! O @2 }; d; I+ J
' e9 S0 u% g6 d: x9 I( j5 b- addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;2 _& Q3 G1 \ r' a
- return FLASH_ReadByte(addr+2);
1 I* |4 ?6 K5 C8 J - }$ @' ?$ Z M/ x
% S, c% j5 z6 O! \2 }7 Q- //向Flash指定的块写入内容0 @: ?2 @7 @1 h t j
- void Flash_WriteBlock(u8 Block , u8 *buf)
5 P) n5 P' x+ } S, X9 Y" _, F: _ - { + w# |7 l, p, ~
- if(Block>FLASH_PROG_BLOCKS_NUMBER) return;& _) f1 \( w. M+ N
- : B' S" d; r6 H1 t
- FLASH_Unlock(FLASH_MEMTYPE_PROG); //解锁flash
$ d$ D3 P1 u* ~1 e - while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET); //等待解锁标志位置位1 A \ {2 o5 K2 F
- 5 A% W0 \$ G' n" ^5 C4 {
- //块标准编程,写入前,硬件自动删除内容4 U0 k2 ^/ A4 I# V3 \
- FLASH_ProgramBlock(Block, FLASH_MEMTYPE_PROG, FLASH_PROGRAMMODE_STANDARD,buf);9 c' g; Q* D/ J S
- //等待操作完成
B z6 U% g4 U - FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG);. o4 y! g/ V }- V
- //操作完上锁1 i) o6 f7 j! P+ ^
- FLASH_Lock(FLASH_MEMTYPE_PROG);
# F, D1 m7 R2 W/ U J' l - }
8 f& J* f$ V0 m" ~- D9 X: r+ D, w
% Z1 U: ?, ]' h4 a+ \2 q# K9 T# }( ~- //从Flash指定数量的块读取内容
: T2 d& ?! R; G4 l( y - void Flash_ReadBlock(u8 Block ,u8 *buf)
: |* l5 @' Y. [) x' h9 {; x/ `/ { - {! d6 Y t7 N! _* r
- u8 i;4 }+ E! }9 X f& N5 G- g6 b! o; o7 N
- u32 addr;
6 M2 N6 B4 F; m$ P' X: { - u8 sta=0;
! S0 \1 H' {/ C7 ~: Z k; x4 M5 e - if(Block>FLASH_PROG_BLOCKS_NUMBER) return;7 F" R- Y; `" [0 C4 ?- U
2 r/ m4 |7 G" H& i5 j4 ^% E$ ?- //计算地址+ c* }, Y5 L3 ~
- addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;
0 [3 s: M' m0 r" Y - + u, L/ S! ~$ c6 ?7 h% q
- for(i=0;i<FLASH_BLOCK_SIZE;i++)
. r7 L1 F8 V3 R; f+ M - {
0 h5 L, R8 K0 N* E4 L! w - *(buf+i) = FLASH_ReadByte(addr+i); //读取一块数据! E% K8 W" H/ w4 ]' d0 F/ h
- /* if(buf<i>=='\r' &&</i> sta==0) sta=1;
# k5 C$ H; m/ A. }5 v - else if(buf=='\n' && sta==1) return; I, p+ K' d. ~$ G" O
- else sta=0;
7 g1 ~! ^5 N9 q9 y! h - */3 K+ e/ B+ o' c+ B' {8 i, |
- }
% y- h A+ c( o; @6 p: ?3 S* j9 j - }
9 k1 Y: H0 \5 h
" y* h- o2 `5 {2 R- - o: O$ J6 g6 \5 ~& z/ C
- void Flash_Test(void)* y5 K8 m0 Y' w* T
- {
+ O4 t; E+ }9 T4 B - u8 write_buf[FLASH_BLOCK_SIZE]="MARS->This is a Flash Data Memory write and read test...\r\n";
# _* X! N* d8 C) f" ] - u8 read_buf[FLASH_BLOCK_SIZE];
) u1 O8 ^: ]' h$ h$ n$ Y( l& _ - Flash_WriteBlock(120,write_buf);
! u5 k) Z! F" |0 g - Flash_ReadBlock(120,read_buf);
7 f8 C% \2 z6 J: P$ |! Y. B& I6 \0 r - UART1_SendString(read_buf);- \4 m8 y& h8 r* F% w( E
- while(1)
9 g* e( j5 x7 j/ P - {
2 r2 ^; P+ d6 X$ b% K0 s3 Y$ b - LED_TOG;Delay_ms(350);
/ u+ _) V$ @* b# ^ d a1 G - }& d9 N! i: a/ o' Q* W
- }* n7 H; J9 Z- @. Y/ T
- /*********************************************END OF FILE********************************
复制代码
* J7 ^; D7 y" A) X8 P
! Y( D0 d% C$ b( ^2 A9 a
# T2 W( i' k( ^& n |