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

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

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

" ^+ K1 [! U0 [9 |- ]5 s9 f0 s& h( `5 n+ t6 b: k- `
硬件接口连接8 O) T& U# N% t/ B, a- J
要通过串口来进行编程,此款脱机编程器的串口一定需要引出,简单的三线串口即可(RXD、RXD、GND),因脱机编程器上不带有电池等电源,就需要在目标板上引出工作电源(也就是说,此脱机编程器的电源是在目标板上引出的,在设计目标板的时候就需要考虑引出所需要的电源),加上进入 BOOT 模式所需要的 GPIO 和控制 NREST 的 GPIO,一共是 6 根线:RXD、TXD、GND 、Control_NRST 、VDD(目标板上的工作电压)和Control_BOOT0。具体描述参见下表:
8 h, J# y8 L' H  O4 M  |
+ ?0 j# X7 f* R4 I1 b; J )P{6FP6UT]`$WT3WV0GIVFY.png , B% S1 y5 C5 _6 G
, y! U% [" I* R' J1 c1 x
1、电源方面只要满足工作电压即可。具体值请参考所选 MCU 的数据手册
( P9 O3 ?/ Y' O& s提醒:在设计接口的时候,可以再增加一个根线,设计为 7 根线的防止反接接口,这部分请自行设计。如果想使用 STMFlashLoader Demo 软件下载固件到脱机编程器中,建议设计 MCU 的时候,参考下边的原理图来设计最小系统,在此基础之上增加 PA9 和 PA10 的串口接口即可.1 A/ {. W  E4 ^. m3 C
. |7 W5 n" g1 X6 A
图一 脱机编程器最小系统原理图( N. N7 ]0 Y# T) q9 V8 j
2 U7 L: f0 d* w, r! C+ k
0Z653[9V]YFLNT77KS5T(D1.png , Y1 }" l* Y6 ?4 g/ O2 h( u

2 u- h) Q. E' {% g/ F, y本文所涉到的范例程序是基于 Nucleo-F030 这块板子上实现的,其有以下便利条件:
9 t, _' d: U/ o( k0 n7 N% h1、板载 ST-Link,可使用上位机软件 STM32 ST-LINK Utility 软件直接下载目标代码和更新脱机编程器中的固件;
: a* ]# ]! ?9 j: ?6 g5 s/ q0 {2、已经设计了一个用户按键和一个 LED 灯,分别用来实现开始编程命令和显示编程状态 ;
& X& N7 r. i0 U3、Nucleo 的板子上的 ST-Link 已经实现了虚拟串口的功能,所以也通过这个串口可以打印一些调试信息。" o4 B/ `7 i! i) V- G
+ {* W! `$ t3 [% m* F: o
下表为在 Nucleo-F030 板子上所需要的管脚分配示意图。# p  c  z0 B$ V4 \& E  G! j% l& L

, o" m, O' ]4 W- C6 Z  E/ J A%{~_KJHLDV[NNJ[P1_TO7P.png ( V, t. R' r/ `8 p$ _% T/ w

6 `3 j9 H+ e- n# M B_Q{_(]}~1TJDF6KLGNHI.png
: z  z! p1 ^, G  `$ {9 s% l+ z1 X0 m5 d) v3 N. _
选择 MCU 建议1 ^3 ?3 p! b, p" [# o- J: Z
因为本着低成本、简单实用的设计原则,所以该脱机编程器中没有增加外扩 Flash,而是采用了MCU 片内的 Flash 来存储所需要下载的代码。电源直接从目标板上引出,节省了 LDO 等电源芯片的成本。推荐使用和目标板上同系列的 MCU 来做这款脱机编程器,这样采购的成本也可以降下来。整个编程器固件的代码大小为 7K 左右,所以只要您的代码目标代码大小是小于所选 MCU 片内 Flash 空间7KB即可。3 T( Y. ~4 S; ^9 \: T* b
比如 APP 代码大小为 18K 左右,那么您的脱机编程器最小需求的代码空间就是 25KB 左右(18+7=25),您在选型手册上找个 Flash 大于 25KB 的 MCU 即可. 如果您产品使用了不止一款 ST 的MCU,那么你只需要选择一款包含所有代码中最大的那款即可。5 m3 O) B" \: |4 G
7 O. k/ e. k9 R+ _; b3 a& E
软件设计实现
* d: k1 S3 o  z3 a( Z9 x软件工程的设计是依照 AN3155 这篇文档来做的,更加细节的内容请参考该文档。# o2 N4 z: v  {; _# K
通过本部分的介绍,希望能达到让您快速上手,实现一个 LED 点灯程序的下载与执行的流程,让大家知道如何实现软件部分的功能,并且重点介绍一下如何将这个工程实现到 ST 的其他 MCU 上,这样才使得这款脱机编程器具有通用性。
  }" c8 m; n& i# p8 T: A' ^备注:编程器固件和目标文件的 Bin 文件都已经提供在 demo 中,也可以直接下载到编程器中进行验证.+ `3 ^1 R2 T3 {( C& @/ e. ^8 b

9 j( d4 a1 ^0 D软件库
3 X: Z3 ?7 _1 [9 ~本软件设计中使用了 STM32Cube/MX 这套目前 ST 最新的库函数,其实现了标准的外设访问接口(API)/生成代码的功能。其特性是非常适合移植,从一款产品很快的移植到另外一款产品中.为了方便具体描述,我们以 STM32F030R8T6 这款 MCU 为例,以 Nucleo-F030 这款 ST 的评估板为硬件基础,来逐步实现这个软件的功能并简单介绍移植方法。
/ H( G( s  q8 q& U& D
6 ?( q0 c7 u. y6 u. x功能实现
* m) O4 z9 \% H7 a" }5 v首先,该 demo 软件工程中分为以下几个文件目录:……
) l  e- t3 p5 V* ], n
. x9 G( U) K! ? QFE`NI~_$`(}FYHEOYLIYEB.png ' r& o/ v/ y2 @$ m5 k# v& S( O
- U: `  d* z9 p% x2 q4 v
Driver:其中包含了所有的库文件
5 ~  k5 G$ o( N1 @  i! k$ D; J+ nEWARM:IAR 的工程文件
) U$ `6 C1 _3 v* FMDK-ARM:MDK 的工程文件
) {6 ~1 y% m2 |# F3 Y0 ]Inc:源文件的头文件
; l4 W9 p$ x4 I0 h- s' i& _Src:源文件的 C 文件/ b) o' T, [. x, S
.mxproject :这个是 STM32Cube 的配置文件$ L- Q( H+ C' F
demo.ioc:STM32CubeMX 的工程文件/ `4 Y$ M8 t0 K+ o5 I8 C6 w
demo.text:配置信息文件, r  h2 {( |0 K3 l4 }0 Y
demo.Configuration.pdf:工程报告(也是由 STM32CubeMX 生成)3 w/ j. O  E7 @  P, |: I0 F9 I0 c! {
我们只需要关心 Src 和 Inc 中的源文件即可,其他的代码这里暂时不需要看.
; e9 `# B! K! j4 z7 J& |; Y0 W. R" ~
, F  y. s" w% H" H0 q/ P% o$ |其次,在 STM32CubeMX 中配置自己的工程:……: `  s& G3 l( M, u. B* M
demo.ioc 这个工程已经是配置过的,所以,如果你的硬件连接和这个 demo 的硬件连接是相同的,那么您可以直接跳转到下一步。如果您的设计中需要需改参数,请参考如下列表:
# S$ o+ Q, \5 C( C7 a" s4 c
  v( u' G8 ?7 J0 ? MDTD4HG2S5@V_[MG%]BX634.png
9 J0 I9 y9 Y; Q6 [2 g; I" O4 O6 m4 D) o; q; y
1. 同时这个串口的配置也需要在 STM32Cube 中生成,否则单独修改这个宏定义是无效的3 X, W' J( G% j
2. 存储起始地址不能小于 0x08001C00,因前边的代码空间需要给固件预留,如果你增加了其他的功能在固件中,则需要根据实际的代码大小进行预留。6 X, k* {! u2 Z
   最后,移植后的基本配置:……
3 U: C' w' N2 a* }& M& }6 _   如果您的工程和 demo 的硬件连接是相同的,或者已经根据需求做了相应的修改,那么剩下的就是把 demo 中的 main.c 文件替换您自己生成的 main.c 文件之后重新编译即可。
! Y" t9 d6 x4 |* D
, E4 p/ o: q5 j( f2 k   如何移植到其他 MCU7 @/ f" [0 p8 t" m! v
   在本例程中,我们使用的 STM32F030R8T6 这款 MCU,如果是想移植到其他的 MCU 那应该如何去做呢?简单分成以下几个步骤:/ y+ g2 h& O* a# u
   1.在 STM32CubeMX 中直接选择您所使用的 MCU(比如这里我们选择 STM32F070RBT6),选择File > Import Project 之后选择本范例程序中的 demo.ioc 配置文件,如下图所示.) O9 M! ~) Z9 ?

5 n+ N- g2 r1 X5 H UKT$~LR2GGIHVG5SUFDEU`V.png 2 Z0 B/ }0 a. J) i! P% ]; P( ]

9 z+ `7 L2 R* B3 k9 u Z}6C4AD}REZ4{]{Y(0VY}9U.png
6 a! H. E- k' _( n/ H; X9 v7 T& g4 d. m/ E3 z0 v5 u' ?3 |
   之后,demo 中的配置和宏定义就转移到新的工程中了。" }+ Z0 ]% ^4 ], Y" q5 Z) l' _

( E5 ^/ N# s# ^1 N4 m( L0 V   如何下载固件文件; z' {, P( s. |/ ^/ w. s# n, @
   使用板子上的 ST-link 下载固件是最简单的方式:5 Y3 l+ z+ h- V! S0 E/ O
   1/打开 ST-Link Utility 这个软件
) b! q% s, u# j4 k  l# T( a7 `4 C
5 D9 K' n& e$ x D$V23GI(~$BNB)P[WP}3B8L.png - K' a' W2 k: m6 r
# x3 T' k' ?4 M: X5 y) W
   2/点击下图所示图标,如果硬件连接没有问题,就会显示 MCU 内部 Flash 里的内容。
7 K2 ?- f0 i4 A7 d  X0 c3 K+ x" `
% ~7 S" F% R" R( B W1OCN)Q[3DJU8G~(HF9~)NA.png
) V+ E- o) l( t9 S) @/ w: E3 X6 }- G& L  c
   3/点击 TargetProgram 选项
' B0 K: k) L; h' `  5 o( _$ N. ^7 k0 ]+ n9 b* Q, Y
YIKKTU7E%UO[`2IDXGI`(FF.png
: s( g7 S1 X  P0 T" {
7 K+ t# ~7 r- D# U, r& y! O   4/首先下载新生成的 Bin 文件,在下图所示的对话框中点击 Browse,找到你的文件,直接点击 Start 开始烧写。
/ P# [  ~4 c) ]6 \! w# @9 n7 [! h& G0 K3 n
0D8ALB6XHL0OH1UMA54CU3L.png
+ \3 O) E4 S+ k' U9 x. Y( o9 b
' a: h1 H+ j. {; w   之后使用同样的方式来下载你要烧写到其他 MCU 中的 bin 文件,注意,这里已经将起始地址修改为0x08001C00,这个地址是在程序中定义的存储地址,如果在程序中修改了这个存储地址的话,那么就按照修改之后的地址写在这个地方即可。
$ X) v0 O" q7 k7 \! E
: f: E3 y! n/ E ]MN_{8VEVYZ[}EK6]YV1PX1.png
* s6 d" Q. A5 \! w8 e& ]4 }- Q! z  r% L
   好了,到这就完成了所有的操作,可以连接到你的目标上尝试下载 LED 闪灯的功能是否正常了。下边是我使用两个 Nucleo-F030 板子实现的效果:$ }/ A) t  o5 {6 l& l: b
   左边的为目标板,右边的板子为简易编程器(它的电源来源于目标板)% @* O* U: ]: {: Y, _9 h  V) p

5 j% |# u% h1 ~: [ @HB]42N]9@I@JE~(MN933.png
) j" W; b% h7 T/ b: n+ x
% n% J( J& J: S& ~) l/ G   所使用的硬件与软件资源如下表所示:
" y4 F' G  O1 K; I
* r. [  c( ~* n7 |/ j 2J[G4LV3H0L[$F74FK@%CVP.png 7 P& g0 g' H7 h  L5 `1 S
0 i, a! `- U3 H5 l$ g) s$ ~8 h
   状态提示
4 S1 O% ~* ~9 _, X   在编程的过程中,LED 会显示一般脱机编程器的状态,其状态列表如下:
1 i( \1 f: Y6 Y- h5 o* I
+ A+ l% z6 r* P7 _; b 26E6D1BU(J$E}UIDK3H6QA9.png
: g2 a! ^& E# ]) v# c& G; [; D; A. S$ |2 S  ]8 R. J0 n1 Q8 M
   总结
: K/ D8 e6 q8 C# h* x! @   本文介绍了如何通过串口来实现一个简易的编程器,可供客户在实际现场中使用,或者作为主系统编程辅助系统的参考范例。" {1 J" {* Y; Z$ `

* h4 d! v# i- X; l
收藏 评论0 发布时间:2022-2-19 19:00

举报

0个回答

所属标签

相似分享

官网相关资源

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