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

【经验分享】stm32——Flash读写

[复制链接]
STMCU小助手 发布时间:2022-1-22 17:26
一、Flash简介
  通过对stm32内部的flash的读写可以实现对stm32的编程操作。
  stm32的内置可编程Flash在许多场合具有十分重要的意义。如其支持ICP(In Circuit Programming,在电路编程;在线编程)特性使得开发人员对stm32可以警醒调试开发,可以通过JTAG和SWD接口对stm32进行程序烧写;支持IAP(In Application Programming,在应用中编程)使得开发人员可以在stm32运行程序的时候对其内部程序进行更新操作。对一些对数据安全有要求的场合,可编程FLASH可以结合stm32内部唯一的身份标识实现各种各样的防破解方案。并且stm32的FLASH在一些轻量级的防掉电存储方案中也有立足之地。
  stm32的FLASH分为主存储块和信息块。主存储块用于保存具体的程序代码和用户数据,信息块用于负责由stm32出厂时放置2KB的启动程序(BootLoader)和512B的用户配置信息区。
  主存储器是以页为单位划分的。stm32根据FLASH主存储块容量、页面的不同,系统存储器的不同,分为小容量、中容量、大容量、互联型,共四类产品。
  • 小容量产品:主存储块1-32KB,     每页1KB。系统存储器2KB
  • 中容量产品:主存储块64-128KB,   每页1KB。系统存储器2KB
  • 大容量产品:主存储块256KB以上,  每页2KB。系统存储器2KB
  • 互联型产品:主存储块256KB以上,  每页2KB。系统存储器18KB. m# p( B) [: x
  对于具体一个产品属于哪类,可以查数据手册,或根据以下简单的规则进行区分:
; e* q3 ]0 p1 x6 bSTM32F101xx、STM32F102xx 、STM32F103xx产品,根据其主存储块容量,一定是小容量、中容量、大容量产品中的一种,STM32F105xx、STM32F107xx是互联型产品。
  对Flash的写入操作要遵循“先擦除后写入”的原则。
  stm32的内置Flash编程操作都是以页为单位写入的,而写入的操作必须要以32位字或16位半字宽度数据为单位,允许跨页写;写入非字或半字长数据时将导致stm32内部总线错误。
二、程序实现
  flash.h
  1. #ifndef __FLASH_H" O, b9 y/ b: u' n/ M4 Q! i
  2. #define __FLASH_H
    * ?% o6 S0 D; j9 X! ?
  3. #include "stm32f10x.h"% I  g$ \9 t$ |+ C, d$ ~
  4. u8 Write_Flash(u32 *buff, u8 len);, D2 R2 }1 y& n( z( K0 ]* u. E
  5. void Read_Flash(u32 *buff, u8 len);
    . D6 _  ~" d# i7 j. l
  6. void Char_To_Int(unsigned char *buffer, unsigned int *data,unsigned int position);
    1 ?2 i' b, B3 F+ P# D, e7 C! ?
  7. void Int_To_Char(unsigned char * buffer, unsigned int data,unsigned int position);& h( T8 C; e. ~# d/ g
  8. #endif
复制代码

9 r- a) ]: s# k8 I) g, B3 |
  flash.c
  1. #include "flash.h"
      B: `" d# ]- e) V3 c
  2. #include "stm32f10x_it.h". }: S6 W2 _9 c6 z# a+ @
  3. #define WriteFlashAddress    ((u32)0x08010000)//读写起始地址(内部flash的主存储块地址从0x08000000开始)
    - C$ z9 w, i( O1 ?. N" L
  4. & K; ^8 K7 ?7 L: J8 V
  5. /*******************************************************************************
    & q8 q4 m- e, O3 e, ~
  6. * 函数名:Write_Flash2 f- {1 E+ S  d7 r
  7. *描述    :写STM32指定地址的Flash
    # E/ a* L8 Q8 y
  8. *输入    :buff:写入数据缓冲区,len:写入数据长度
    0 I0 W+ W$ D0 V
  9. *输出    :无
    : o; k$ v$ Z) N% \) S* d+ q
  10. *返回值    :u8:写成功返回1,失败返回0$ O& c0 F* j, R& Q$ ?& X/ z
  11. *说明    :无  C! E1 @) \1 i1 i3 s
  12. *******************************************************************************/
    ) W' S& M6 U, y6 V( a
  13. u8 Write_Flash(u32 *buff, u8 len)
    4 I8 E. m- [* B/ a, K8 o8 O
  14. {    0 c# S5 E- ^2 S+ n: S
  15.     volatile FLASH_Status FLASHStatus;5 R$ l& D  a% H! j- A
  16.     u8 k=0;/ ~& h( X3 X4 V# X7 o3 A; F1 y
  17.     u32 Address;" Z( b  k: F; q$ @  c5 x, u
  18. . j5 O5 g1 `) p2 I$ v5 Y9 D
  19.     Address = WriteFlashAddress;
      t9 U% @  Z3 H( U/ m1 {& Q  ]
  20.     FLASHStatus = FLASH_COMPLETE;6 I( H  @" `/ S; G, f: |+ r
  21.     FLASH_Unlock();//解锁
    % z9 K% N: d: D
  22.     FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);//清除所有标志
    . l) X! @8 S2 D
  23.     FLASHStatus = FLASH_ErasePage(WriteFlashAddress);//扇区擦除
    6 ]7 R' _) g0 g0 H% I/ v2 O1 C0 Y* J
  24.     if(FLASHStatus == FLASH_COMPLETE)' }9 X9 V: ?. g6 p( J  F
  25.     {6 S3 g; z3 S) L: r
  26.         for(k=0;(k<len) && (FLASHStatus == FLASH_COMPLETE);k++)
    6 \4 D. ~/ x' m# i. ^
  27.         {$ i& ]9 D& C4 v; V
  28.             FLASHStatus = FLASH_ProgramWord(Address, buff[k]);//写入一个字(32位)的数据入指定地址  R5 Q* h% z$ Y5 e$ g
  29.             Address = Address + 4;//地址偏移4个字节) }& t5 _% Y, @6 g+ G4 ]' ?
  30.         }        
    , ]: \3 y* w0 F# V+ `+ ~
  31.         FLASH_Lock();//重新上锁,防止误写入
    $ H: F( F' r! K/ ^0 l
  32.     }+ ^) n; |, h) Q( A6 C/ R
  33.     else
    ' N6 M% V0 _+ g
  34.     {. C2 r/ Q: L, u- a* L% g
  35.         return 0;
    # T' m1 d* m" ^' j6 |
  36.     }
    3 _8 U. k. C( y9 R/ H
  37.     if(FLASHStatus == FLASH_COMPLETE)
    9 r2 [/ S4 _$ x  f! |2 h9 t0 J
  38.     {0 S4 ]" z0 M7 g) W* D( J9 j$ s8 b! R
  39.         return 1;$ C3 ], ], w& y0 e; N
  40.     }
    4 |8 N0 g# [8 M
  41.     return 0;5 a; b1 b3 A" u/ u$ G' F
  42. }
      ?8 P( F7 P) R$ I3 O$ e1 f
  43. 2 k0 _& a& S; ?8 I4 A
  44. /*******************************************************************************
    6 V2 t' S1 {; j' V, i
  45. * 函数名:Read_Flash
    - l$ d1 a9 i. h, z
  46. *描述    :读STM32指定地址的Flash9 q' `, @6 V# ?- S4 J" _" x3 D
  47. *输入    :buff:读出数据缓冲区,len:读出数据长度( L8 }) k' E" W0 n
  48. *输出    :无
    # B+ J, P, x( d  E, o
  49. *返回值    :无# }6 g% R' ?% K% j1 J# _! \
  50. *说明    :无
    , O/ w. S7 `8 H- s0 [
  51. *******************************************************************************/' k* \" i& q" k; ~" f
  52. void Read_Flash(u32 *buff, u8 len)) [5 U1 z! M. \  V# m# M
  53. {
    ) e" d* |. P# S3 X
  54.     u8 k;1 _4 n( L" D: v+ B
  55.     u32 Address;
    4 o, U5 E, O, Q  `/ X# `) M& ?& O
  56.     1 }% \5 r/ |  H" `/ b5 G: v
  57.     Address = WriteFlashAddress;
    - F6 x$ W! L0 ]$ r8 g8 j* }1 ?
  58.     for(k=0;k<len;k++)' R& H% ?6 j+ h; s3 D( d& z3 E( i
  59.     {
    & E* n+ I6 J' u0 Y0 l1 y
  60.         buff[k] =  (*(vu32*) Address);//读指定地址的一个字的数据$ _) N3 P5 v0 \4 N6 [
  61.         Address += 4;//地址偏移4个字节        
    5 }7 N1 N+ a' }3 \( q3 f
  62.     }
    / h+ v" k" ?* |8 b6 K8 _5 D
  63. }
复制代码
2 T( z4 B) q# p: M7 y" X% }# J
  main.c
  1. int main(void)
    5 E5 c, p1 V6 w$ F0 ?6 p5 F0 c" P; B7 V
  2. {   
    . c/ e+ ]! c0 ^( |
  3.   " P) k4 [$ a) P0 v: D* W
  4.     u32 in_data[5]={11,22,33,44,55};//要写入的数据+ w) y7 Y( {; B* O4 X9 r% v! ^# q
  5.     u32 out_data[5];//读存放
    8 h: A$ U2 W8 q9 e% t0 v
  6.     int i;
    0 [1 o0 |- k) k$ w' H# M9 w9 D
  7.     u8 STATUS=0;8 w: L, Y# e" W
  8.         USART1_Config();//串口1配置
    . @: g" @  V# S( a  N- s7 m* Y
  9.     GPIO_Configuration();//GPIO配置,用于点亮led! g  Z; Y2 M7 U- I- u% o- u
  10.     STATUS=Write_Flash(in_data,5);
    * x9 i( {! b# {
  11.     Delay(0x02FFFF);0 y/ t, p* ~% i7 p5 q
  12.     if(STATUS)4 f8 A; ^% @: ]4 ]/ O+ }+ T
  13.     {1 _! V+ J0 G- m6 i! F
  14.             GPIO_SetBits(GPIOD, GPIO_Pin_13);//点亮led1* p- W9 v4 O: A
  15.             Read_Flash(out_data,5);
    2 t. e  r4 m% I) T2 q
  16.             printf("\r\n The Five Data Is : \r\n");' j. C& B% t! D2 _; j
  17.             for(i=0;i<5;i++)
    , W& q, y- ]+ S; B
  18.             {
    3 D3 {4 G1 ?8 a
  19.                     printf("\r %d \r",out_data[i]);" `6 L! ]" ^# x) Q9 z2 `
  20.             }
      C5 |) {3 y, W# I' O1 w
  21.     }
    - q) }" E, I# R' Q9 D
  22.     while(1);2 \7 x' ?# H9 i! c2 c$ C' Y1 H: }' n
  23. }
复制代码
9 b# e$ _4 _+ k0 ?" q
赞 收藏 评论0 发布时间:2022-1-22 17:26

举报

0个回答

所属标签

相似技术帖

官网相关资源

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