Arduino通过USB转TTL无BootLoader(引导程序)烧录程序的两种办法
# Arduino通过USB转TTL无BootLoader(引导程序)烧录程序的两种办法## 注意
(这个实验室基于stm32duino的,avr单片机并不直接通用,不过如果你准备尝试使用串口来给avr单片机(*就是Arduino官方出的几款Arduino*)烧录Arduino的BootLoader,建议直接放弃因为avr单片机并不支持直接使用串口上传程序,而且Arduino的BootLoader好像目的也就是让Arduino能够直接串口烧录程序。
*也就是说你不能在没有BootLoader的情况下烧录avr-Arduino的BootLoader,而当你可以用串口给avr-Arduino烧录BootLoader时就说明你已经有BootLoader了,可以不用再烧录一次了*)
## 于BootLoader的废话
因为准备参加电赛,想着如果比赛可以用Arduino或许会方便很多,所以准备研究一下Arduino的底层程序,学习一下如何把随便一块芯片都能做成Arduino来开发。不过这篇帖子和此并没有太大关系,只是属于机缘巧合做的一个小实验而已,对于已知BootLoader的原理或者想自己写BootLoader的朋友并无太大帮助。
最开始初学的时候,买了一块nano板,结果在我准备做点骚操作的时候(具体忘了做了啥了,好像是写错了个指针?),它被我搞废了,烧录不了程序。然后各种查资料,怀疑是BootLoader的问题,需要重新烧BootLoader。(事实上现在我也不知道具体是不是真的,因为拖延症导致我很久没去碰这块板子,现在不知道扔哪去了。而且当时没有记录的习惯,这个世界又多了个未解之谜)
当时我并不清除BootLoader是个什么东西,毕竟年轻的我看见hardware文件夹里那一堆文件就头(tuo)疼(yan),但是总体印象大概就是Arduino的便捷和这玩意有很大关系。然后在我脑海中Arduino不能没有BootLoader这个想法就形成了,于是这次准备把MSP430做成Arduino的时候我就想到了是不是要烧BootLoader?但是打开官方给出的energia软件,在其目录下并未发现BootLoader的文件,而且软件也没有给出烧录引导程序这一选项,所以我对我的认知产生了一丝丝怀疑。
于是,我选择再搜索一下BootLoader到底是什么,[百度的解释](https://baike.baidu.com/item/BootLoader/8733520?fr=aladdin)是可以把它当做一个启动引导程序,但是感觉这种解释有点抽象,然后我找到[另外一篇文章](https://www.cnblogs.com/anandexuechengzhangzhilu/p/10719808.html)是说把它当做一个系统,我们的程序就是运行在这个系统的软件,这种说法感觉有一定道理,但是感觉又不是那么对,因为平常如果我们没有BootLoader,我们也可以对普通单片机烧录程序,但是如果软件没了系统,是无法直接在电脑裸机上运行的。但是这个文章还是给了我一定的思路,所以我搜索了一下“如何使用串口给avr烧录程序”,然后我找到了[这个](https://wenku.baidu.com/view/de9810795acfa1c7aa00ccd8.html)。然后结合我目前掌握的知识和已知条件:
1. 每次Arduino在上传程序时都会进行一次复位,我怀疑是为了让Arduino进入BootLoader模式
2. 没有BootLoader的avr单片机不能直接在ArduinoIDE上烧录程序,在如何使用串口给avr烧录程序那篇文章里,提到了需要给avr烧录BootLoader后才可以通过串口给avr直接烧录程序
3. Arduino UNO的原理图中,官方最原版使用了一块atmega16u2,而市面上常见的UNO R3都是使用的一块ch340(USB转串口芯片)来代替,说明BootLoader并没有直接让avr芯片拥有USB功能
4. Arduino Leonardo的原理图就没有使用ch340或是其他芯片,而是直接用USB数据口连接USB接口,而Leonardo和UNO这些的区别在于其芯片atmega32u4可以作为USB设备来识别。
所以我姑且对avr-Arduino的BootLoader进行了这样的推测性理解:**Arduino的BootLoader可以当做一段启动程序,它的作用是让Arduino可以拥有与电脑直接(如Leonardo)(或间接(如UNO)),然后烧录时会把程序发送给BootLoader处理,然后BootLoader将其放到指定的ROM地址作为起始地址。在烧录结束后,芯片将从BootLoader部分跳到程序部分。而普通使用时,因为没有复位进入烧录这一行为,BootLoader会被直接运行到底然后跳到真正程序起始位。如果不烧录BootLoader,可以节省出BootLoader的内存空间,但是需要比较麻烦的接线方式(如JTAG,ISP之类)**
当然以上为我的个人推理猜测,目前太忙(tuo)还没有专门系统地学习这一块知识(内容感觉太杂不确定学习路线,有点东学点西学点的样子,如果有大佬能够指导一下方向就太好了),如果有错误非常欢迎指正。
然后以下才进入正文……
## 通过ArduinoIDE的Serial模式烧录
因为没有找到MSP430的引导程序,而avr的引导程序又需要烧熔丝,和我的目的(研究msp430的Arduino)有比较大的差别,所以我选择了stm32来做测试。
用的是stm32f103c8t6的小蓝板(blue pill),大概步骤为:
1. ArduinoIDE安装开发板:http://dan.drown.org/stm32duino/package_STM32duino_index.json
2. stm32f103c8t6调整好boot引脚,连接usb转ttl,然后连接电脑
3. 随便写个程序,注意引脚名称修改,我这里使用了blink例程,把引脚改为了PC13
```c++
void setup() {
pinMode(PC13, OUTPUT);
}
void loop() {
digitalWrite(PC13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(PC13, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
```
4. 选择好板子、端口,然后选择烧录模式为serial
5. 点击上传即可
详细步骤请参考帖子:http://www.elecfans.com/d/1002467.html
## 通过二进制文件烧录
这个方法需要下载软件,软件使用时只需要一路点next即可,不懂的地方直接用翻译软件翻译一下就懂了,stm32的二进制烧录方式具体步骤可以参考这个帖子:https://www.cnblogs.com/wangguchao/p/7308657.html
而Arduino的二进制文件可以通过ArduinoIDE的项目-导出二进制文件获取,会导出到工作文件夹下。
## 总结
这个帖子其实就是做个思路引导,同时也是自己的学习笔记,如果需要烧录stm32的Arduino程序,在暂时不知道BootLoader原理或怎么写的情况下,可以用这种方式凑合着下载,而同理,avr可以用isp或jtag,msp430用jtag或sbw或bsl来下载。不过最好再深入学习一下吧……
以上内容如有错误或遗漏,欢迎指正! 学习了。esp8266似乎就不需要bootloader
页:
[1]