烧录到arduino 烧录板子里的二进制数据能导出来吗

查看: 59634|回复: 108
arduino uno mega2560等各种不同板子bootloader烧写方法
bootloader丢失情况时有发生,这里抛砖引玉描述一下,arduino不同板子bootloader下载的方法。
arduino duemilanove/uno/mega 1280/mega 2560等都支持~~
首先是推荐用最简单的官方IDE进行下载,这种不需要配置任何东西~~~
先用mega1280做一个简单介绍。本次介绍使用的是0022 IDE,其他版本的大同小异~~~上一个硬件连接图,下载线上有一个小三角标识,那个对应的就是1号脚,与板子上ICSP口1号引脚对着插好就ok。
IMGP7302_调整大小.JPG (108.68 KB, 下载次数: 66)
11:41 上传
首先打开IDE,选择板子类型。
10-09-42.png (97.54 KB, 下载次数: 65)
11:41 上传
然后选择下载器类型,我这里使用的是USBtinyISP,根据自己的下载器进行选择,如果列表中没有,后面会介绍另外一种方法。
10-10-05.png (69.68 KB, 下载次数: 61)
11:41 上传
然后就自动开始下载bootloader了,IDE上会提示,正在下载中。
10-46-22.png (57.3 KB, 下载次数: 51)
11:41 上传
给1280或者2560下载bootloader会提示校验失败,这个是因为usbtinyisp支持不够完美有关系,没关系。。。不影响正常使用。
10-49-27.png (72.31 KB, 下载次数: 63)
11:41 上传
如果没有官方列表中支持的下载器怎么办,不怕,我们可以用下面这种办法。
先进入arduino-0022\hardware\arduino目录中,找到boards.txt,打开他。
9-48-09.png (104.18 KB, 下载次数: 59)
11:41 上传
然后就可以看到不同板子的配置信息,图片以UNO为例,介绍了下载bootloader所需要的字段。比如熔丝位,bootloader所在文件夹,bootloader文件名字。
9-48-51.png (126.4 KB, 下载次数: 51)
11:41 上传
然后再到对应目录,找到bootloader文件
10-03-38.png (176.4 KB, 下载次数: 61)
11:41 上传
然后我们打开AVRDUDE GUI(帖子附件中有下载)
根据下载器类型,选择好下载器。
10-59-23.png (118.03 KB, 下载次数: 60)
11:41 上传
然后选择好芯片型号。
10-59-39.png (108.93 KB, 下载次数: 63)
11:41 上传
当1,2号选项配置好了,我们可以点击3号选项熔丝位,进行Read一下,看看链接是否正确,如果不正确,还需要在Port配置中选择一下对应的端口。偶尔。。还需要在Command line Option扩展中,加-F,进行强制读取下载。
熔丝位读取没问题,我们首先要根据从boards.txt获得的熔丝位,输入进去后Write一下。然后我们就可以在4号配置中,选择好上面找到的bootloader文件,按5号按钮进行下载。。。
11-10-59.png (79.33 KB, 下载次数: 58)
11:41 上传
下面这个是AVRDUDE GUI
(437.91 KB, 下载次数: 2162)
21:33 上传
点击文件名下载附件
好东西,谢谢弘毅大哥的辛苦帖子。实践中了、、、
有个问题请教楼主,为什么我的gui中,红色1的那个选项不能选,我的操作系统是win7 64bit
rsw1986 发表于
有个问题请教楼主,为什么我的gui中,红色1的那个选项不能选,我的操作系统是win7 64bit
我用64位win7测试了下,1号位置是有选项的,如果没有,说明你顶部的avrdude.exe File选项处。。。没有选对avrdude.exe的路径
弘毅 发表于
我用64位win7测试了下,1号位置是有选项的,如果没有,说明你顶部的avrdude.exe File选项处。。。没有选对 ...
路径选择了,不过每次运行的时候总是会提示缺少一个lib***的文件
弘毅 发表于
我用64位win7测试了下,1号位置是有选项的,如果没有,说明你顶部的avrdude.exe File选项处。。。没有选对 ...
还有一个问题想请教一下楼主,在新的mega2560中用atmega16u2取代了ft232,是不是在arduino中必须用atmega16u2,ft232还能不能取代atmnega16u2
rsw1986 发表于
还有一个问题想请教一下楼主,在新的mega2560中用atmega16u2取代了ft232,是不是在arduino中必须用atmega ...
FT232可以取代16U2
rsw1986 发表于
路径选择了,不过每次运行的时候总是会提示缺少一个lib***的文件
是下载的本贴中的附件吗?如果缺少lib文件。。。会不会是缺少系统文件了?这个软件好像是C#写的?
弘毅 发表于
是下载的本贴中的附件吗?如果缺少lib文件。。。会不会是缺少系统文件了?这个软件好像是C#写的?
谢谢楼主,这个问题解决了,缺少的那个文件是usbtinyIPS的驱动,装上驱动就好了
Powered by他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)查看: 36362|回复: 33
Arduino入门教程--第二十五课--EEPROM的读写与获取串口数据流
EEPROM (Electrically Erasable Programmable Read-Only Memory),电可擦可编程只读存储器,他是一种掉电后数据不丢失的存储芯片。
具体能做什么呢?比如~数字密码保险箱的密码掉电后不能丢失,他一般都是存放在EEPROM里面的。再比如,一些设备需要根据不同场合,输入特定的环境参数,每次启动要加载这些参数,这些参数,也是放在EEPROM里面的。
下面的代码,我们是让Arduino不停地从0号地址位开始的读取EEPROM,把读取到的数值通过串口输出到电脑上。同时,我们通过串口向Arduino输入数字,更新从0号地址位开始的EEPROM信息。间接的更新了输出到电脑上的数值。
我们这次使用的是Arduino官方的EEPROM库,但是官方库有一个遗憾,每次只能读取或者写入一个地址位~~所以我们在代码开头。。定了了两个函数EEPROM_write与EEPROM_read。括号内第一个参数是起始地址位,第二个就是写入的变量。
#include &EEPROM.h&
#define EEPROM_write(address, p) {int i = 0; byte *pp = (byte*)&(p);for(; i & sizeof(p); i++) EEPROM.write(address+i, pp[i]);}
#define EEPROM_read(address, p)&&{int i = 0; byte *pp = (byte*)&(p);for(; i & sizeof(p); i++) pp[i]=EEPROM.read(address+i);}
unsigned long incomingByte = 0;& &// 定义无符号长整数型变量incomingByte初始值为0
void setup() {
&&Serial.begin(9600);& &&&// 打开串口,设置数据传输速率9600
}
void loop() {
&&if (Serial.available() & 0) {
& & incomingByte = Serial.parseInt();&&//读取串口传入的下一个有效整数,把该整数赋值给incomingByte变量
& & EEPROM_write(0,incomingByte)& &//把incomingByte变量从0地址位开始写入EEPROM
& &
&&}
&&EEPROM_read(0,incomingByte) //从0地址位开始读取EEPROM,把值写入变量incomingByte
&&Serial.println(incomingByte); //通过串口输出
&&delay(1000);
}
复制代码
上效果视频~请点击全屏看。。。
这次我们用到了一个串口命令Serial.parseInt(),他的作用是查找传入的串行数据流中的下一个有效的整数。Serial.read()只能每次读取一个字节。。。使用起来并不是很方便。Serial.parseInt()能一次读取一个数据流。。弥补了这方面使用上不便的缺陷。
Serial.parseInt()更多资料请查看
看到 byte *pp=(byte*)&p 的时候晕了一下,果然C语言的指针概念都还给老师了。
这里的意思应该是:定义了一个字节型数组指针pp,将它指向了变量p。(byte*)是为了将&p强制转换为字节型指针,以便赋值给*pp的。
整个程序是先从串口读了一个不知道哪儿来的数值,然后就把这个数值写入EEPROM,之后又从EEPROM里读出一个数,最后把这个数显示出来,让你看看跟输入数是否相同。
1、EEPROM初始存了些什么?是不是就是我们下载过去的程序?
2、IDE总是显示:“二进制程序大小:2,906字节(最大32,256字节)”,后面的最大字节数是否就是EEPROM的大小?
3、LZ定义的两个函数,int i=0; 完全可以放进for函数里,否则老以为其他什么地方还用了i变量。
4、在loop里调用这两个自定义函数时,结尾部分LZ都没加分号,居然还调试过了,这是怎么一个情况??
#include &EEPROM.h&
#define EEPROM_read(address,p) {byte *pp=(byte*)&p; for(int i=0; i&sizeof(p); i++) pp[i]=EEPROM.read(address+i);}
#define EEPROM_write(address,p) {byte *pp=(byte*)&p; for(int i=0; i&sizeof(p); i++) EEPROM.write(address+i, pp[i]);}
unsigned long incomingByte = 0;& &// 定义无符号长整数型变量incomingByte初始值为0
void setup() {Serial.begin(9600);}
void loop() {
&&if (Serial.available()&0) {
& & incomingByte=Serial.parseInt();&&//读取串口传入的下一个有效整数
& & EEPROM_write(0,incomingByte);& &&&//把incomingByte变量从0地址位开始写入EEPROM
&&}
&&EEPROM_read(0,incomingByte);& && &&&//从0地址位开始读取EEPROM,把值写入变量incomingByte
&&Serial.println(incomingByte);& && &//通过串口输出
&&delay(1000);
}
复制代码
请我的板子怎么写入值后怎么只能读取一次呢??后面就变成了0.怎么回事?
(125.82 KB, 下载次数: 76)
17:55 上传
fairsky 发表于
请我的板子怎么写入值后怎么只能读取一次呢??后面就变成了0.怎么回事?
换用1.0.4或者1.0.1的IDE试试。。。1.0.5的IDE出现好多代码编译后运行异常问题。。。估计官方在里面改了很多东西
chaoser 发表于
看到 byte *pp=(byte*)&p 的时候晕了一下,果然C语言的指针概念都还给老师了。
这里的意思应该是:定义了 ...
顶贴!顶贴!顶贴!
fairsky 发表于
请我的板子怎么写入值后怎么只能读取一次呢??后面就变成了0.怎么回事?
感觉是Serial.parseInt()留有未读完的数据(可能是串口工具的问题),下次串口有效,又读了一次,读出是零
在后面再加一条“Serial.parseInt();”,就没有这个问题了
可以对EEPROM进行空间划分分别存储一个数组吗???怎么实现啊???
怎么对其是否写入过数据进行判断???
chaoser 发表于
看到 byte *pp=(byte*)&p 的时候晕了一下,果然C语言的指针概念都还给老师了。
这里的意思应该是:定义了 ...
我来回答下==
1。我们下载的程序在 Flash空间里,不在EEPROM, 二者都可以断电保存数据,但是EEPROM的擦写次数(100000次)比Flash(10000次多)。。EEPROM可以在程序随时擦写,但是Flash不行(flash保存程序)。
2。最大字节表示可用程序存储空间,当然是Flash;
3。应该是可以放在括号里的;
4。注意 #define EEPROM_read(address,p)&&的关键字是define,所以这是个宏定义,而不是函数,所以不用加分号;
强哥,编辑后出现这个,是什么情况呢。
sketch_nov27a.cpp: In function 'void loop()':
sketch_nov27a:14: error: 'class HardwareSerial' has no member named 'parseInt'
Powered by他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)鍙?渶涓

我要回帖

更多关于 arduino mega2560烧录 的文章

 

随机推荐