这节主要是介绍大家使用两个软件。这两个软件也是比较常用的,里面也有很多有意思的功能,可以给大家介绍一下。
1. FlyMcu 软件
这个软件可以通过串口给 STM32 下载程序,如果你没有 STLINK,就可以用这个软件通过串口下载程序。
那我们先看一下 FlyMcu 程序烧录软件,打开软件,这个软件是绿色软件,直接打开就能运行,不需要安装。这个软件的作用呢,如果你玩过 STC 的 51 单片机的话应该知道,STC 单片机也有个程序烧录软件,叫 STC-ISP,可以通过串口给 51 单片机下载程序。这个 FlyMcu 就跟 STC-ISP 的用途是一样的,都是串口下载。
那接下来我就演示一下串口下载的流程。
- 首先,硬件这里,我们需要连接一个串口的电路。这个电路要能保证 USART1 和电脑进行串口通信。这里必须要是 USART1,因为我们这个芯片的串口下载只适配了 USART1,接在其他 USART 上是不行的。线接法和前几小节是一样的,那这里我的线已经接好了。
- 然后在软件上,我们随便打开一个示例代码。比如我这里拖出来了一个 LED 闪烁的代码作为演示,打开工程。为了实现串口下载,我们需要配置工程,生成一个 HEX 文件,点击工程选项,在 OutPut 选项卡里把 Create HEX File 选项勾上,这时再编译一下。在输出窗口中多了一条创建 HEX 文件的信息。编译没问题,我们就可以打开工程目录,在 Objects 文件夹下找到我们刚才生成的 HEX 文件(Project.hex),这就是我们串口下载所需要的程序文件。
- 接下来我们就可以用 FlyMcu 下载程序了。首先菜单栏先点搜索串口,然后 Port 这里选择我们串口通信的 COM 号,bps 波特率可以保持默认的 115200,这一部分和串口助手是一样的。接着选择程序文件,选择我们刚才生成的 HEX 文件,在工程目录,Objects 文件夹里,选中,打开,之后下面这些其他的配置,我们暂时先保持默认。目前对下载程序影响不大,等会儿再细说。
- 然后在开始编程之前,我们还需要配置 BOOT 引脚,让 STM32 引脚执行 BootLoader 程序,否则的话,点击开始编程,它会一直卡在一个位置。
如何进入 BootLoader 呢?我先演示流程,等会儿再解释。
- 看一下板子,第一步,找到跳线帽,这两个跳线帽是用来配置 BOOT 引脚的,把这里上面一个跳线帽,也就是配置 BOOT0 引脚的跳线帽,拔下来,然后插在右边两个针脚,配置 BOOT0 为 1。
- 第二步,按一下复位键,让程序重新开始运行,这里切换 BOOT 引脚之后,一定要再按一下复位键。因为 STM32 只有在刚复位的的时候才会读取 BOOT 引脚,程序运行之后,切换 BOOT 引脚是无效的,那这样,芯片就进入 BootLoader 程序了,进入 BootLoader 程序之后,STM32 执行的程序就是不断接收 USART1 的数据,刷新到主闪存。
- 然后再回到 FlyMcu 软件,点击开始编程,这时就可以看到,下载过程成功运行,最后显示下载成功。
- 这样,我们这个 LED 闪烁的程序,就通过 BootLoader 成功刷新到主闪存里了,回到 STM32,目前 LED 还没有亮起来,这是因为目前 STM32 还在执行 BootLoader 的刷机程序,我们还需要把 BOOT 引脚换回来,拔掉 BOOT0 的跳线帽,换到左边两个引脚,然后按一下复位。可以看到 LED 闪烁,程序运行正常。
那接下来我们来研究两个问题。
- 第一个问题,BOOT 引脚是干啥的,为啥这样配置?BootLoader 又是干啥的,串口下载的原理是什么?
串口下载的原理:之前在 DMA 节我们介绍过了 STM32 的存储器映像,在 ROM 区的 0800 位置,存储的就是编译后的程序代码,你把什么程序写入到这个位置,STM32 就执行什么样的程序。如果想使用串口下载程序的话,我们只需要把程序数据通过串口发送给 STM32,STM32 接收数据,然后刷新到 0800 这一块位置就行了。但是接收并转存数据,这个过程本身也是程序,如果利用程序实现自我更新,这是一个问题。就像是一个机器人,给自己换电池一样,换电池,需要先拆掉旧电池,再装上新电池,但是一旦把旧电池拆掉,机器人本身就无法工作了,这样装上新电池的工作就没法完成了。所以为了能让机器人自己换电池,我们还需要额外做一个小机器人,需要换电池的时候,就启动这个小机器人,小机器人完成整个换电池工作之后,再返回大机器人运行。那同理,STM32 通过串口进行程序的自我更新,就需要这样一个小机器人,这个小机器人就是 BootLoader。BootLoader 是 ST 公司写好的一段程序代码,这段程序的存储位置,就是 ROM 区的最后,1FFF F000,这段区域叫做系统存储器,存储的是 BootLoader 程序,或者叫自举程序,用途是程序自我更新,串口下载。在更新过程中,BootLoader 接收 USART1 数据,刷新到程序存储器,这时主程序就处于瘫痪状态,更新好之后,再启动主程序,执行新程序,这就是串口下载的流程。如果你给手机或电脑重装过系统的话,就可以类比一下,这个 BootLoader 就相当于手机的刷机模式,或者电脑的 PE 系统,是辅助主程序进行自我更新的。然后之前在初识节我们还介绍过一个启动配置,如何启动大机器人,如何启动小机器人,就由 BOOT 引脚来决定,当 BOOT0 为 0 时,就是主闪存,也就是 0800 的位置开始运行,启动大机器人,当 BOOT0 为 1,BOOT1 为 0 时,就是从系统存储器,也就是 1FFF F000 开始运行,启动小机器人。最后还有一个 BOOT0 和 BOOT1 都为 1,从 SRAM,也就是 2000 开始运行,这个比较高级,我们暂时不用。在系统复位后,SYSCLK 的第 4 个上升沿,BOOT 引脚的值将被所锁存,所以说,每次切换 BOOT 引脚之后,都要按一下复位。到这里,串口下载的原理就介绍完了。
- 第二个问题,每次下载程序,都要拔插两遍跳线帽,太麻烦了,有没有什么解决方法?
刚才我们说了,想要程序自我更新,就必须有一个切换小机器人的过程,BOOT0 引脚和 RST 复位引脚必须得有高低电平变化,那能不能我接两根线,当电脑点击下载时,自动帮我设置一下 BOOT0 和 RST 的电平呢?答案是可行的,我们可以看一下串口模块的电路,CH340G 模块除了TXD 和 RXD 用于通信的引脚,还有 RTS、CTS、DTR 和 DSR,这些引脚都是流控的引脚,我们不使用流控,可以把它们当作普通的 GPIO 来控制。其中 RTS 和 DTR 是输出引脚,我们可以用这两个引脚来控制 BOOT0 和 RST,当然在外围还需要设计一个控制电路,一般可以用两个三极管开关来进行控制,有关电路部分大家可以网上搜一下,STM32 一键下载电路,里面都有设计方案和解释,当我们这个串口具备一键下载电路之后,就不需要再频繁切换跳线帽和按复位键了,非常方便。
回到 FlyMcu,下面有一个下拉框,就是用来配置 DTR 和 RTS 的,是高电平复位,还是低电平复位,等等配置,这些配置需要根据一键下载电路来选,一般最常用的配置是 DTR 的低电平复位,RTS 高电平进 BootLoader。我们这个硬件,目前没有一键下载电路,所以还是得手动切换跳线帽,那这里的下拉框,选择哪个就无所谓了。选好之后,输出窗口的信息可以看到,下载之前会给 DTR 和 RTS 置高低电平,以此切换大机器人和小机器人工作。
那没有一键下载电路,我们还有个缓招可以使用,就是勾上开始编程后面的编程后执行,这样试一下看看。先切换跳线帽,复位,进入 BootLoader,LED 就没有闪烁了,回到 FlyMcu 软件,如果选择了编程后执行,需要去掉选项字节的编程到 FLASH 时写选项字节勾,要不然下载之后会提示执行失败,我们去掉后开始编程,下载完成,然后看一下,这时程序直接就运行了,即使现在跳线帽仍然处于 BootLoader 的状态,为啥呢?我们看一下输出窗口多了一条,成功从 0800 开始运行,这就是在软件上,人工加入了一条跳转指令,这样就能执行主程序了。但是这样只是一次性的,我们复位一下看看,LED 不亮,程序仍然是 BootLoader,不过这样也可以省很多步骤,我们可以切换到 BootLoader 不断地进行下载调试,然后调试完成之后,再切换回主程序,这样就只需要最开始和最后切换一下跳线帽就行了,比较省事。这个问题我也就介绍这么多。
接下来我们继续来探索一下这个软件,这里面还有很多有意思的东西,首先是这个读 Flash,我们点一下,然后放到桌面,起个名字 led,保存。这样就可以把芯片里的程序读出来,输出窗口提示读取完成,桌面上就出现了程序文件,这就有意思了是吧。比如你看到别人用 STM32 做了一个产品,你觉得不错,就可以抄一下它的 PCB 板,然后程序文件呢,又可以通过这个软件读出来,这样就可以大批量山寨别人的产品了是吧,不过 STM32 也可以配置读保护,这个等会儿再说。但是反过来,如果你开发产品,不注意这个问题的话,是不是一不小心程序就泄露了,是吧。那我们看一下读出来的这个文件,这个文件是 .bin 格式的,里面记录的就是 STM32 从 0800 开始存储的程序数据,.bin 格式是没有地址信息的原始数据文件,我们之前生成的 .hex 文件,是有地址信息的,不过作为记录程序代码的文件,这两种格式的作用其实都是一样的。这里还有一个问题,就是 FlyMcu 下载的时候只能选择 .hex 文件,如果选择 .bin 文件,下载就会报错。但是它读出来只能选 .bin 文件,读出来的 .bin 文件不能再下载回去了,有点折磨人,可能是软件设计的时候没考虑到这个功能。不过等会我们介绍 STLINK Utility 的时候,这两个文件就都可以选择了。
那我们继续来看,点击清除芯片按钮可以把主程序区域全部擦除,擦除之后,所有的数据都是 FF;之后读器件信息会把芯片的序列号什么的信息读出来,然后这里显示我的芯片的 Flash 容量是 256K,这个有点夸张,我们这个 C8T6 芯片的标称 Flash 容量是 64K,属于中容量产品,这里读出来却是 256K,直接成大容量产品了。我试过很多芯片,有的芯片是 64K,有的是 128K,还有的像这样是 256K,这个百度了一下,说是生产的时候为了省工序,很多型号是一个模子做出来的,但是 C8T6 只能保证前 64K 没问题,当然也还有其他的说法,大家可以自行了解一下,这个问题并不是很大。
然后 Ramlsp 和连续烧录模式,目前用的不多,大家可以自行研究。最后,我们再来研究一下这个选项字节,我们之前在 DMA 中介绍的 STM32 的存储器映像中也提到过选项字节,选项字节也是 ROM 区最后的一小块存储单元。用途是存储一些独立于程序代码的配置参数,那究竟是哪些参数呢,有什么作用呢?在这里就可以看到了,点击设置选项字节的按钮,选择 STM32F1 这一项,这个界面展示的就是选项字节里面的参数了。
第一块,就是读保护,刚才我们说了,如果你做产品,不开启读保护,别人很容易就把你的程序偷走了,所以为了保护程序的安全,选项字节里就有一个参数可以配置读保护。这里可以看到,设成 A5 允许读出,设成 FF 阻止读出。注意一下,如果你阻止读出了,再回到 Keil 下载程序就会失败,如果因为读保护导致下载失败,那需要再到这个地方来,取消读保护,取消一下就正常了。另外,在取消读保护时,会同时清空芯片的程序,这样程序就不会被偷走了,这就是读保护功能。
接着下面还有一些硬件选项字节,其中包括看门狗,停机和待机模式不产生复位,还有几位,用户应该大概也许可以使用,这些了解一下就行,如果有需求的话可以用一下,然后是用户数据字节,这些东西如果有需求的话可以自己使用。
那选项字节里面的参数有什么好处呢,第一,就是选项字节的数据相当于是世外桃源了,无论程序怎么更新,选项字节的数据都可以不变。你可以用这些字节来存储不随程序变化而变化的参数,另外选项字节还有一个好处,就是可以用上位机很方便的修改,比如我们这个 FlyMcu 或者 STLINK Utility,在上位机里,可以直接修改选项字节的内容,是不是可以用作一些产品中,可供用户配置的参数啊。
然后继续看,最后一项,就是写保护了,这里可以对 Flash 的每几个页单独进行写保护,比如你在主程序的最后几页写了一些自定的数据,不想在下载的时候被擦除了,就可以把最后几页设置写保护锁起来,设置写保护之后,就无法再写了,如果想再次写入的话,解除写保护就行了。另外注意一下,设置写保护之后,再下载,如果需要写入保护区的话,就会出错,比如你把最前面几页写保护了,下载一次之后再下载肯定就会出错,而它这个软件设计,不能单独写入选项字节,只能下载 Flash,顺便写入选项字节。但写保护了,下载不了,下载不了就不能解除写保护,形成死循环了,这个注意一下。不过我们等会儿介绍另一个软件的时候,就可以单独配置选项字节,就可以解决这个问题了。
这就是选项字节的所有内容。总共就是 4 大块,读保护、写保护、硬件参数和用户参数。配置好之后,可以点击采用这个设置,然后把编程到 Flash 时写选项字节的勾勾上,再执行正常的下载流程,就能更新选项字节的配置了。大家可以自己玩一玩试试。
有关 FlyMcu,就介绍这么多。基本上各个功能也都介绍完了,下载程序的流程和原理,如果解决频繁切换跳线帽的问题,读取程序、擦除芯片以及选项字节的内容,就这么多。
2. STLINK Utility
这个软件是配合 STLINK 使用的一个工具,可以通过 STLINK 给 STM32 下载程序,也可以进行一些其他的操作。
这个软件是需要安装的,直接双击安装包安装,安装路径大家可以指定一下,或者直接默认路径,也没问题。最后提示安装 STLINK 的驱动,直接点是就行了,这样就安装好了。按照之后,桌面上会出现软件图标,我们双击打开,就是软件的主界面了。
首先演示一下,用这个软件下载程序的流程,硬件部分,只需要把 STLINK 连接好就行了,串口可以不接,然后跳线帽恢复成两个都在最左边,复位,之后,点击 🔌 按钮进行连接,连接好之后,上面就会出现一些器件信息了,然后下面主界面展示的就是 STM32 里面 0800 开始的程序数据,目前这个芯片刚被擦除过,所以数据全是 FF。如果你点击保存,就可以把这个程序给存起来了,这里可以选择保存为 .hex 或者 .bin 文件。之后点击 🔌 后的按钮,就是断开连接,点击橡皮擦,就是擦除芯片。如果要下载程序的话,先点第一个按钮,打开文件,这里文件类型支持 .hex 和 .bin,我们可以打开刚才读出来的 .bin 文件,然后点击橡皮擦后面的编程按钮,对话框中显示程序文件的路径,你也可以在这里直接打开要下载的的程序文件,之后点击 Start,开始下载,下载完成之后,我们看到,LED 闪烁,没问题,这就是 STLINK Utility 下载程序的流程。和 Keil 内置的下载基本是一样的,非常简单。
然后再介绍一下这个软件选项字节的配置,可以点击 Target,Option Bytes,这就可以打开选项字节的配置页面了,选项字节的内容,和刚才介绍的一样。第一块就是读保护,可以使能或失能;第二块也是硬件参数,这些灰色的选项我们这个型号的芯片没有;之后就是第三块,用户参数;第四块是写保护,内容都一样,这些配置好之后,直接点击 Apply,就能直接单独更改选项字节的参数了,不像 FlyMcu,必须要下载程序顺便更新选项字节。这就是这个软件的选项字节配置。
所以如果你有芯片被读保护或者写保护锁住了,就可以到这个地方来,解除保护。
最后再给大家介绍一个 STLINK 固件更新的功能。我们可以点击 ST-LINK,Firmware update,然后打开这个 ST-Link Upgrade,这个界面就是用于给 STLINK 更新固件的,然后点击 Device Connect 连接,这里提示重启一下。那我们拔掉 STLINK,重新插,再次点击 Device Connect 连接,可以看到我们目前这个 STLINK 固件是 J29.S7,最新的固件是 J37.S7,如果要升级的话,点 Yes,就能给 STLINK 升级固件了。需要升级的话,可以到这里来看看,不过如果你使用没问题的话,也不需要经常更新,能用就行了。
有关这两个软件的介绍,STM32 BootLoader、选项字节等等,这些内容到这里就结束了。总的来说,这两个软件的功能差不多,都可以下载程序。FlyMcu 是串口下载,STLINK Utility 是 STLINK 下载。希望能给大家之后的学习和应用带来帮助。