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

【经验分享】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>- 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
  1. #include "fy_flash.h"/ b" K* b" g( \3 Q: c8 X( G
  2. & r* M2 r3 ]+ k4 P# r( s  @* i

  3. ) @# K4 \. k+ e4 k7 g, a, W, E
  4. //操作flash前需要取消注释stm8s.h中154行的/* #define RAM_EXECUTION  (1) */
    # s6 V# H* V9 x3 I) E

  5. / t& O& u0 A  B. e9 u! m9 Q
  6. - X4 e+ l/ m0 C1 T; W& {* d
  7. //从块的指定的第三个字节读取数据(词条序号), m3 ]# E, Q! }' j$ P
  8. u8 Flash_ReadByte_3(u8 Block)
    / r9 ~& a  P1 R& f3 |5 O/ V
  9. {
    : g7 l6 J' C0 S5 F$ a4 g; ^
  10.   u32 addr;
    ; M4 H% ~. C& S4 T+ H1 _- A: M
  11. ; P6 ^# [. V4 w5 p5 y, K
  12.   addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;6 t; t% U9 {7 x1 l" S& ^
  13.   return FLASH_ReadByte(addr+2);% @4 V- S( g/ w+ C9 _) P  Q
  14. }
    6 c! Q" P# _, a7 C, b( |8 u4 y

  15. . G; _& |( S! [$ V4 y1 v
  16. //向Flash指定的块写入内容- L& t; c3 h& y3 k) g( L* f
  17. void Flash_WriteBlock(u8 Block , u8 *buf): o, {" c% ?% j7 ~2 H
  18. {  
    2 |" {: Y9 @" ]; B7 H3 |6 F3 p+ N
  19.   if(Block>FLASH_PROG_BLOCKS_NUMBER) return;
    . v+ W0 }+ T+ |8 F9 ?- h) r, o

  20. # M1 h: N3 C4 Z# v  n
  21.   FLASH_Unlock(FLASH_MEMTYPE_PROG); //解锁flash6 G# ]' f3 F/ n, W, ~: w: s
  22.   while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET); //等待解锁标志位置位0 G6 q, m0 ]: X, p

  23. ) G5 H& U  }6 L. c% R6 F% L
  24.   //块标准编程,写入前,硬件自动删除内容# m, L' N( Q3 `# u
  25.   FLASH_ProgramBlock(Block, FLASH_MEMTYPE_PROG, FLASH_PROGRAMMODE_STANDARD,buf);7 G$ l7 U3 B* h% e! o7 o* j+ m
  26.   //等待操作完成
    9 y* Z( p! c5 j; p, J: I
  27.   FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG);8 p4 z' b8 S7 A; \; V: H
  28.   //操作完上锁
    6 z. ^7 j2 V  G- P+ A
  29.   FLASH_Lock(FLASH_MEMTYPE_PROG);   
    + ?) V* s1 o" ]
  30. }9 ], o8 K+ ?9 o, `" e2 q2 N" G

  31. 9 K4 I" z, b0 m0 Q6 c
  32. //从Flash指定数量的块读取内容3 r7 y' |6 R, s
  33. void Flash_ReadBlock(u8 Block ,u8 *buf)
    ' V; I( u; W6 w4 @
  34. {) W& [; b% g3 |3 H1 X8 ?" w
  35.   u8 i;" S+ q2 P( N. k! h; R4 w0 B
  36.   u32 addr;
    0 k. [; Q4 s, V( E
  37.   u8 sta=0;
    5 U! L0 F4 Y1 g, Y$ D6 r6 P7 [
  38.   if(Block>FLASH_PROG_BLOCKS_NUMBER) return;
    * {5 R) I" E( {- }' b$ E5 h

  39. - @  ^. Z' u" y( O. p) c4 p
  40.   //计算地址
    / ]5 T$ r( k( z/ @/ m$ N
  41.   addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;! {/ k% V4 I: ^* s# R8 G

  42. ) c# c! w) s7 Q
  43.   for(i=0;i<FLASH_BLOCK_SIZE;i++)
    2 y# u; N7 C/ G  x5 r
  44.   {( L9 k7 x" V- y9 H  a" |7 ^& A
  45.         *(buf+i) = FLASH_ReadByte(addr+i); //读取一块数据) E+ L0 K! S; S  n, ]" u7 L$ W' e
  46. /*        if(buf<i>=='\r' &&</i> sta==0)        sta=1;6 Z  h/ e& W# ?
  47.         else if(buf=='\n' && sta==1)        return;
    - ~  q& @; O- J: _$ ]) D6 [: Z
  48.         else sta=0;/ _  m' a$ s# a% S9 g' Z
  49. */7 g4 E4 g4 }2 G9 p" l
  50.   }: S* I! S3 y9 u) {2 Z+ {/ X
  51. }
    : q" j0 |+ t! h9 o

  52. 6 Y. Z3 K& E7 L1 G5 W) t' G

  53. 1 p1 V, Z3 c5 w* R) E8 {0 U
  54. void Flash_Test(void)0 y5 O2 e8 K5 Z+ q# b- W2 D
  55. {
    , a9 _; }, `$ X' j, x; G2 {. S4 c
  56.         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
  57.         u8 read_buf[FLASH_BLOCK_SIZE];
    ! o$ G8 v5 U. [& G
  58.         Flash_WriteBlock(120,write_buf);/ Y$ }9 M& q9 l: a3 @
  59.         Flash_ReadBlock(120,read_buf);1 Y( m2 r4 V4 [
  60.         UART1_SendString(read_buf);/ n1 V8 Z& B8 _1 L3 [  Y
  61.         while(1)# W& W: h: x! Z) K! x1 @/ i1 r: x  W
  62.         {" b& X' f8 D% _2 D. J
  63.           LED_TOG;Delay_ms(350);3 |$ N* @6 }$ S$ v  B( G! J
  64.         }
    " i! H$ F4 J# D' S
  65. }
    + a) y$ u: p: h% }' s" d( l5 m
  66. /*********************************************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 }
赞 收藏 评论0 发布时间:2022-3-16 20:56

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版