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

【经验分享】如何实现一款简易脱机编程器

[复制链接]
STMCU小助手 发布时间:2022-2-19 19:00
前言
  }# u* D) ?) J" t/ C. @+ g本篇应用笔记为实现一个简易脱机编程器。
1 M2 w. m+ \# b- N2 I* @+ T. T在实际产品的生产与升级过程中,很多的客户都需要有一个简易脱机编程器,该脱机编程器很简单,在没有电脑环境中能够实现修改 MCU 内部 Flash 即可。不需要复杂的其他功能。接口方面也不需要很复杂,只需要支持串口编程即可,最好是不用电池(这样够省电),成本要很低,还有就是携带方便(出差的朋友可以随身携带)等等简单功能……
, A# w. @. s: \) R( O( \# Z其实,ST 提供了一个内部 Boot loader(这里有 UART、SPI、I2C 等等接口,根据不同芯片有其不同接口形式)并发布了一篇介绍内部 Boot loader 的说明文档(AN2606),客户根据这个文档就能自己写一个这样的程序,无论是在 PC 端的还是在 MCU 端。但很多时候,为了加快实现速度,一般都会先咨询 ST 是否可以提供这样一个范例(开源的代码)来给客户做参考。因这个部分是客户的定制化需求,每一个客户对于接口设计、硬件设计、软件设计都有自己的不同需求,所以没有一个范例来参考。本文为了满足广大研发工程师需求,并为给使用 ST MCU 产品的客户一套快速实现该功能的参考范例,我们就以使用 STM32 的芯片来实现一款脱机编程器。
* m3 N+ C& ]3 B2 s' L0 ^+ y通过本文档,您可以了解如何通过 UART 来实现一款简易的脱机编程器,并提供一个范例工程以供大家参考。) B" h( g# Y' W7 l/ V7 J* c, A
注意:其实协议内容都是相通的,只是使用的接口不同而已,所以该工程也可以作为使用其他接口的客户来参考。整体框架如下图所示:
6 ~6 C5 V" U( X6 F ZZ2M(9$T@0$V7S39VG{BX8A.png 6 ^$ s- I* q, c9 V4 x- K8 O( X

6 u- q- y5 Y5 x0 z6 x
/ V5 W' p9 {2 a* L硬件接口连接  \! T8 B8 W+ o$ {/ j
要通过串口来进行编程,此款脱机编程器的串口一定需要引出,简单的三线串口即可(RXD、RXD、GND),因脱机编程器上不带有电池等电源,就需要在目标板上引出工作电源(也就是说,此脱机编程器的电源是在目标板上引出的,在设计目标板的时候就需要考虑引出所需要的电源),加上进入 BOOT 模式所需要的 GPIO 和控制 NREST 的 GPIO,一共是 6 根线:RXD、TXD、GND 、Control_NRST 、VDD(目标板上的工作电压)和Control_BOOT0。具体描述参见下表:$ Q6 Q. J, s# b
* C7 N( Z# c) E: q  K0 B' p
)P{6FP6UT]`$WT3WV0GIVFY.png
% F  p$ `! _1 \9 R. m1 K# k" S) k' J$ W) K7 p) o- f9 U9 Y3 K3 l
1、电源方面只要满足工作电压即可。具体值请参考所选 MCU 的数据手册
4 w) J* x- g! l  B& Z0 k* {提醒:在设计接口的时候,可以再增加一个根线,设计为 7 根线的防止反接接口,这部分请自行设计。如果想使用 STMFlashLoader Demo 软件下载固件到脱机编程器中,建议设计 MCU 的时候,参考下边的原理图来设计最小系统,在此基础之上增加 PA9 和 PA10 的串口接口即可.
) Y5 D; f$ f9 x$ [. c- R1 n
4 Y2 v* N1 h/ g8 E& S2 O' b3 O图一 脱机编程器最小系统原理图
2 [8 q" H6 l4 L- t
. u- `0 e6 E7 l# s3 T1 h 0Z653[9V]YFLNT77KS5T(D1.png
  C" F( ~$ X6 w) H# |1 b
6 e7 Q  c% q4 \8 }本文所涉到的范例程序是基于 Nucleo-F030 这块板子上实现的,其有以下便利条件:
, ]( c! p# A% T& y8 i1、板载 ST-Link,可使用上位机软件 STM32 ST-LINK Utility 软件直接下载目标代码和更新脱机编程器中的固件;
5 l& h. R" G$ u* w6 A2、已经设计了一个用户按键和一个 LED 灯,分别用来实现开始编程命令和显示编程状态 ;' X) s' k1 `5 w1 f5 i* W) a
3、Nucleo 的板子上的 ST-Link 已经实现了虚拟串口的功能,所以也通过这个串口可以打印一些调试信息。
! S. J* `) L$ Z; _8 W$ d' V8 |! C/ f, g: _- @
下表为在 Nucleo-F030 板子上所需要的管脚分配示意图。
3 C9 Z8 A& Z6 g/ O# t
5 i/ `! W% q- v: w# a A%{~_KJHLDV[NNJ[P1_TO7P.png
/ O5 `1 Z: _1 j9 D7 m) T
& |/ q3 |; C7 f B_Q{_(]}~1TJDF6KLGNHI.png " R6 M; V" O. R4 ^- a

% j0 |* |, b; X选择 MCU 建议
" s, j3 w9 V: ]* I因为本着低成本、简单实用的设计原则,所以该脱机编程器中没有增加外扩 Flash,而是采用了MCU 片内的 Flash 来存储所需要下载的代码。电源直接从目标板上引出,节省了 LDO 等电源芯片的成本。推荐使用和目标板上同系列的 MCU 来做这款脱机编程器,这样采购的成本也可以降下来。整个编程器固件的代码大小为 7K 左右,所以只要您的代码目标代码大小是小于所选 MCU 片内 Flash 空间7KB即可。
7 q2 ]" H: v4 q7 T. I2 o# e  G8 Z* X9 J比如 APP 代码大小为 18K 左右,那么您的脱机编程器最小需求的代码空间就是 25KB 左右(18+7=25),您在选型手册上找个 Flash 大于 25KB 的 MCU 即可. 如果您产品使用了不止一款 ST 的MCU,那么你只需要选择一款包含所有代码中最大的那款即可。4 l: p% V, T9 i2 J0 J
$ }3 q3 ~1 X! ~) x/ `
软件设计实现
0 o% K: a8 d8 c1 i" m软件工程的设计是依照 AN3155 这篇文档来做的,更加细节的内容请参考该文档。1 z: E  k  R+ ^
通过本部分的介绍,希望能达到让您快速上手,实现一个 LED 点灯程序的下载与执行的流程,让大家知道如何实现软件部分的功能,并且重点介绍一下如何将这个工程实现到 ST 的其他 MCU 上,这样才使得这款脱机编程器具有通用性。+ b; ~0 c( l( v% q% E5 p9 l6 G, G
备注:编程器固件和目标文件的 Bin 文件都已经提供在 demo 中,也可以直接下载到编程器中进行验证.
/ I* r) n- p7 Q
1 U, e5 `6 N4 N" W. h软件库2 Y! p0 t- r$ [% U- U- c
本软件设计中使用了 STM32Cube/MX 这套目前 ST 最新的库函数,其实现了标准的外设访问接口(API)/生成代码的功能。其特性是非常适合移植,从一款产品很快的移植到另外一款产品中.为了方便具体描述,我们以 STM32F030R8T6 这款 MCU 为例,以 Nucleo-F030 这款 ST 的评估板为硬件基础,来逐步实现这个软件的功能并简单介绍移植方法。
9 H0 P- Z5 v9 k( q7 q2 H
9 ~! e1 C+ T- D0 r, `+ R9 S8 z( f功能实现
- \& i$ ]4 t  b9 {首先,该 demo 软件工程中分为以下几个文件目录:……
$ [& O2 a) S8 J6 y3 w8 T* y
; `8 i' J6 h( Q1 z# Q9 O  [9 n: C0 i- g QFE`NI~_$`(}FYHEOYLIYEB.png 7 w3 B1 V, [: A1 O0 Y' x: Q% T% {0 D5 ~
5 b* |1 e# H$ ]& [1 L
Driver:其中包含了所有的库文件* I( l4 K: x2 l  R2 k
EWARM:IAR 的工程文件
4 _' ~5 S2 o; [& m5 Z/ q7 f$ XMDK-ARM:MDK 的工程文件
* }; Z, v2 e# _( |  f) s$ B/ J$ m0 TInc:源文件的头文件
/ T! r/ @; V) L. V$ n4 H2 XSrc:源文件的 C 文件( C. T$ x7 M: e4 y8 a2 S
.mxproject :这个是 STM32Cube 的配置文件! p3 h$ V! ^' E/ e6 R- N  c! I3 z
demo.ioc:STM32CubeMX 的工程文件
6 x7 `/ A0 u$ d! sdemo.text:配置信息文件
, D. n. @' u/ d3 b$ V# Kdemo.Configuration.pdf:工程报告(也是由 STM32CubeMX 生成)
, _  d. V4 b( g4 ~我们只需要关心 Src 和 Inc 中的源文件即可,其他的代码这里暂时不需要看.% b  _! b9 g+ B2 l
( \8 R7 u0 k$ H/ z8 W2 y
其次,在 STM32CubeMX 中配置自己的工程:……0 A9 g" J4 z. a8 O! E2 v
demo.ioc 这个工程已经是配置过的,所以,如果你的硬件连接和这个 demo 的硬件连接是相同的,那么您可以直接跳转到下一步。如果您的设计中需要需改参数,请参考如下列表:, n. Y6 Q+ G& j& s

9 B% Y. U. B: O" m. j MDTD4HG2S5@V_[MG%]BX634.png 0 i2 H6 w9 `7 T7 T3 R; X
/ n3 @- A; J1 x$ L5 q4 y, @& S
1. 同时这个串口的配置也需要在 STM32Cube 中生成,否则单独修改这个宏定义是无效的3 y$ x1 }( w0 M* Y! F
2. 存储起始地址不能小于 0x08001C00,因前边的代码空间需要给固件预留,如果你增加了其他的功能在固件中,则需要根据实际的代码大小进行预留。4 ]+ i9 }* W" ^! M
   最后,移植后的基本配置:……
8 n4 B6 s. w) j4 X- A2 K' n   如果您的工程和 demo 的硬件连接是相同的,或者已经根据需求做了相应的修改,那么剩下的就是把 demo 中的 main.c 文件替换您自己生成的 main.c 文件之后重新编译即可。. b- l( e4 A- e' a- G. L: V

, _# P5 Y+ k1 u. m3 w" a6 [   如何移植到其他 MCU7 W1 L( y% \0 a5 @
   在本例程中,我们使用的 STM32F030R8T6 这款 MCU,如果是想移植到其他的 MCU 那应该如何去做呢?简单分成以下几个步骤:
# @- A0 h4 u. @6 E$ q   1.在 STM32CubeMX 中直接选择您所使用的 MCU(比如这里我们选择 STM32F070RBT6),选择File > Import Project 之后选择本范例程序中的 demo.ioc 配置文件,如下图所示.- J- }! e, w) ?- L

5 T$ F; ~! |* p# H UKT$~LR2GGIHVG5SUFDEU`V.png % W7 M  u4 C$ R" K4 ]# f

# V( b. J# w2 ^) g" ?! c: U: x Z}6C4AD}REZ4{]{Y(0VY}9U.png
% j$ @5 A, F6 u+ t1 ?3 q4 \+ J! |' _& g2 E3 ?+ v
   之后,demo 中的配置和宏定义就转移到新的工程中了。/ m. Q$ r. b- M: D
! s- k5 d5 S& C# }. V
   如何下载固件文件8 n* |( b1 O9 k
   使用板子上的 ST-link 下载固件是最简单的方式:. S1 G  }. S; Z8 T6 S8 m$ t  v
   1/打开 ST-Link Utility 这个软件$ q# \- D. w9 Y" |! m  [
  s9 i: E8 d0 c1 j
D$V23GI(~$BNB)P[WP}3B8L.png 4 F8 i. \7 ]/ D% f$ N8 ^; K

( r  G+ a% |6 M( N, K   2/点击下图所示图标,如果硬件连接没有问题,就会显示 MCU 内部 Flash 里的内容。
  k/ ]! p' @4 n5 s2 Q3 Q$ l: b! z' x) M$ s
W1OCN)Q[3DJU8G~(HF9~)NA.png
$ a' u# W2 Z: m# y7 V6 g2 ?# h" m/ I$ p
   3/点击 TargetProgram 选项/ X+ {# W7 Z. `- b8 u+ a
  ! \+ [7 [$ E* p- X7 i
YIKKTU7E%UO[`2IDXGI`(FF.png
3 x! z, Z7 M4 v/ v5 r. i2 _: D% K' M4 ~" X) H7 y+ U
   4/首先下载新生成的 Bin 文件,在下图所示的对话框中点击 Browse,找到你的文件,直接点击 Start 开始烧写。
6 L1 F" P& S7 M% [6 t& ~- U
* U+ w; }" E: }: \8 v7 E 0D8ALB6XHL0OH1UMA54CU3L.png & ~" i- q( _5 y% t
0 Y8 v" ?' m; }% ?$ k
   之后使用同样的方式来下载你要烧写到其他 MCU 中的 bin 文件,注意,这里已经将起始地址修改为0x08001C00,这个地址是在程序中定义的存储地址,如果在程序中修改了这个存储地址的话,那么就按照修改之后的地址写在这个地方即可。
8 s2 l& o) G' b- I' ^4 N
1 b% n* c6 f/ Q2 e7 d ]MN_{8VEVYZ[}EK6]YV1PX1.png # }5 b6 u7 P9 P& u

+ B, ^1 z7 s: J: s4 e/ l   好了,到这就完成了所有的操作,可以连接到你的目标上尝试下载 LED 闪灯的功能是否正常了。下边是我使用两个 Nucleo-F030 板子实现的效果:
3 e8 Z! T- ]; f! H: H   左边的为目标板,右边的板子为简易编程器(它的电源来源于目标板)
# Y# I/ g- M" B2 z# Q) H; D4 J0 E" [: H7 ?3 T9 ]( W% p
@HB]42N]9@I@JE~(MN933.png
! h& z6 h- V: u/ J- ]1 L7 ?3 C6 W; i- l, X2 P7 h
   所使用的硬件与软件资源如下表所示:
% z! |9 W) I# b, {$ B& q3 z% ~  o& {+ m" z' ~+ |$ p
2J[G4LV3H0L[$F74FK@%CVP.png . N2 t  c2 U; ?+ ~

/ M! b: F, z( e4 h1 B! f2 d   状态提示
7 W; B/ @, X- n" h  w$ |/ c   在编程的过程中,LED 会显示一般脱机编程器的状态,其状态列表如下:7 `* p( A  n' G8 f) l7 k% P; j/ S. Z
$ z" j% m3 S' A( W
26E6D1BU(J$E}UIDK3H6QA9.png & R' b" X# N' J" O% w* d! {

3 ]( _6 n: b& S   总结
1 W+ T# {, z) s) P- y- o   本文介绍了如何通过串口来实现一个简易的编程器,可供客户在实际现场中使用,或者作为主系统编程辅助系统的参考范例。
2 ~: J0 [: j6 M  X$ N
  ~& R$ C0 ^- p& K4 X2 A' J6 k
赞 收藏 评论0 发布时间:2022-2-19 19:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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