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

【经验分享】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>
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
  1. #include "fy_flash.h"4 q5 {* ]6 p. `' X
  2. ; G- q. K5 O" Q( R  Y4 x' `- I0 y
  3. ) n& p% l; l6 ]* c0 `
  4. //操作flash前需要取消注释stm8s.h中154行的/* #define RAM_EXECUTION  (1) */
    : [3 |$ E- p8 _$ v6 h3 D7 U
  5. ) p9 f; E% E' }* W
  6. 8 {4 g  T/ g" P: Z# w
  7. //从块的指定的第三个字节读取数据(词条序号); f  v% z7 V1 P' {0 u: s
  8. u8 Flash_ReadByte_3(u8 Block)
    4 X; W: v& A0 R. k. x& _/ q, u
  9. { 6 h# ^- |1 R: z  y' d# k# Z
  10.   u32 addr;
    ; n, a, z3 e0 }, S; V, C; g' A
  11. : a+ K- L. b- Q  [! }
  12.   addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;
    ; _, K7 g9 g4 |" w9 O! F) ^0 N" D2 n
  13.   return FLASH_ReadByte(addr+2);8 l/ T; h, l$ r" R. f. v6 u+ w
  14. }
    ' j  Z( q- k# S+ q# t
  15. * |: [- L; w+ Z/ O& _
  16. //向Flash指定的块写入内容
    # g+ w, {# Z- S
  17. void Flash_WriteBlock(u8 Block , u8 *buf)  u4 ]3 o& {5 V' T
  18. {  
    - ?  N! `3 s8 n- V
  19.   if(Block>FLASH_PROG_BLOCKS_NUMBER) return;
    ( j2 r2 M5 Q! B3 G' |6 j4 G

  20. 2 o" G9 n9 |; @. g3 |# M' y( {
  21.   FLASH_Unlock(FLASH_MEMTYPE_PROG); //解锁flash
    - Z& z/ w5 `2 j. f
  22.   while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET); //等待解锁标志位置位+ y- n5 R4 l  P2 @, s& }% M

  23. 2 [5 e/ ]( W6 e2 f3 D9 ?
  24.   //块标准编程,写入前,硬件自动删除内容# E  `$ p8 T% V- ]* q- M9 u0 e4 b
  25.   FLASH_ProgramBlock(Block, FLASH_MEMTYPE_PROG, FLASH_PROGRAMMODE_STANDARD,buf);' j! S! D2 e* R% Y7 e# H; I
  26.   //等待操作完成  u3 p4 w1 ~" P
  27.   FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG);
    / S* j6 `; l+ q2 \& X/ K  S: {
  28.   //操作完上锁1 ?# q; B8 w" @% l) L8 s  [
  29.   FLASH_Lock(FLASH_MEMTYPE_PROG);   
    2 {. X- p4 E& o5 v3 F
  30. }( O; O' T( ~0 `3 o. f- G

  31. 9 s: n7 M6 y$ {  W
  32. //从Flash指定数量的块读取内容
    : d' N& O7 A: M% Y
  33. void Flash_ReadBlock(u8 Block ,u8 *buf)
    3 x/ R/ Q- u0 i; _& q
  34. {
    0 M# O( j) h( Q2 S2 f+ u. ^
  35.   u8 i;
    2 D4 y) T% t1 [# A4 l) N* X) E  O
  36.   u32 addr;
    ( L5 S. E/ d8 j* g$ c" s8 c0 W( m
  37.   u8 sta=0;: m9 S! p. D! P, \0 }# D/ i7 Y
  38.   if(Block>FLASH_PROG_BLOCKS_NUMBER) return;
    , d* s: c! _  ^, v

  39. 1 ~. N( u9 L7 n; T
  40.   //计算地址
    ) H: {8 Z  q/ v
  41.   addr = FLASH_PROG_START_PHYSICAL_ADDRESS + Block*FLASH_BLOCK_SIZE;' G8 @2 p! j7 o7 o& ]: ?
  42. % p, J/ [1 [4 G. F
  43.   for(i=0;i<FLASH_BLOCK_SIZE;i++)' G2 C& p, P- z6 v
  44.   {. N3 v8 |) v5 ]+ _9 K
  45.         *(buf+i) = FLASH_ReadByte(addr+i); //读取一块数据
    4 R7 V/ v! Y/ N$ y. n' L) w
  46. /*        if(buf<i>=='\r' &&</i> sta==0)        sta=1;
    5 K5 Z+ U: Z4 J: C; e
  47.         else if(buf=='\n' && sta==1)        return;( Y& q6 d' E( }* P; L2 ?( b
  48.         else sta=0;( `: O! P+ M9 @" B% z
  49. */
    # S: `4 a% w8 B- |8 |
  50.   }" @! Y* F8 V# f" b6 L; ^
  51. }
    # [2 Z! M5 c: }

  52. - Y; q7 q3 R% k! U2 V! X4 a

  53. 4 `1 U3 K/ w1 {) f
  54. void Flash_Test(void)0 y& e1 M. }& G7 @* n& A
  55. {2 |, o' }1 {* l6 M- r9 F" y9 W
  56.         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
  57.         u8 read_buf[FLASH_BLOCK_SIZE];) ^2 `4 ]& }$ J+ `
  58.         Flash_WriteBlock(120,write_buf);5 ?! m8 Z9 x( u, D# W" O
  59.         Flash_ReadBlock(120,read_buf);
    5 g1 t2 }) n; I* m
  60.         UART1_SendString(read_buf);
    5 X6 ]2 a; z1 b) P6 B+ M- H4 |
  61.         while(1)8 y0 v# j! A+ O* s& A
  62.         {
    4 \, o; z  b+ D) w. f+ {& l! g2 h
  63.           LED_TOG;Delay_ms(350);
    8 v$ V9 t8 J0 E8 ]( U
  64.         }6 D" L1 ^2 \' H1 f
  65. }/ p- U  }4 A. h5 g
  66. /*********************************************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
收藏 评论0 发布时间:2022-3-16 20:56

举报

0个回答

所属标签

相似技术帖

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