你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM8S系列单片机FLASH操作

[复制链接]
STMCU小助手 发布时间:2022-3-16 20:56
<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
  1. #include "fy_flash.h"
    3 k$ S1 B# G# t' A( x: V/ H$ c9 c: G
  2. 9 ?( }8 L$ y2 I$ f# l0 W
  3. / V6 v! q' Z- @8 Z/ B5 A; J/ `
  4. //操作flash前需要取消注释stm8s.h中154行的/* #define RAM_EXECUTION  (1) */
    # g- w9 l* p3 }2 p

  5. % t$ Z6 ^9 O! i0 t, J# \! e3 }% o+ u

  6. : u3 w% ^. m& B& g8 R. M
  7. //从块的指定的第三个字节读取数据(词条序号)* i! E- h+ A& j" v
  8. u8 Flash_ReadByte_3(u8 Block)
    . W, I5 z0 r8 K, w  t
  9. { % y9 ]2 L* C9 {* U  U2 D/ g
  10.   u32 addr;# B# F! O  @2 }; d; I+ J

  11. ' e9 S0 u% g6 d: x9 I( j5 b
  12.   addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;2 _& Q3 G1 \  r' a
  13.   return FLASH_ReadByte(addr+2);
    1 I* |4 ?6 K5 C8 J
  14. }$ @' ?$ Z  M/ x

  15. % S, c% j5 z6 O! \2 }7 Q
  16. //向Flash指定的块写入内容0 @: ?2 @7 @1 h  t  j
  17. void Flash_WriteBlock(u8 Block , u8 *buf)
    5 P) n5 P' x+ }  S, X9 Y" _, F: _
  18. {  + w# |7 l, p, ~
  19.   if(Block>FLASH_PROG_BLOCKS_NUMBER) return;& _) f1 \( w. M+ N
  20. : B' S" d; r6 H1 t
  21.   FLASH_Unlock(FLASH_MEMTYPE_PROG); //解锁flash
    $ d$ D3 P1 u* ~1 e
  22.   while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET); //等待解锁标志位置位1 A  \  {2 o5 K2 F
  23. 5 A% W0 \$ G' n" ^5 C4 {
  24.   //块标准编程,写入前,硬件自动删除内容4 U0 k2 ^/ A4 I# V3 \
  25.   FLASH_ProgramBlock(Block, FLASH_MEMTYPE_PROG, FLASH_PROGRAMMODE_STANDARD,buf);9 c' g; Q* D/ J  S
  26.   //等待操作完成
      B  z6 U% g4 U
  27.   FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG);. o4 y! g/ V  }- V
  28.   //操作完上锁1 i) o6 f7 j! P+ ^
  29.   FLASH_Lock(FLASH_MEMTYPE_PROG);   
    # F, D1 m7 R2 W/ U  J' l
  30. }
    8 f& J* f$ V0 m" ~- D9 X: r+ D, w

  31. % Z1 U: ?, ]' h4 a+ \2 q# K9 T# }( ~
  32. //从Flash指定数量的块读取内容
    : T2 d& ?! R; G4 l( y
  33. void Flash_ReadBlock(u8 Block ,u8 *buf)
    : |* l5 @' Y. [) x' h9 {; x/ `/ {
  34. {! d6 Y  t7 N! _* r
  35.   u8 i;4 }+ E! }9 X  f& N5 G- g6 b! o; o7 N
  36.   u32 addr;
    6 M2 N6 B4 F; m$ P' X: {
  37.   u8 sta=0;
    ! S0 \1 H' {/ C7 ~: Z  k; x4 M5 e
  38.   if(Block>FLASH_PROG_BLOCKS_NUMBER) return;7 F" R- Y; `" [0 C4 ?- U

  39. 2 r/ m4 |7 G" H& i5 j4 ^% E$ ?
  40.   //计算地址+ c* }, Y5 L3 ~
  41.   addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;
    0 [3 s: M' m0 r" Y
  42. + u, L/ S! ~$ c6 ?7 h% q
  43.   for(i=0;i<FLASH_BLOCK_SIZE;i++)
    . r7 L1 F8 V3 R; f+ M
  44.   {
    0 h5 L, R8 K0 N* E4 L! w
  45.         *(buf+i) = FLASH_ReadByte(addr+i); //读取一块数据! E% K8 W" H/ w4 ]' d0 F/ h
  46. /*        if(buf<i>=='\r' &&</i> sta==0)        sta=1;
    # k5 C$ H; m/ A. }5 v
  47.         else if(buf=='\n' && sta==1)        return;  I, p+ K' d. ~$ G" O
  48.         else sta=0;
    7 g1 ~! ^5 N9 q9 y! h
  49. */3 K+ e/ B+ o' c+ B' {8 i, |
  50.   }
    % y- h  A+ c( o; @6 p: ?3 S* j9 j
  51. }
    9 k1 Y: H0 \5 h

  52. " y* h- o2 `5 {2 R
  53. - o: O$ J6 g6 \5 ~& z/ C
  54. void Flash_Test(void)* y5 K8 m0 Y' w* T
  55. {
    + O4 t; E+ }9 T4 B
  56.         u8 write_buf[FLASH_BLOCK_SIZE]="MARS->This is a Flash Data Memory write and read test...\r\n";
    # _* X! N* d8 C) f" ]
  57.         u8 read_buf[FLASH_BLOCK_SIZE];
    ) u1 O8 ^: ]' h$ h$ n$ Y( l& _
  58.         Flash_WriteBlock(120,write_buf);
    ! u5 k) Z! F" |0 g
  59.         Flash_ReadBlock(120,read_buf);
    7 f8 C% \2 z6 J: P$ |! Y. B& I6 \0 r
  60.         UART1_SendString(read_buf);- \4 m8 y& h8 r* F% w( E
  61.         while(1)
    9 g* e( j5 x7 j/ P
  62.         {
    2 r2 ^; P+ d6 X$ b% K0 s3 Y$ b
  63.           LED_TOG;Delay_ms(350);
    / u+ _) V$ @* b# ^  d  a1 G
  64.         }& d9 N! i: a/ o' Q* W
  65. }* n7 H; J9 Z- @. Y/ T
  66. /*********************************************END OF FILE********************************
复制代码

* J7 ^; D7 y" A) X8 P
! Y( D0 d% C$ b( ^2 A9 a
# T2 W( i' k( ^& n
收藏 评论0 发布时间:2022-3-16 20:56

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版