Captdam

Arduino (ATmega328P) bootloader

ATmega328P与Arduino,bootloader的原理与使用

--by Captdam @ 2019-01-17 12:56 GMT edited

ATmega328P与Arduino UNO

最近因为毕业设计所以买了一块Arduino,也顺便研究了一下Arduino UNO与ATmega328P。

首先评价一下Arduino把,个人感觉是一个教育意义大于实际意义的东西,实际上并不是很实用,因为Arduino这个架构,MCU的性能被浪费了很多。尝试用Arduino写了一个LED闪烁的小程序,Arduino IDE居然生成了1000byte左右的代码(说实话只要写timer和timer中断就能达到这个功能,同样的功能CISC芯片只要几十个byte的代码就够了)。作为一个比较喜欢老学校的ECE,这个完全不能忍受呀。于是,决定放弃Arduino,直接对上面搭载的ATmega328P进行开发。

实际情况是,买Arduino UNO之前就决定直接对MCU进行开发,Arduino board只用于方便烧写程序。

关于开发了什么,以及开发前选型什么的,不是这一篇blog的主题。在这里,主要讨论一下ATmega328P的bootloader。另外,在这里disclaim一下,我之前玩过一些MCU但是AVR架构还是初学者。这里对bootloader的理解全部来源于官方datasheet,要是有什么地方说的不对,还请包涵。

我会使用“PC将会跳到bootloader的开头而不是整个flash的开头(P123)”这样的格式,这表示这里的内容参考datasheet第123页。

这里是datasheet的URL:http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf

Arduino的优势与劣势

优势

个人认为,Arduino的最大优势是对于爱好者来说的低价,以及大量的社区资源。

首先说一下,什么是什么是Arduino UNO。Arduino UNO是一张信用卡大小的电路板,核心是一片可以自由使用ATmega328P芯片,有一片程序写死(可以通过ISP编程,但是很麻烦就是了)的ATmega168作为USB-to-UART转换器,电源稳压器,另外还有一堆GPIO接口。

首先,关于价格。一张官方的Arduino UNO的价格是30刀,一张非官方的Arduino UNO的价格是10刀(还是亚马逊Prime包邮),一片ATmega328P芯片的价格时3刀。也就是说10刀就可以获得一个可以上手立马使用的芯片加最小系统/编程器。如果使用专用编程器的话,编程器就得花几十刀,还得自己把外围电路搭出来。

另外,因为Arduino的用户社区很大(Arduino估计是Atmel公司<或者说Microchip>最大的客户了,Atmel Studio创建project时都有Arduino这个选项),网上能找到不少资源(虽然比较old school的硬核资料很少就是了)。

劣势

接下来,说一说劣势。

首先,Arduino这个架构的效率问题。对于电脑来说(ATmega328P虽然是单片机,但是单片机也是归类于电脑的),效率最高的是使用汇编开发,其次是C(C可以理解为是Asm的进化版),再其次是其他各种语言。而Arduino呢,他算是对C进行了再一次封装,也就是说在C损失的效率这个基础上,再损失一次效率。当然,使用C/Arduino也带来了优点:开发简单方便,不需要有很深入地对数字逻辑电路的理解,也不需要把几百页的reference sheet读个好几十遍。要避免Arduino程序效率问题的话,可以用Atmel studio,或是记事本+avrgcc/avra进行开发。

另外就是Arduino的编程器问题。Arduino使用bootloader+串口进行编程,这样只要电脑USB连接Arduino就可以对ATmega328P进行编程了。正常来说,这样的配置已经足够了,但是,当需要更高级的编程时,比如改写fuse,Arduino就无能为力了(具体原因下文解释)。这种情况下,必须使用另外一个芯片(可以是专用编程器,也可以是另外一块写了ISP程序的Arduino,或是其他的MCU)连接ATmega328P的ICSP进行编程了。