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

STM32经验分享——FLASH编程详解(1)

[复制链接]
STMCU小助手 发布时间:2022-8-28 21:48
前面说到了单片机的ROM、RAM两块存储的位置和大小,以及简单的变量或函数的存储地址,这时候你应该对单片机的内存有了了解。1 g; w& v9 d  |4 c
4 W( O- U( s5 k9 e2 M7 D
        当你用仿真器下载程序的时候,前面提到的BIN文件的数据(也就是原始的ROM二进制数据,0101那种),会通过下载器0x0800 0000这块内存。之后根据你的下载选项可选自动运行,或者复位再运行。当然也有的同学和我这种穷*一样不舍得买几十块钱甚至更贵的下载器,那么就是使用串口进行下载(也就是ISP),这点和51一样,只不过不需要所谓的冷启动了。对应的引脚是PA9(TXD)、PA10(RXD)。
* E) ^+ f* h/ z2 W1 c9 B
" }3 n3 s! k! T; K1 R6 p* c        你知道其中发生了什么吗?先以下载器为例,此时你的单片机和下载器最少只有3根线,首先是GND,也就是负极,你得共地才能确定0电平。然后是CLK(或者TCK)和DAT(或者叫TMS、DIO),也就是PA14和PA13这俩引脚,和IIC类似,数据和时钟,可读可写,那么你的单片机程序就是通过这个串行总线更新的。因此UP设计电路图一般会预留串口和仿真接口用于调试,像这样。: U/ r# I, `: O; e7 H$ O  [3 x: A

  y2 H5 a0 N) l

& C4 H' C6 [+ x8 y8 K- o: I' e. s, }# S+ y: Y
调试接口

( H$ e& c+ M2 U% ^+ Y& A, h  r: E        那么你如果用的串口更新呢?首先你要保证boot0引脚拉低了再启动,也就是先拉低boot0再复位,这样启动的时候就是boot0为0了,也就是低电平。或者不复位而是按住boot0为低电平直接断电重新上电。然后你就可以用串口更新软件把hex文件发过来了,之后同样的复位重启,运行新程序。虽然过程有点复杂,但是有自动下载电路,可以用串口的DTR和RTS这俩信号协助你控制RST(复位)和boot0,这样就不用你管了。
3 m/ v3 H0 X  L( _
$ZZZ2OQO@`D[7LI`PJ757CK.png

/ b1 k9 E6 w2 L) n5 B* I" K
; j6 P( Y" [8 }1 H
自动下载电路

2 c/ ~) o3 B) ?" ]1 J3 |: ~3 {5 ]# ~        有什么区别呢?仿真器快,对吧。还有就是串口只能下载,仿真器可以仿真,就是一步步运行程序,便于查看效果。我们先从下载方面分析,再说仿真方面。
, u3 o* r$ K) o2 g; t0 N: s2 a% @. k
1 g* j  y& }& }/ {1 \8 R% p        你写过stm32内置flash编程程序,你应该知道,就是那块0x0800 0000的存储器,你除了用来存储你的程序并运行外,你还可以用你的程序去读写它,只要没有碰到你自己的程序那块,不然那就是格式化C盘的效果,你的程序可能就挂了,并且可能再也运行不起来了。但是你也没那么容易直接碰它,因此你还需要解锁,然后才可以操作它。
$ P( ?6 K2 N3 ]) S- [9 J- ~- j
0 M0 F. \1 M; Z6 z5 o# a        那么你下载程序的时候是谁在擦写你的ROM呢?是SWD接口吗?是串口吗?都不是,因为单片机不是24C02,也不是串口EEPROM,那么~~~1 s/ a% I" e( d* N8 q' x
' g1 K" P& {% ^0 M5 B5 M
        没错,单片机里面还在运行着程序,这个程序在干嘛呢?串口更新的时候它在接收串口数据帧、校验数据,为你的串口更新上位机提供单片机ID查询,FLASH读写等服务。上位机通过串口信号(即DTR、RTS,注意不是数据)控制你的开发板的一键下载电路完成boot0的低电平启动(没有自动下载电路的话你就要手动完成这一步了),完成下载(也就是0x0800 0000那块FLASH写BIN文件数据)之后,上位机再次产生复位信号,开始运行新程序。可能你选择的是hex数据,这样不影响你更新新程序,因为他俩存储的数据都是一样的。就像瓜子和瓜子仁一样,瓜子可以解析出来瓜子仁。hex也能解析出来bin文件。所以bin文件更小,hex大一些。
- l/ d4 @# m4 n; w7 p, A! V0 i% N2 Y# }* K
~[O(P_YNJ74L4W1[M$@0S8M.png

4 a3 Q7 v! B$ Y2 y7 Z
0 C4 [9 t! w; C7 I1 S  m& M
BIN、HEX大小比较
: w) U0 _7 I7 Q6 M% i# F& M5 {9 ~
        那么这个程序存在哪?谁写的?怎么启动这个程序的?这个你应该知道,拉低boot0它就启动了,谁写的呢?肯定是单片机厂商了,用户修改不了它。这块区域存在的意义是什么呢?简单来说给我们提供低成本的固件更新方案,不需要昂贵的仿真器。其实这块程序还真不简单,串口其中只是一种方式,你还可以用CAN、USB等等。它在那个位置呢?下图说了,是在系统存储区。更具体的可以查看相关手册。
8 C! C. Y5 t  w$ l
5 q2 O5 g3 M; T  t4 S& e
Q62DSR(6IPZDY9P7QV8RK~Q.png
# k8 d; A; z0 F4 p0 ^3 j/ S9 K

! m- f8 D# n. q# ~; k/ O/ d: O* \
Boot模式

2 e) a1 F3 D+ {" `        在内存地图中你可以产看到系统存储区的地址和范围,然后你就可以算出来大小了,同样的你还可以看到FALSH和SRAM,也就是ROM和RAM的地址及范围,同样可以算出大小。当然这是以F4为例,其他不同的单片机,内存大小可能会不同。7 n3 g7 Q" \- K5 U) y" p

$ T( b7 r; D$ k: ^# e* d
E{79U~XMST_{E6109~46.png

0 |7 g# L: ~( N% V2 j- f+ y3 ^3 e7 ?) y2 U0 [# f
系统存储区地址和范围
$ v" ]# ^- Y6 v& F+ _( N& {& `
        如果你想了解内置的bootloader怎么通过串口实现的,你可以登陆ST官网搜索an3155这个文档查看。9 Q5 a9 c" S8 }5 e5 W$ Y

6 S$ p0 E! ^6 e- ]( O
05~BLY6(TZYS_)AE[PO~GMB.png
" ^0 w9 _  B; ~. u/ o$ e. s

; c6 z* }$ A7 F& N
bootloader协议文档

4 q% H. @6 _9 r0 r' z  `        比如首先检测串口收到0x7F后,确认使用串口作为通信接口。+ q6 {2 n( X1 S+ |7 ?
  ^% o; v3 \8 P' R9 T+ e
3{(5YM1XS8JKJD34YU9[C7W.png

0 u) I7 K  @+ m2 s* }" F7 N) ~0 w/ e! t$ F$ u( _* q
串口更新流程
* ]5 z+ W8 _, r, F8 M  ^6 h
        或者bootloader的版本查询、单片机ID查询以及FLASH擦写等指令。
# `" H4 q2 b2 t, |
) [8 h$ v+ \' ^) T
H))(]3O35FH3`3CEYGA_J_N.png

/ \* M2 R- v9 r+ K$ v
1 H$ z: S, a. N5 |
bootloader指令表

; q  e! r; n% Y3 \5 z7 V3 u4 e# i        单片机还有其它的启动方式,还有boot1引脚。不限于从这块内置的bootloader这里的内存启动。比如还可以从RAM里面启动。9 K; [: W" Y  a3 s: z% {% Z0 D

  {- s. ]5 E9 _) k5 [: `$ `! `        那么,仿真接口呢?仿真接口一般不会控制你的单片机从内置的boot loader那里启动,因为它没法准确控制你的boot0引脚,假如你掰断了呢,你也不一定用了串口。所以~~~- Q8 ^" ~, |1 b1 T, j: m

" l/ y! X4 X( E( W- o5 t: ]        没错用仿真器时跑的另一个程序,不然怎么会做到和内置bootloader一样的FLASH擦除功能?但是这个程序不在0x0800 0000这里,因为这里是要被擦写覆盖掉的,更不在内置的boot loader那块。所以你猜到了在哪里吗?
' Q+ n- B8 A# e' L* N! {0 c
) f' J" p) V& u8 o# x) z        没错,我们还有0x2000 0000这块RAM存储器,RAM也是可以运行程序的,怎么让RAM运行程序呢?要先给RAM写好程序吧,然后呢?从RAM启动即可,或者说执行RAM里面的指令。这里的程序就叫做下载算法。往RAM里面写这个下载算法的接口就是我们的仿真接口,占线最少的那种就是SWD接口。而SWD协议定义了SWD接口的通信规则。通过SWD接口和协议我们就可以往RAM里面写下载算法了。1 A3 J1 l0 N) n) }. E9 j
) S2 S$ w. c/ S
        怎么写呢?你还需要个仿真器,仿真器可以通过单片机的SWD接口连接到单片机的调试单元,然后写下载算法等等。下载算法怎么来的呢?仿真器怎么知道的下载算法呢?仿真器不一定知道下载算法,但是MDK会告诉它,通过USB数据线,所以MDK有下载算法,路径可以通过添加算法,然后找到之前的算法来查看,就是最下面这里。
, r1 O3 \: r) `% u+ {& J6 I0 J1 _  q+ H9 {
G9BCAN2G)@0%_T~RJFLJ{4W.png
; f! C0 _& o. A2 q/ n0 d6 r
6 L$ v2 v1 W8 I  V5 D1 K
MDK下载算法位置

7 S( r2 r. h7 u2 K" v! u        拷贝一下路径你就可以找到下载算法了。2 o5 Z8 J2 H& i8 C. G1 v* X

2 z. B. z+ E( {9 k; d* s  l T{KNWLPVXKGXWASS46$C0D9.png 6 O& @7 S2 R  X" i4 H# w  W
7 e4 K6 K% r4 I3 g) W2 m! u
        这个下载算法就在你安装的pack包里面,安装的时候就解压到这里了。下载选项你也可以知道下载算法存储的地址和大小。就是前面我们说的拷贝到RAM运行的地址。7 J3 ^3 `# E# A# R

0 ^' E. d, \" k5 C. P
@_)13IWKC{_2OTE@{}@K_NX.png

! ~0 p5 h  j' I' D0 m: m2 k
" y, W/ h6 f$ W1 y
下载算法地址
$ ], p% C8 D4 s7 @
        整个过程就是pack包告诉MDK下载算法,MDK通过USB告诉仿真器,仿真器再通过SWD接口(也就是那总共三根线,当然你要保证单片机供电能跑)把下载算法下载到RAM。这时候RAM中的程序也就是下载算法就可以擦写你的FLASH了。还是一样的步骤,MDK把BIN文件通过USB告诉仿真器(当然并不一定要生成BIN文件,只是发送原始ROM数据),仿真器再通过SWD调用RAM中的下载算法把FLASH擦除,然后写MDK发来的BIN数据,最后按需(根据下载选项)复位运行。
9 t: w0 q4 i+ `$ {% ~- d7 B: h1 \! q4 K  M6 ~1 k% f3 i
        是不是比串口还复杂的过程,(不过这一切操作起来还是挺简单的,装好驱动,插好线,有没有一键下载电路都无所谓,MDK配置一下仿真器直接就可以使用了),既然这么复杂还这么贵,为什么还要仿真器,因为它除了下载程序还可以仿真,这是串口下载做不到的。
1 F8 {$ \' ]! J7 j+ b& r/ W9 x; h8 L
        仿真功能还是源于SWD接口,还是源于SWD协议,SWD协议除了写RAM数据外还有其他很多功能,比如我们之前运行时查看0x0800 0000地址处的BIN文件内容。这就是读FLASH,读FLASH本质上还是访问FLASH这里的寄存器,除此外你还可以访问外设的寄存器,帮助你调试程序,查看状态等等。
# y& Z5 {6 A! S* {' X& ~4 L6 k3 [- {8 e* L$ V) Z
        你还可以自己设计下载算法,还是在那个下载算法路径。参考源工程的方式定义FLASH设备信息,编写FLASH编程函数等等。% C$ o- B2 U' c$ _
9 @+ S, W; F, b* A
2PM7HPN$_L41$M{K}5IB4DT.png

/ v. @% I" ?* [! Q  H9 G9 J
$ ]! f: @7 B8 d. K. ~
下载算法工程

- V* |. W+ N. z! a) ]        如果你知道了这个原理,你就可以自己做一个下载器了,把下载算法保存在下载器里面,控制要下载的单片机的SWD接口完成初始化FLASH,写下载算法,写FLASH,校验,复位运行等等。或者参考CMSIS的开源DAP程序 $ f  X" i8 x" t9 `. Z* o0 z
8 o$ b& Y( U, s3 o! f
作者:mymymind , n$ F* E: f9 B- |7 T1 M) `: g
  i' ~3 S: B0 c7 n3 H$ {! |; s
. u6 \2 K' g! s1 W% B
赞 收藏 评论0 发布时间:2022-8-28 21:48

举报

0个回答

所属标签

相似技术帖

官网相关资源

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