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

基于STM32CUBEME的Flash读写经验分享

[复制链接]
攻城狮Melo 发布时间:2023-4-13 18:39
概述
   本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是STM32F030R8T6,64K大小的Flash。

+ c' ?: u- p  t2 c. e
硬件准备
    首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板:    6 N0 c' O$ m: E) p# m- s) _4 q
/ x4 P& X" x, s% }: A' J; J4 Y
微信图片_20230413183904.jpg

3 h7 B" Y; f# J9 I选择芯片型号
       使用STM32CUBEMX选择芯片stm32f030r8,如下所示:
6 |- q  {8 I8 t! a; h+ ]6 i0 C3 C' R
微信图片_20230413183900.png

  r, W3 v  c8 N/ B
配置时钟源
    HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示:) X' Q( F6 N  x1 _) y
. E+ X, K2 k) B/ t
微信图片_20230413183857.png
配置时钟树
    STM32F0的最高主频到48M,所以配置48即可:5 }6 S4 f5 b! s. A* T% ]
+ A6 M" g( l8 n# N! a/ E+ s
微信图片_20230413183852.png

: Y, O' S, N+ Q4 O% o
" f$ B7 ?. e  P4 u. U串口配置
    本次实验使用的串口1进行串口通信,波特率配置为115200。
8 `. z7 j9 Y# u1 S& M7 B7 o, H

$ F7 T7 h5 U* H# q/ x
微信图片_20230413183849.png
. x3 w4 ^2 z3 I" {
生成工程设置
    注意在生产工程设置中不能出现中文,不然会报错。. f. A' ^* e  i& I& P1 x6 R
7 p% t' B  B9 m0 D9 D2 M: n9 F
微信图片_20230413183846.png
% Z+ G! L7 m; b9 `. Y* z* @7 l7 u
生成代码
  Y, ~" }% z. P( A1 h
微信图片_20230413183843.png

/ z# s3 w8 `2 i0 V/ }. a% H  q
配置keil
微信图片_20230413183841.png

4 y, q+ F. w" p5 w( L
微信图片_20230413183838.png
9 u9 K$ \. ]- T
    在main.c中,添加头文件,若不添加会出现 identifier "FILE" is undefined报错。
  1. /* USER CODE BEGIN Includes */; x+ F5 ]  r/ _* h
  2. #include "stdio.h"* W) O& T' b3 e( l
  3. /* USER CODE END Includes */
复制代码
" p2 V7 @6 h+ V; ]$ l& g9 P
    函数声明和串口重定向:
  1. /* USER CODE BEGIN PV */
    ( q( ?. |7 e1 b2 G# Y
  2. void WriteFlashTest(uint32_t L,uint32_t Data[],uint32_t addr);//flash写函数
    3 j: @3 O2 x+ x" z
  3. void PrintFlashTest(uint32_t L,uint32_t addr);//flash读取
    ! y! i: D% V, c  T( }1 W
  4. #ifdef __GNUC__
    2 E3 E9 A. e& Y+ G  o
  5. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  ~1 \% j% E# x, j! v
  6. #else7 n2 u" w' E! P
  7. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)) v/ ^( S/ u8 @! A1 m
  8. #endif /* __GNUC__ */
    ! Y9 o7 Z, J1 W6 s- _4 `, v: ]

  9. ( ~% S2 T9 v7 u6 i

  10. 8 i5 ~( E% f% ?, ~: ]8 A
  11. int fputc(int ch, FILE *f)
    1 W3 u- G$ v. A$ G) u( @/ e
  12. {$ ]/ p+ ^+ A  ~
  13.     HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1, 0xFFFF);4 V3 O/ z+ U% ?% n; x* g
  14.     return ch;
    + ]% D2 x$ O$ M8 o. D7 }9 I
  15. }
    - b! Z1 H9 m3 G6 f
  16. /* USER CODE END PV */
复制代码
" j3 B' Z5 M$ I# a
    变量定义:
  1. /* USER CODE BEGIN 0 */5 }+ G  F! [* y$ O
  2. uint32_t WriteFlashData[3] = {0x11111111,0x22222222,0x33333333};//数据- I0 T) q2 f/ ]  l6 X% ?
  3. uint32_t addr = 0x08007000;
    * R9 O- H& l. i9 @' ?& h
  4. /* USER CODE END 0 */
复制代码
  
如果要对FLASH进行写入数据,需要执行以下四步:
1. 解锁FLASH
2. 擦除FLASH
3. 写入FLASH
4. 锁住FLASH
擦除只能是按页或者整块擦除。

7 G( E& [6 ]# r: y; J3 t2 D
STM32F030芯片内部的Flash存储器内存分布如下:

" h, a7 t3 {: O& ~! ]
微信图片_20230413183835.png
4 ~* V( W  Q  N; z
    STM32F030R8T6的Flash容量是64KB,所以只有63页,每页1KB。
    我们可以写入到页60中,即0x08007000-0x080073FF中。
    由于单片机是32位,故连续写入多个uint32_t的数据时,地址应该依次增加4。
  1. /* USER CODE BEGIN 4 */
    # q. p6 }" b9 l4 b5 U
  2. - {' `4 s$ ~1 m8 _) {
  3. /*FLASH写入程序*/
    ' n8 _0 H+ \8 Q" m
  4. void WriteFlashTest(uint32_t L,uint32_t Data[],uint32_t addr); o7 P1 `$ o0 r( Z) S! T
  5. {
    " w" Y: i5 I7 U! W" N# r4 `
  6.   uint32_t i=0;
    3 s3 B$ P8 m- w5 G7 p
  7.   /* 1/4解锁FLASH*/
    ! B# s; ?# q1 L4 ^2 ]
  8.   HAL_FLASH_Unlock();2 a( X2 X* O. L0 S+ `3 V
  9.   /* 2/4擦除FLASH*/
    : L+ p+ S8 F, p9 }' B; e% f2 J1 c2 i$ l
  10.   /*初始化FLASH_EraseInitTypeDef*/
    1 Z+ L# o+ W0 k" b6 b; ?( l
  11.   /*擦除方式页擦除FLASH_TYPEERASE_PAGES,块擦除FLASH_TYPEERASE_MASSERASE*/
    / ?" Y, T& T1 Z/ e, M  m
  12.   /*擦除页数*/
    / S8 d' p. q/ H; o; g5 e% q5 I
  13.   /*擦除地址*/
    ! `; ^+ ~  i! N$ ]
  14.   FLASH_EraseInitTypeDef FlashSet;! u0 Q# ?% ^, O4 W' ]% p) @$ z
  15.   FlashSet.TypeErase = FLASH_TYPEERASE_PAGES;" {6 y2 o* u8 G. b7 f9 e/ P
  16.   FlashSet.PageAddress = addr;. h5 j7 k9 b. b* n6 {  U" I; o& x
  17.   FlashSet.NbPages = 1;
    + n9 H& k0 u! ^- {6 O4 l( C1 v( t# l
  18.   /*设置PageError,调用擦除函数*/2 n$ J  F& h! i1 D3 E
  19.   uint32_t PageError = 0;) E# _/ }9 a8 C" u6 M  K
  20.   HAL_FLASHEx_Erase(&FlashSet, &PageError);1 v( x, W1 H6 X  _7 R; v# F5 \
  21.   /* 3/4对FLASH烧写*/$ k6 ^9 r6 {0 b' U
  22.   for(i=0;i<L;i++)* p+ Z4 L+ j' {
  23.   {; X( B. R8 r4 y
  24.     HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr+4*i, Data[i]);
    5 Y+ c: u$ @6 o- b
  25.   }
    3 X/ M  q: Y& p8 c$ L0 \
  26.   /* 4/4锁住FLASH*/; n& E2 }$ ~# z+ w
  27.   HAL_FLASH_Lock();
    ! d4 Q, d8 T4 n
  28. }$ n7 i- ^) E, U! u9 e. h2 _  g
  29. 0 M/ k" O, O7 |" o

  30. 8 j( d* f! n5 Y) Y6 R
  31. /*FLASH读取打印程序*/* V0 [  F' p5 W3 V7 y
  32. void PrintFlashTest(uint32_t L,uint32_t addr)( X6 W/ ^" G% O
  33. {
    5 b9 U$ f8 |; R5 w
  34.   uint32_t i=0;
    # I/ C& p, w( y
  35.   for(i=0;i<L;i++)
    3 B- @. Z; r1 m0 M% `3 T
  36.   {
    . k; |; [4 d, T) a5 m4 h
  37.     printf("\naddr is:0x%x, data is:0x%x", addr+i*4,  *(__IO uint32_t*)(addr+i*4));* T& R) v- C3 r% w
  38.   }
    " W# i. v6 r$ W9 l4 v
  39.   
    / |: [9 G4 I( N: c
  40. }+ o& u2 q7 M* Y" i* f
  41. /* USER CODE END 4 */
复制代码
# _5 ~. Z8 H7 W5 v
   主程序
  1. /* USER CODE BEGIN WHILE */
    $ ^; j' K' b' S7 O9 O! Y$ e1 E
  2.   while (1)
    / S7 j1 J; [* X& K
  3.   {, m1 A0 A5 N9 A- M
  4.     /* USER CODE END WHILE */
    0 ^' l5 O. o; v" ]

  5. , d0 G9 [7 g5 F) H# f
  6.     /* USER CODE BEGIN 3 */   
    8 d  m* p2 u; C) {4 `4 i0 v4 j' e
  7.     WriteFlashTest(3,WriteFlashData,addr);
      c4 h- ?4 Y) S) `7 x) u6 W0 h
  8.     PrintFlashTest(3,addr);
    $ N) k* a; U; d$ a! Z8 e/ ^, v/ y
  9.     HAL_Delay(5000);, U+ d% D; ]: v
  10.   }
    ! z* Q  S4 Z# `0 I; V
  11.   /* USER CODE END 3 */
复制代码
5 D1 L2 K* e( ^& k
演示效果
微信图片_20230413183832.png
+ q$ h+ z8 `, w, ?  Z- ~3 L2 y
' J* e( W$ {3 M
转载自:记帖
/ w# u+ ~9 o  r8 e4 B
如有侵权请联系删除
* r1 d0 y: j5 \3 g5 O9 @" F; t
微信图片_20230413183818.png
收藏 评论0 发布时间:2023-4-13 18:39

举报

0个回答

所属标签

相似技术帖

官网相关资源

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