<span style="font-family: Tahoma, "Microsoft Yahei", Simsun; background-color: rgb(255, 255, 255);">STM8的库函数中已经提供了块操作函数FLASH_ProgramBlock(),但是要进行块操作,还必须进行一系列的配置,否则,程序代码会死在这个函数里边的。</span>
8 \' @+ A: H2 `6 W' k
4 m9 p1 `# q5 `0 W5 H7 {% j 1. 修改stm8s_conf.h的注释,让#include "stm8s_flash.h"得以编译$ b3 Z3 L# m B% G: ]) G
( t$ s6 Z9 b4 x; \4 C7 U1 W# j) I
2.修改stm8s.h的注射,让使Flash功能能够从RAM中运行
+ f9 ]3 U, N( j
2 e9 V& p' b Y4 |#if !defined (RAM_EXECUTION)2 a. x8 v+ i, k! q
#define RAM_EXECUTION (1) // 块写入时,必须打开这里的注射, F2 N6 K) [+ S* W
#endif /* RAM_EXECUTION */9 n) |0 U* T4 H p) u, i
; W- S" J) Q1 ]/ E$ e
9 j! c1 x8 Y3 l7 Y/ K5 t/ | 3.修改完成后,将产生不少警告,消除的方法,暂时还没有找到,但不影响代码的运行。2 B9 N' Q/ h# O1 O
% z: ~0 M' m( G) L/ e, ~
% i- F6 }" j4 |* g" @! _" _9 N$ w$ S
附上代码: L4 Q' _) X6 M2 D- W7 ]
' P, w7 f( m- z6 x1 F
- #include "fy_flash.h"4 q5 {* ]6 p. `' X
- ; G- q. K5 O" Q( R Y4 x' `- I0 y
- ) n& p% l; l6 ]* c0 `
- //操作flash前需要取消注释stm8s.h中154行的/* #define RAM_EXECUTION (1) */
: [3 |$ E- p8 _$ v6 h3 D7 U - ) p9 f; E% E' }* W
- 8 {4 g T/ g" P: Z# w
- //从块的指定的第三个字节读取数据(词条序号); f v% z7 V1 P' {0 u: s
- u8 Flash_ReadByte_3(u8 Block)
4 X; W: v& A0 R. k. x& _/ q, u - { 6 h# ^- |1 R: z y' d# k# Z
- u32 addr;
; n, a, z3 e0 }, S; V, C; g' A - : a+ K- L. b- Q [! }
- addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;
; _, K7 g9 g4 |" w9 O! F) ^0 N" D2 n - return FLASH_ReadByte(addr+2);8 l/ T; h, l$ r" R. f. v6 u+ w
- }
' j Z( q- k# S+ q# t - * |: [- L; w+ Z/ O& _
- //向Flash指定的块写入内容
# g+ w, {# Z- S - void Flash_WriteBlock(u8 Block , u8 *buf) u4 ]3 o& {5 V' T
- {
- ? N! `3 s8 n- V - if(Block>FLASH_PROG_BLOCKS_NUMBER) return;
( j2 r2 M5 Q! B3 G' |6 j4 G
2 o" G9 n9 |; @. g3 |# M' y( {- FLASH_Unlock(FLASH_MEMTYPE_PROG); //解锁flash
- Z& z/ w5 `2 j. f - while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET); //等待解锁标志位置位+ y- n5 R4 l P2 @, s& }% M
2 [5 e/ ]( W6 e2 f3 D9 ?- //块标准编程,写入前,硬件自动删除内容# E `$ p8 T% V- ]* q- M9 u0 e4 b
- FLASH_ProgramBlock(Block, FLASH_MEMTYPE_PROG, FLASH_PROGRAMMODE_STANDARD,buf);' j! S! D2 e* R% Y7 e# H; I
- //等待操作完成 u3 p4 w1 ~" P
- FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG);
/ S* j6 `; l+ q2 \& X/ K S: { - //操作完上锁1 ?# q; B8 w" @% l) L8 s [
- FLASH_Lock(FLASH_MEMTYPE_PROG);
2 {. X- p4 E& o5 v3 F - }( O; O' T( ~0 `3 o. f- G
9 s: n7 M6 y$ { W- //从Flash指定数量的块读取内容
: d' N& O7 A: M% Y - void Flash_ReadBlock(u8 Block ,u8 *buf)
3 x/ R/ Q- u0 i; _& q - {
0 M# O( j) h( Q2 S2 f+ u. ^ - u8 i;
2 D4 y) T% t1 [# A4 l) N* X) E O - u32 addr;
( L5 S. E/ d8 j* g$ c" s8 c0 W( m - u8 sta=0;: m9 S! p. D! P, \0 }# D/ i7 Y
- if(Block>FLASH_PROG_BLOCKS_NUMBER) return;
, d* s: c! _ ^, v
1 ~. N( u9 L7 n; T- //计算地址
) H: {8 Z q/ v - addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;' G8 @2 p! j7 o7 o& ]: ?
- % p, J/ [1 [4 G. F
- for(i=0;i<FLASH_BLOCK_SIZE;i++)' G2 C& p, P- z6 v
- {. N3 v8 |) v5 ]+ _9 K
- *(buf+i) = FLASH_ReadByte(addr+i); //读取一块数据
4 R7 V/ v! Y/ N$ y. n' L) w - /* if(buf<i>=='\r' &&</i> sta==0) sta=1;
5 K5 Z+ U: Z4 J: C; e - else if(buf=='\n' && sta==1) return;( Y& q6 d' E( }* P; L2 ?( b
- else sta=0;( `: O! P+ M9 @" B% z
- */
# S: `4 a% w8 B- |8 | - }" @! Y* F8 V# f" b6 L; ^
- }
# [2 Z! M5 c: }
- Y; q7 q3 R% k! U2 V! X4 a
4 `1 U3 K/ w1 {) f- void Flash_Test(void)0 y& e1 M. }& G7 @* n& A
- {2 |, o' }1 {* l6 M- r9 F" y9 W
- u8 write_buf[FLASH_BLOCK_SIZE]="MARS->This is a Flash Data Memory write and read test...\r\n";
5 ?, }$ i" V4 U! r3 Y; B6 e - u8 read_buf[FLASH_BLOCK_SIZE];) ^2 `4 ]& }$ J+ `
- Flash_WriteBlock(120,write_buf);5 ?! m8 Z9 x( u, D# W" O
- Flash_ReadBlock(120,read_buf);
5 g1 t2 }) n; I* m - UART1_SendString(read_buf);
5 X6 ]2 a; z1 b) P6 B+ M- H4 | - while(1)8 y0 v# j! A+ O* s& A
- {
4 \, o; z b+ D) w. f+ {& l! g2 h - LED_TOG;Delay_ms(350);
8 v$ V9 t8 J0 E8 ]( U - }6 D" L1 ^2 \' H1 f
- }/ p- U }4 A. h5 g
- /*********************************************END OF FILE********************************
复制代码
4 C/ S9 m8 F' u) T$ X& K
9 t9 Y3 n2 U! o0 i8 g* i! {6 s3 Z0 T
|