ARDUINO IDE编写和AVR单片机程序的下载

首先讲讲题目的由来吧。我做的东西原本是利用ARDUINO MEGA2560及各种模块搭建起来的,程序自然也是用ARDUINO IDE写的。但这种东拼西凑的产品自然不够好,更主要的是,之前ARDUINO板的电源烧掉了,我看了下原理图,当电脑USB电源和12V电源都接上时,USB5V和12V转的5V并联了,以此来提供大电流,但是我上网查了下,两个相同电压的电源并联其实是很容易出问题的,电流的分配关系并没有想象的那么听话是均分的,而是和电源的内阻有关,很容易烧电源,于是想着自己参考着开源原理图设计了一块电路板,修改了电源方案并把所有元件都放在一块板上,并修改固件(即之前说的程序)后烧进单片机中。说到这里,有必要阐述一下AVR与ARDUINO的关系。

ARDUINO是以ATMEL公司的AVR单片机为主控芯片的开源硬件,同时它还有自己的开发环境ARDUINO IDE。那么ARDUINO板是怎么利用AVR单片机搭建起来的呢?比如ARDUINO MEGA2560就是以AT MEGA2560 为主控芯片搭建起来的。ARDUINO把AVR单片机的部分通用I/O口挑出来,给他重新赋予名字:如maga2560 中PD0对应ARDUINO板上的digital 21(PWM和COMMUNICATION 的I/O口也是DIGITAL口),PF0对应ADC0即板子上ANALOG IN的A0.每个版本都是事先把AVR单片机的各设置都设置好了之后才出售的。每个版本的相关信息可通过ARDUINO所在文件夹下hardware\arduino下的boards.txt查看,里面记载了各版本的熔丝位设置,串口波特率设置,bootloader文件所在位置等等。在ARDUINO IDE中选择版本时,就会把相关参数切换为这个文件里说明的参数。

 

ARDUINO IDE编写和AVR单片机程序的下载

说完I/O口,再说说ARDUINO的下载方式。AVR单片机的下载方式有ISP,JTAG仿真,高压并行下载等。早期的ARUIDNO的下载用的还是CH340G,后来从某个版本开始就使用AT MEGA8以及16来实现USB转串口了。ARDUINO MEGA2560的手册的下载模块原理图如下:

ARDUINO IDE编写和AVR单片机程序的下载

BOOTLOADER就是正式程序之前的一段小程序,他在FLASH中有自己专门的存储区(忘记叫什么了),可以根据需要实现各种功能,一般被用作系统启动前的初始化工作。而ARDUINO就利用他实现了串行口下载。具体步骤见后面叙述。

下面说下我的开发过程。

一.利用PROGISP实现ARDUINO IDE编写的程序的下载

由于我的micro usb焊接不上去,又不想浪费其余部分已经焊好的板子,于是用PROGISP来下载ARDUINO IDE上写好的程序。
ARDUINO板子正常的下载是通过USB口,在编译器上一键下载的。而我们用PROGISP下载则需要编译好的16进制文件。导出ARDUINO IDE编译好的hex文件设置如下:

打开ARDUINO IDE,File->preferences,点那个C盘的路径,用记事本打开preferences.txt

ARDUINO IDE编写和AVR单片机程序的下载

 

关闭ARDUINO IDE(非常重要!)

用记事本打开preferences.txt后,选择hex文件存放的路径,在最后行加入 build.path=D:\arduino\MyHexDir。这个路径自己选择。关闭文件。

验证是否成功,如果没有成功,很可能是修改文件时ARDUINO没有关闭,此时重新打开文件,会发现那段语句并没有加入到文中。

成功后,目录里能找到编译好的HEX文件。

接下来就是AVR单片机的一些需要设置的地方了,谈下我的经历以及需要注意的东西:熔丝位。这是我第一次接触AVR单片机,很多地方都不懂,之前一直以为直接用CH340G就可以实现下载了,后来发现并不是这样。首先AVR的熔丝位就是一个很独特的东西,它决定了时钟选择,系统时钟分频,启动时从哪个地址开始执行程序,各种使能等等。AVR出厂时默认的是使用内部的RC振荡电路,我的板子上用的是外部的16M晶振,所以需要修改熔丝位来选择外部晶振作为时钟电路。而熔丝位是需要用ISP来下载的,所以第二版PCB我增加了ISP的下载口,并在网上买了两个usb isp下载器,无奈的是,把下载器插到电脑上后,电脑竟然没发现新硬件,在设备管理器里也没有找到。好在卖家负责,给我发了个免驱动的烧录软件,见下图。

 

ARDUINO IDE编写和AVR单片机程序的下载

 

这个软件对熔丝位的烧写有向导模式,非常方便,不用去查熔丝位各个位的意义,大大便利了熔丝位的设置。利用这个软件,我成功的实现了熔丝位的修改和程序的烧录(别忘了第一步永远是先选择芯片型号)。当然中间也有一些小插曲。比如说熔丝位中我选择了“系统时钟8分频”,导致实际时钟只有晶振值的八分之一,又如我明明没用BOOTLOADER,却选择了“将复位向量移至BOOT区起始地址”,导致单片机没有执行我的程序。其中主要的问题是单片机时钟选择的问题,这里需要重点强调一下:“RC振荡器”指的是利用电路和电容电路组成的时钟电路,“外部时钟”指的是一种有源晶振而不是我们平时所见的细长的无源晶振,“外部低频晶振”就是频率很低的无源晶振,“外部满幅晶振”我不懂,看有些地方写的它对应的几个熔丝位的值是外部RC振荡电路,总之不用他就对了,而“外部低功率晶振”则是我们常用的外接的无源晶振加起振电容组成的时钟电路,它对应的CKSEL3:0=1000~1111。现在,熔丝位的设置就完成了。

ARDUINO IDE编写和AVR单片机程序的下载

 

  • ARDUINO IDE编写和AVR单片机程序的下载已关闭评论
    A+
发布日期:2019年07月14日  所属分类:参考设计