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

【经验分享】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>
# t9 \- i' {* b8 k" X: b9 {# E' b: \$ v2 Q& u* [; O% k
    1. 修改stm8s_conf.h的注释,让#include "stm8s_flash.h"得以编译; V+ U$ Y" f9 H7 M  p1 u5 E

, {1 }% a, C$ Q$ c* n3 l    2.修改stm8s.h的注射,让使Flash功能能够从RAM中运行2 q$ y; N' h* r. q1 a6 b
+ u7 a: q4 M! t( t: `
#if !defined (RAM_EXECUTION)/ @- T- V1 N7 F/ X% U
    #define RAM_EXECUTION  (1)                                                  // 块写入时,必须打开这里的注射
) e% ~1 ?. K+ k* N. j$ W#endif /* RAM_EXECUTION */- ]/ }" }7 E2 Q) |3 y9 v3 X
" a) m3 U/ v8 A

* d% C* m$ i# U: d6 M4 S5 H   3.修改完成后,将产生不少警告,消除的方法,暂时还没有找到,但不影响代码的运行。; j. Z! v9 ~) Q0 U
# h1 `* v* g( t1 q2 Q' U. y

' A9 y4 @$ P  k% Y- D附上代码:
+ j! A% T: Y) f9 c3 J# V3 t' c3 I: ]2 G5 o( w. A, t1 h* V, R1 e
  1. #include "fy_flash.h"
    * K2 X6 \* Q' d! n

  2. % d) s1 |( l0 s+ L8 K- l# t
  3. , a% e8 E2 a" r# m
  4. //操作flash前需要取消注释stm8s.h中154行的/* #define RAM_EXECUTION  (1) */
    2 }1 L# P$ e; ]7 q: X( T% o
  5. 6 b" C) @3 D( t3 y

  6. , a% q% ^3 U: [6 m( ?* y  S* F
  7. //从块的指定的第三个字节读取数据(词条序号)
    8 S: O) i+ ^& H2 [
  8. u8 Flash_ReadByte_3(u8 Block)
    9 f$ Y2 l& Q- x" V
  9. {
    & ^$ K6 E. H7 t2 ?
  10.   u32 addr;
    6 g& {2 U7 X' D7 j

  11. ' L! H$ g! p# J7 i1 v" w$ e
  12.   addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;9 A0 }8 y9 d4 ~4 f6 K# F+ z( _" v4 ?
  13.   return FLASH_ReadByte(addr+2);+ h7 x0 q4 v8 x
  14. }
    8 Y& z% X- l2 b4 Q# {$ S& G
  15. ; {: X$ P0 M9 _. Z& _
  16. //向Flash指定的块写入内容
    8 E- e: C6 t3 W
  17. void Flash_WriteBlock(u8 Block , u8 *buf)
    9 h+ M/ v& Q6 U# H
  18. {  / `6 B: _& T  d& ]! P- u& \5 I
  19.   if(Block>FLASH_PROG_BLOCKS_NUMBER) return;
    , Q* \0 q8 L5 S* Y8 P- s
  20. 0 Y2 @& `' u1 D$ I6 M1 z( i
  21.   FLASH_Unlock(FLASH_MEMTYPE_PROG); //解锁flash! K9 Z5 \. @! d" P. X
  22.   while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET); //等待解锁标志位置位
    3 n( X( W4 R7 R. }% N  g- @
  23. % n2 v0 I: E6 `' h( B" P3 D
  24.   //块标准编程,写入前,硬件自动删除内容) V7 c& @8 M  L9 Z
  25.   FLASH_ProgramBlock(Block, FLASH_MEMTYPE_PROG, FLASH_PROGRAMMODE_STANDARD,buf);
    ( Z* T* j# w- D0 M9 C. {, x
  26.   //等待操作完成
    $ }0 E* L4 ^' u4 p, m$ Z: P
  27.   FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG);7 ?/ R! B9 S7 @# d! d  h
  28.   //操作完上锁1 Q9 ~4 B6 K9 Q$ \8 f- m5 E
  29.   FLASH_Lock(FLASH_MEMTYPE_PROG);   
    - ]' U; Y: }# R# n6 C( M6 T
  30. }& C( G. D* G# S. z

  31.   S( x* k: y) _0 k# v
  32. //从Flash指定数量的块读取内容
    # {8 q8 Z% ?/ Q5 ^8 S5 l! W4 T
  33. void Flash_ReadBlock(u8 Block ,u8 *buf)
    , j3 D9 o5 c; {$ r" P- v0 e
  34. {
    4 w" ?& E0 Z4 ^9 A& }* o$ b
  35.   u8 i;7 c0 \4 e/ `( Z' ^
  36.   u32 addr;! c: u/ T) I$ ]% I4 K; \- `
  37.   u8 sta=0;
    ' g$ W$ ^* `* z: z: \
  38.   if(Block>FLASH_PROG_BLOCKS_NUMBER) return;2 v$ S" o7 t0 \) H3 E( x9 P
  39. , S- z+ v0 U2 s. z' T
  40.   //计算地址
    - l1 X! @* o7 Z/ _
  41.   addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;
    & X* X. I& O3 O( b! G2 [' G8 }  h
  42. 1 _+ S% ^6 ?6 C- V  C/ y
  43.   for(i=0;i<FLASH_BLOCK_SIZE;i++)
    " O& C- ?- W' b- v1 ^0 k
  44.   {8 X* ], V2 R7 n/ k" |: B) R
  45.         *(buf+i) = FLASH_ReadByte(addr+i); //读取一块数据
    / D7 }' E8 a6 u. B( F
  46. /*        if(buf<i>=='\r' &&</i> sta==0)        sta=1;
    8 P9 f9 r7 `" i$ |% u  H* C
  47.         else if(buf=='\n' && sta==1)        return;
    ; O" a( W$ x$ j) K, H4 N
  48.         else sta=0;
    6 m$ H* g2 [) C+ ^
  49. */3 v' ]" m, }* L% `$ w7 M/ K
  50.   }! K0 R$ [) @# F3 R
  51. }
    6 p1 q: \$ |5 D/ s$ t/ p3 m/ a' m
  52. & y* s% l1 n5 r9 Z9 W: O
  53. ! y/ q" s. X8 @4 l) }/ R
  54. void Flash_Test(void)
    ; E% ?3 J9 [7 x( _# s: c
  55. {
    6 j4 ], k% t9 h! `( ^# u
  56.         u8 write_buf[FLASH_BLOCK_SIZE]="MARS->This is a Flash Data Memory write and read test...\r\n";
    5 ^  ^3 J6 S5 f
  57.         u8 read_buf[FLASH_BLOCK_SIZE];! F5 d/ R3 ^  h
  58.         Flash_WriteBlock(120,write_buf);
    0 {& I- E! D1 }; I# B) V9 _' M6 a1 ]
  59.         Flash_ReadBlock(120,read_buf);# M3 I0 n5 V8 @7 k( ?
  60.         UART1_SendString(read_buf);. Z2 j' }  E& I$ n: J( x9 ~
  61.         while(1)
    0 Y" L$ o& Q: c5 N6 X0 q
  62.         {/ ~6 V# [& |9 ^2 K; Y
  63.           LED_TOG;Delay_ms(350);! I2 \7 N+ |8 Z7 m
  64.         }
    " t) Q/ B" r6 p& J
  65. }
    % P5 ^0 A* T# f1 i( ]  P+ b" w# x
  66. /*********************************************END OF FILE********************************
复制代码
2 {% f  N; G0 f4 M) X) J1 I' w* U
. d  p) z, G6 F1 t5 Z6 K
" |# }% a6 T2 P1 K
收藏 评论0 发布时间:2022-3-16 20:56

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版