打印
[信息]

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

[复制链接]
2973|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 香水城 于 2017-8-12 21:32 编辑

如何实现一款简易脱机编程器
前言
本篇应用笔记为实现一个简易脱机编程器。
在实际产品的生产与升级过程中,很多的客户都需要有一个简易脱机编程器,该脱机编程器很简单,在没有电脑环境中能够实现修改MCU内部Flash即可。不需要复杂的其他功能。接口方面也不需要很复杂,只需要支持串口编程即可,最好是不用电池(这样够省电),成本要很低,还有就是携带方便(出差的朋友可以随身携带)等等简单功能……
其实,ST提供了一个内部Boot loader(这里有UART、SPI、I2C等等接口,根据不同芯片有其不同接口形式)并发布了一篇介绍内部Boot loader的说明文档(AN2606),客户根据这个文档就能自己写一个这样的程序,无论是在PC端的还是在MCU端。但很多时候,为了加快实现速度,一般都会先咨询ST是否可以提供这样一个范例(开源的代码)来给客户做参考。因这个部分是客户的定制化需求,每一个客户对于接口设计、硬件设计、软件设计都有自己的不同需求,所以没有一个范例来参考。本文为了满足广大研发工程师需求,并为给使用ST MCU产品的客户一套快速实现该功能的参考范例,我们就以使用STM32的芯片来实现一款脱机编程器。
通过本文档,您可以了解如何通过UART来实现一款简易的脱机编程器,并提供一个范例工程以供大家参考。
注意:其实协议内容都是相通的,只是使用的接口不同而已,所以该工程也可以作为使用其他接口的客户来参考。
整体框架如下图所示:


硬件接口连接
要通过串口来进行编程,此款脱机编程器的串口一定需要引出,简单的三线串口即可(RXD、RXD、GND),因脱机编程器上不带有电池等电源,就需要在目标板上引出工作电源(也就是说,此脱机编程器的电源是在目标板上引出的,在设计目标板的时候就需要考虑引出所需要的电源),加上进入BOOT模式所需要的GPIO和控制NREST的GPIO,一共是6根线:RXD、TXD、GND 、Control_NRST 、VDD(目标板上的工作电压)和Control_BOOT0。具体描述参见下表:

如果想使用STMFlashLoader Demo软件下载固件到脱机编程器中,建议设计MCU的时候,参考下边的原理图来设计最小系统,在此基础之上增加PA9和PA10 的串口接口即可.
图一 脱机编程器最小系统原理图

本文所涉到的范例程序是基于Nucleo-F030这块板子上实现的,其有以下便利条件:
1、 板载ST-Link,可使用上位机软件STM32 ST-LINK Utility软件直接下载目标代码和更新脱机编程器中的固件;
2、 已经设计了一个用户按键和一个LED灯,分别用来实现开始编程命令和显示编程状态 ;
3、 Nucleo的板子上的ST-Link已经实现了虚拟串口的功能,所以也通过这个串口可以打印一些调试信息。
下表为在Nucleo-F030板子上所需要的管脚分配示意图。




选择MCU建议
因为本着低成本、简单实用的设计原则,所以该脱机编程器中没有增加外扩Flash,而是采用了MCU片内的Flash来存储所需要下载的代码。电源直接从目标板上引出,节省了LDO等电源芯片的成本。推荐使用和目标板上同系列的MCU来做这款脱机编程器,这样采购的成本也可以降下来。整个编程器固件的代码大小为7K左右,所以只要您的代码目标代码大小是小于所选MCU片内Flash空间-7KB即可。
比如APP 代码大小为18K左右,那么您的脱机编程器最小需求的代码空间就是25KB左右(18+7=25),您在选型手册上找个Flash大于25KB的MCU即可. 如果您产品使用了不止一款ST的MCU,那么你只需要选择一款包含所有代码中最大的那款即可。

软件设计实现
软件工程的设计是依照AN3155这篇文档来做的,更加细节的内容请参考该文档。
通过本部分的介绍,希望能达到让您快速上手,实现一个LED点灯程序的下载与执行的流程,让大家知道如何实现软件部分的功能,并且重点介绍一下如何将这个工程实现到ST的其他MCU上,这样才使得这款脱机编程器具有通用性。
备注:编程器固件和目标文件的Bin文件都已经提供在demo中,也可以直接下载到编程器中进行验证.

软件库
本软件设计中使用了STM32Cube/MX这套目前ST最新的库函数,其实现了标准的外设访问接口(API)/生成代码的功能。其特性是非常适合移植,从一款产品很快的移植到另外一款产品中.
为了方便具体描述,我们以STM32F030R8T6这款MCU为例,以Nucleo-F030这款ST的评估板为硬件基础,来逐步实现这个软件的功能并简单介绍移植方法。

功能实现
首先,该demo软件工程中分为以下几个文件目录:……

Driver:其中包含了所有的库文件
EWARM:IAR的工程文件
MDK-ARM:MDK的工程文件
Inc:源文件的头文件
Src:源文件的C文件
.mxproject :这个是STM32Cube的配置文件
demo.ioc:STM32CubeMX的工程文件
demo.text:配置信息文件
demo.Configuration.pdf:工程报告(也是由STM32CubeMX生成)
我们只需要关心Src和Inc中的源文件即可,其他的代码这里暂时不需要看.
其次,在STM32CubeMX中配置自己的工程:……
demo.ioc这个工程已经是配置过的,所以,如果你的硬件连接和这个demo的硬件连接是相同的,那么您可以直接跳转到下一步。如果您的设计中需要需改参数,请参考如下列表:

最后,移植后的基本配置:……
如果您的工程和demo的硬件连接是相同的,或者已经根据需求做了相应的修改,那么剩下的就是把demo中的main.c文件替换您自己生成的main.c文件之后重新编译即可。

如何移植到其他MCU
在本例程中,我们使用的STM32F030R8T6这款MCU,如果是想移植到其他的MCU那应该如何去做呢?简单分成以下几个步骤:
1.在STM32CubeMX中直接选择您所使用的MCU(比如这里我们选择STM32F070RBT6),选择File > Import Project之后选择本范例程序中的demo.ioc配置文件,如下图所示.


之后,demo中的配置和宏定义就转移到新的工程中了。

如何下载固件文件
使用板子上的ST-link下载固件是最简单的方式:
1/打开ST-Link Utility这个软件

2/点击下图所示图标,如果硬件连接没有问题,就会显示MCU内部Flash里的内容。

3/点击TargetProgram选项

4/首先下载新生成的Bin文件,在下图所示的对话框中点击Browse,找到你的文件,直接点击Start开始烧写。

之后使用同样的方式来下载你要烧写到其他MCU中的bin文件,注意,这里已经将起始地址修改为0x08001C00,这个地址是在程序中定义的存储地址,如果在程序中修改了这个存储地址的话,那么就按照修改之后的地址写在这个地方即可。

好了,到这就完成了所有的操作,可以连接到你的目标上尝试下载LED闪灯的功能是否正常了。
下边是我使用两个Nucleo-F030板子实现的效果:
左边的为目标板,右边的板子为简易编程器(它的电源来源于目标板)

所使用的硬件与软件资源如下表所示:


状态提示
在编程的过程中,LED会显示一般脱机编程器的状态,其状态列表如下:


总结
本文介绍了如何通过串口来实现一个简易的编程器,可供客户在实际现场中使用,或者作为主系统编程辅助系统的参考范例。

相关文档链接
AN3155 http://www.stmcu.com.cn/designDownload.html?index=176
AN2606 http://www.stmcu.com.cn/designDownload.html?index=2138

对应PDF和代码:如何通过STM32的串口实现简易脱机编程器
更多实战经验请看:【ST MCU实战经验汇总贴】

沙发
airwill| | 2015-12-25 19:51 | 只看该作者
嗯, 这个设计其实主要的问题就是实现 ISP 的通信协议部分.

使用特权

评论回复
板凳
zhuotuzi| | 2015-12-25 21:36 | 只看该作者
编程的协议有吗,分享一下了。

使用特权

评论回复
地板
yiyigirl2014| | 2015-12-25 22:42 | 只看该作者
用cube做串口的时候,怎么出现4个PIN点亮,其中两个是RX、TX,另外两个是干啥用的?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:STM32技术专家

596

主题

17099

帖子

287

粉丝