STM32F10x一键串口下载的电路设计与调试
2018-05-16
(深圳技师学院 电子信息技术系,深圳 518052)
引 言
传统的8/16位单片机因其有限的性能和简单的内部外设模块,使得其在设计一些功能稍显复杂的电子产品时显得捉襟见肘。而大多数32位处理器又因为其高功耗、高成本、复杂的开发应用环境限制了它在低端电子产品中的使用。因此基于ARM Cortex-M内核的32位嵌入式处理器应运而生,Cortex-M内核是ARM公司针对一些对成本比较敏感的低端嵌入式应用而专门开发的ARM处理器内核。
行业中基于Cortex-M内核的ARM处理器多如牛毛,这其中又以ST公司开发的基于Cortex-M3内核的STM32F10x系列处理器为其中的翘楚。STM32F10x系列处理器因其高性能(主频达到72 MHz,同类产品性能最高)、低功耗、完善的器件软件库和开发工具链以及简单的硬件应用环境(如芯片无BGA封装等)使得其作为32得到广泛应用。
STM32F10x系列处理器通常情况下有两种方式来下载程序到芯片内部的主闪存存储器中:一种是外接专用的ARM仿真器(如J-LINK仿真器等)通过芯片的JTAG接口将用户编写的应用程序下载到芯片内部的主闪存存储器,另一种是通过芯片的ISP接口将用户编写的应用程序下载到芯片内部的主闪存存储器,不需要外接专用的ARM仿真器。
可以看出,采用ISP方式来下载程序时,成本远低于采用仿真器的方式下载程序。但是由于采用ISP方式下载程序需要用到芯片出厂时固化在芯片内部的Bootloader程序,下载完用户的应用程序后又需要芯片重新上电且需立即切换到去执行用户的应用程序,因此芯片通常需要通过跳线的方式在这两者之间进行转换,这给用户的应用带来了极大的不便。
鉴于此,本文设计了一种实用的STM32F10x系列处理器一键串口下载电路,运行调试PC机上的MCU-ISP软件将用户的应用程序下载到芯片内部的主闪存存储器后,马上就能运行用户的应用程序,从而极大地减少采用此芯片时的开发时间成本和生产成本。
1 STM32F10x系列处理器串行下载的工作原理
STM32F10x系列处理器在使用上极其方便。除了性能和内部功能模块都较传统的单片机有很大的提升和扩展外,STM32F10x系列处理器在片内程序的加载和调试上都提供了丰富的手段。STM32F10x系列处理器除了可以通过JTAG(联合测试行动组)协议接口在线下载程序和仿真程序外,还提供多种串行接口(UART、USB、CAN等)下载程序到芯片内部的闪存中。STM32F10x系列处理器通过JTAG接口下载程序时必须采用专门的仿真器(如JLINK仿真器等)来下载程序,因此提高了产品的开发成本和生产成本。在很多场合基于STM32F10x系列处理器的嵌入式电子系统通常采用串行ISP(in-system programming 在线系统编程)方式来加载程序。
图1是STM32F10x处理器,采用UART(异步串行通信接口,俗称232接口)下载程序的硬件接口连接图。STM32F10x处理器的UART接口外接232转换芯片,232转换芯片再连接到单板的232串行接口插座。PC主机的232串行接口插座和单板的232串行接口插座再通过线缆连接。
图1 STM32F10x处理器 ISP(UART接口)方式下载程序硬件接口连接图
PC主机上运行ISP软件,STM32F10x处理器上电后自动运行芯片出厂前烧写到芯片内部系统存储器中的Bootloader程序。芯片内部的Bootloader程序和PC机上的MCU-ISP程序通过专门的串口通信协议将用户编写的应用程序下载到芯片内部的闪存中。
2 一键串口下载电路的设计与工作原理分析
通常STM32F10x系列处理器是通过专用硬件配置引脚(BOOT1和BOOT0)的设置来确定处理器内部程序的启动方式。
表1为STM32F10x系列处理器启动硬件配置表。
表1 STM32F10x系列处理器启动硬件配置表
当BOOT1=x、BOOT0=0时,系统上电后,处理器从主闪存存储器启动运行程序,这是正常的工作模式;当BOOT1=0、BOOT0=1时,系统上电后,处理器从系统存储器启动运行程序,系统存储器中的程序一般都是芯片出厂前由厂家写入的Bootloader程序;当BOOT1=1、BOOT0=1时,系统上电后,处理器从从内置SRAM启动,这种模式主要用于调试程序。
从这里可以看出,当系统要通过串口来下载程序时,必须首先将BOOT1设置为0(低电平)、BOOT0设置为1(高电平),这样芯片上电后首先运行芯片出厂前由厂家写入的Bootloader程序。芯片内部的Bootloader程序和PC机上正在运行的MCU-ISP程序之间通过专门的串口通信接口连接好后,就可将用户编写的应用程序下载到芯片内部的主闪存存储器中。下载应用程序到芯片内部的主闪存存储器后,如果要测试下载的应用程序的运行结果,就必须要重新将BOOT0设置为0(高电平),然后系统再重新上电运行。系统再重新上电运行后就能执行主闪存存储器中的应用程序了。在系统软件调试过程中,为了下载应用程序和观察应用程序的执行效果,就需要不断地将BOOT0在高低电平之间进行切换,这给应用程序的调试和开发带来了很大的不便。
图2为一种实用的一键串行下载电路的原理图。除此电路外,系统还需要将STM32F10x芯片的BOOT1引脚固定拉低,即将BOOT1信号永远设置为低电平。
该电路是通过CH340来实现下载功能。CH340是一款USB总线转换芯片,它完成USB和UART之间协议转换的功能。采用该芯片的原因主要有两个:一是在目前主流的PC主机中基本不再提供RS232异步串行通信接口,要实现STM32F10x芯片程序的下载必须通过USB接口才能连接,因此必须在单板上直接提供这种USB和UART协议之间的转换电路;另外也可以通过MCU-ISP软件操作芯片的RTS(数据发送请求)和DTR(数据接收请求)两个引脚,方便地实现一键下载程序的功能。
图2 一键串行下载电路原理图
CH340的第16脚和第1脚分别是芯片的电源信号引脚和地信号引脚,分别接单片机的电源信号和地信号。第7脚和第8脚是芯片的12 MHz晶振输入和输出引脚。第5脚和第6脚是USB差分信号引脚,直接连接到单片机的USB插座上。第4脚为电源滤波引脚,当芯片5 V电源供电时,该引脚需外接0.01 μF的退耦电容;当芯片由3.3 V电源供电时,该引脚需外接电源信号,因此在电路设计时需做兼容设计。芯片的第14脚为RTS(数据发送请求)信号,通过外接一个三极管组成的控制电路来控制STM32F10x芯片的BOOT0信号,当RTS信号输出为高时,BOOT0为低电平,当RTS信号输出为低时,BOOT0为高电平。芯片的第13脚为DTR(数据接收请求)信号,通过外接一个三极管组成的控制电路来控制STM32F10x芯片的复位信号(NRST),当DTR信号输出为高时,NRST为低电平,当DTR信号输出为低时,NRST为高电平。
其中BOOT0信号连接到STM32F10x芯片的启动配置引脚(第138脚),NRST复位信号直接连接到STM32F10x芯片的复位引脚(第25脚)。CH340的第2脚和第3脚分别为串行数据输出和输入脚,分别连接到STM32F10x芯片的第一路串行数据输入(102)和输出(101)脚。RTS信号和DTR信号的高低变化是受PC机上的MCU-ISP软件来控制的。
图3为一键串行下载电路关键信号波形图。
如图3所示,DTR#信号和RST#信号为一对相反信号,RTS#信号和BOOT0信号为一对相反信号。当DTR#信号和RTS#信号为高电平时,RST#和BOOT0为低电平信号;反之,当DTR#信号和RTS#信号为低电平时,RST#和BOOT0为高电平信号。
图3 一键串行下载电路关键信号波形图
当需要下载程序到STM32F10x芯片的时候,首先通过MCU-ISP软件控制DTR#输出高电平,通过三极管控制TP2使得STM32F10x芯片的复位信号RST#为低。控制复位时间大约为100 ms。100 ms后,RST#信号恢复正常,STM32F10x芯片进入正常启动状态。同时,由于此时RTS#为低,控制TP1使得BOOT0信号为高,另外系统电路已将BOOT1信号固定设置为低,这样STM32F10x芯片在正常启动状态下就同时采样到BOOT1为低电平,BOOT0为高电平,STM32F10x芯片将从系统存储器启动。由于STM32F10x芯片在出厂前已将Bootloader程序烧写到系统存储器中,此时STM32F10x芯片将开始运行Bootloader程序,进入加载程序的模式下。STM32F10x芯片通过串行通信接口准备开始加载应用程序,由于串行通信接口的发送脚TXD和接收脚RXD接到CH340上,经过CH340完成串行通信接口和USB接口协议的转换后,再通过电脑上的MCU-ISP软件设置后,就可以将电脑上需要下载的应用程序下载到STM32F10x芯片主闪存存储器中。
程序下载完成后,MCU-ISP软件再次控制DTR#输出高电平,通过三极管控制TP2使得STM32F10x芯片的复位信号RST#为低。同时控制RTS#输出高电平,通过三极管控制TP1使得BOOT0信号为低。由于RST#为低,系统再次进入复位状态,复位时间大约为100 ms。100 ms后,RST#信号恢复正常,STM32F10x芯片进入正常启动状态,由于此时BOOT0信号为低,BOOT1信号也为低,此时系统将主闪存存储器启动。主闪存存储器此时已经下载了新的应用程序,因此系统实际上开始运行此应用程序。
通过上面两个步骤,整个电路实现了下载应用程序并且下载完成后自动运行此程序的一键串行下载的功能。整个过程不是通过硬件跳线而是通过软件的方式来实现程序的自动下载和运行,方便了STM32F10x系统应用程序的调试和测试,从而大大提高了STM32F10x系统的开发效率。
3 一键串口下载电路的调试
在调试一键串行下载电路时,除了要保证一键串行电路本身没问题之外,还需要确保STM32F10x最小系统硬件电路都正常。这样再通过安装在电脑上的MCUicd-ISP软件才能正常地将程序下载到STM32F10x芯片。下面分别说明两部分电路的调试步骤和方法。
3.1 STM32F10x最小系统硬件电路的调试
同其它的嵌入式处理器系统一样,要保证STM32F10x最小系统硬件电路正常运行,就必须从以下几个方面来加以测试和调试:
① 电源信号。
我们以STM32F103ZET6为例来说明STM32F10x最小系统电源部分电路的调试步骤。STM32F103ZET6采用3.3 V供电,首先用万用表测量电源模块输出的3.3 V电源信号正常,同时令示波器3.3 V电源信号的纹波不要超标(3.3V±5%)。然后测量STM32F103ZET6的电源引脚(17、52、39、62、72、84、95、108、121、131、144、31、33)上3.3 V电源信号都正常。
② 复位信号。
STM32F103ZET6的复位引脚为第25脚且低电平有效。所以在STM32F103ZET6正常工作时,一定要保证复位引脚的信号为高电平。用万用表测量第25引脚,确保正常工作时此引脚信号为高电平。
③ 时钟信号。
STM32F103ZET6的时钟电路主要包括一个高速外部时钟和振荡电路以及一个低速外部时钟和振荡电路。高速外部时钟和振荡电路提供的时钟信号供CPU内部高速的系统时钟来使用,低速外部时钟和振荡电路提供的时钟信号供CPU内部实时时钟和其他定时功能提供一个低功耗且精确的时钟源。在STM32F103ZET6未下载初始化程序之前,芯片内部的系统时钟由内部RC振荡电路来提供。因此此时用示波器去测量这两对时钟信号输入脚(8和9、23和24)的信号,将测不到振荡的时钟信号,但并不代表此时芯片没有正常工作。
④ JTAG接口电路。
STM32F10x芯片提供的JTAG接口电路除了实现对内部电路的测试外,还可以实现对STM32F10x芯片进行程序的仿真和下载。也就是说STM32F10x芯片可以采用接口来进行程序的下载,一种是本文所述的ISP方式,一种是JTAG方式。JTAG接口主要包括TCK、TDO、TDI、TMS、TRST等引脚。如果这些引脚设置不当的话,将会使STM32F10x芯片处于不正常的工作状态,从而影响STM32F10x芯片的ISP功能的实现。因此在进行STM32F10x芯片在线下载调试前,必须用万用表测量这几个引脚是否处于正常的电平信号。要保证TDO、TDI、TMS、TRST等引脚处于高电平,TCK处于低电平的状态。
上述4部分电路的信号都正常,才能保证STM32F10x最小系统硬件电路处于正常工作状态。
3.2 一键串行下载电路的调试
一键串行下载电路的参考电路如图2所示。首先保证CH340的电源引脚16是否有5 V信号,再确保CH340的辅助电源引脚V3是否正确连接了容量为0.01 μF的退耦电容(注意V3在CH340外接3.3 V电源信号时也需连接到3.3 V的电源信号,与5 V供电时不同)。然后用示波器测量时钟输入引脚7、8是否是时钟振荡信号。
信号测量正常后再用USB接口线将单板上的USB接口连接到电脑的USB接口上。打开电脑的“设备管理器”的“端口(COM和LPT)”中将搜索到CH340串口接口,此时表示CH340已经正常工作。
用基于CH340芯片制作的USB接口转串口的连接线(市面上有销售)连接PC机和待调试单板。然后再在PC机上运行MCU-ISP软件,选择芯片类型为“STM32F10x series”,选择串口号为电脑“设备管理器”所识别到的串口号,选中要下载的程序文件,点击“程序下载”,此时程序就可以顺利地下载到单板的芯片上了。
4 主要创新点和结论
本文描述了一种基于CH340芯片实现的STM32F10x系列处理器的一键串行下载电路。此电路可应用于采用STM32F10x系列处理器实现的嵌入式系统中。采用了此电路后,STM32F10x系列处理器不需要外接专门的价格昂贵的仿真器来进行程序的下载和调试,同时在下载和调试用户应用程序的过程中,不需要手动设置STM32F10x系列处理器的硬件来启动配置引脚的电平值。这极大地降低了STM32F10x系列处理器的应用成本,同时也大大地提高了该系列处理器实现的嵌入式系统的开发效率。
参考文献
[1] ST. STM32F103ZET6datasheet.pdf,2009.
[2] ST.Application note AN2606:STM32 microcontroller system memory boot mode,2017.
[3] 江苏沁恒股份有限公司.CH340中文手册(一),2010.