我们给STM32单片机下载程序通常会使用ST-LINK或者J-LINK等使用SWD接口的下载/调试器,可是我们现在要跟他们说再见辣——
本文目录 [隐藏]
事前准备
Bootloader
提到bootloader,你可能会想到计算机中的引导程序,它是计算机开机完成自检后装载操作系统或者其他系统软件的计算机程序。
引导在英文中为Boot,是Bootstrap的缩写,源自于短语Pull oneself up by one's Bootstraps.,即靠自己振作起来。如果大部分软件需要通过其他已经运行的程序加载到计算机中,则必须存在一个将初始软件加载到计算机中的机制——也就是 Bootloader。
是不是有点抽象?那么我们来举个栗子:
你的电脑,装了windows系统,而我们运行的所有软件比如QQ,Steam,浏览器,Photoshop等,必须通过Windows这个大软件来加载到计算机中,那么Windows如何加载到计算机中呢?——答案当然是Bootloader咯
STM32的Bootloader
我们不多说PC和手机的Bootloader啦,我们主要讲STM32,如果你想了解更多,请上Wiki: 引导程序
我们说单片机也是一种微型计算机。我们为他编写代码,并且烧录进他的非易失性存储介质(如Flash),然后就可以让他运行我们期望的任务,实现相应的功能。
我们可以这样定义一下,方便后续讲解:
我们编写的代码——> App (应用)
IAP——> In application Programming (在应用编程,就是在单片机运行的过程中对代码存储介质进行重新编程)
我们注意到,刚刚买回来的STM32像个脑袋进水的傻子一样——什么都不会做,这是因为我们没有给他烧录程序…等等,你不是说有bootloader吗?这个引导程序至少能做点什么吧?
他确实能"做点什么",它不能让你的单片机变得聪明(帮你写代码)起来,但是它可以帮你让单片机变得聪明~(帮你把你写好的代码编译出来的二进制文件烧录进去)
AN2606
看到这个奇怪的字符串序列,你是不是以为是什么神秘车牌?
是的是的,它是ST的应用手册(Application Note即缩写为AN)的编号, 请在这里查看
众所周知,读官方手册是开发者必备的技能——那么我们找到General Bootloader description章节,开始慢慢啃天书…
在开头的Intro中:
The bootloader is stored in the internal boot ROM memory (system memory) of STM32 devices. It is programmed by ST during production.
我们得知Bootloader是位于STM32单片机的内部只读存储器内的,也就是System Memory,而且这个Bootloader程序是单片机生产时就烧录好的。咱们接着读
It’s main task is to download the application program to the internal Flash memory through one of the available serial peripherals (USART, CAN, USB,I2C, SPI, etc.).
这个bootloader的主要任务是通过可用的串行接口(如I2C,SPI,USART,USB等)对单片机实行IAP(在应用编程)
然后再往后看看,能找到支持使用Bootloader进行IAP的产品型号表:
可以看到,支持的还是非常全面的~
那么我们就可以开始骚操作了。我们在这里使用STM32F103C8T6和STM32F072CBT6两款单片机对Bootloader的功能进行验证。
首先对应型号找到Menu:
在这段开头有一句话:
The STM32F071xx/072xx bootloader is activated by applying pattern2 (described in Table 2: Bootloader activation patterns).
如果想要进入Bootloader模式,我们需要使用 Pattern 2 (启动序列2),根据他的链接跳转到Pattern表格,如下:
意思就是我们需要在单片机上电的时候把BOOT0和BOOT1引脚接到对应的电平,这样单片机启动时就会进入ROM中Bootloader。
然后回到072的Bootloader描述,下面有一个大 表 哥(格):
这个表格列举了所有支持的烧录方式,可以看到F072的支持是比较全面的…包含了USART1/2,I2C,USB_DFU,表格中还详细列举了如果使用这些接口进行编程时,对单片机片上外设的具体需求
我们在这里使用USB-DFU(USB-Device Firmware Update)啦,因为它只需要一个USB接口就可以跟ST-LINK分手,属于最简单的方式了!接下来实践一下试试~
STM32的BOOT0引脚只有一个,而BOOT1引脚一般默认为PB2引脚
在这里Pattern 2是2个引脚都接高电平,不过请注意给2个引脚串接一个100k电阻,以防止过流/倒灌电流,给单片机造成损坏。我的测试板是这样接的,通过一个2位拨码开关切换启动模式,实测是没问题的…(不要问我为什么接地不串接100k电阻orz)
拨动开关,将2个引脚接高电平(3.3V),然后接上我们的USB-C,(注意设计电路时需要在USB的2根数据线上串联22欧姆的电阻,以防止过高的通信速率在信号线上产生振铃和串扰,破坏数据传输的稳定性):
插上电脑后,打开电脑的设备管理器,出现了STM32 BOOTLOADER设备,说明我们的电脑已经识别到了单片机的BOOTLOADER~(如果没有识别到,试试安装DFU驱动?)
然后打开我们之前安装好的 STM32CubeProgrammer
是这个界面的鸭子,然后我们在右侧选择USB,如果识别成功就会显示有一个USBx,这时候点Connect,就可以连接上单片机了~
打开之后可以看到一大串0x080$%^&*什么的,不用管啦反正也看不懂(
下一步,当然是下崽啦
点击download旁边的小箭头,可以看到还有别的选项,我们这里只需要点击下崽,然后就可以把程序烧录进单片机,和ST-LINK和J-LINK彻底说掰掰~
此时,把USB线缆拔下来,将BOOT0和BOOT1拨回接地的状态,这样单片机下次上电的时候就会读取内部FLASH中的程序,而不是启动Bootloader啦~
完成操作后接上电,发现单片机正常运行~
关于103C8T6…
好吧,其实我有点懒得写了,学会了这一个应该别的也很简单啦!
103c8t6呢,他的Bootloader只支持USART1,所以我们用不了USB-DFU啦…
我们可以用USB-TTL模块或者IC,比如CH340来实现C8T6的IAP~
具体的过程就不多阐述啦,需要注意的是C8T6进入Bootloader的启动模式和前文的F072不一样,C8T6是Pattern 1,也就是BOOT0-1,BOOT1=0,在STM32CubeProgrammer中选择UART,除此之外没啥区别.