Linux下avr的开发AVRDUDE的使用简介和AVR熔丝位 — 大工CSDN – EE01工作室【附件】
2012-05-30 15:32
393 查看
Linux下的MCU开发之AVR系列2
-AVRDUDE的使用简介和AVR熔丝位
Galaxy2416
联系方式:sunxiao.gin@gmail.com
附件内容: 例程代码,相关文档,相关软件。
http://download.csdn.net/detail/galaxy_blue/4339966附件网址~
如果安装了avrdude的doc的话(附件里也会有),会得到一个非常全面和详细的使用说明。现在针对常用的几个命令简述一下。
本文环境如下:
OS系统:ubuntu12.04(原为10.04最近升级了)
编译器:avr-gcc
烧录软件:avrdude
对器件进行控制需要先进入AVRDUDE的终端模式。打开终端输入
就可以进入了,其中-t就是进入其终端控制的命令。
usbasp+m16:
输入part
会得到非常全面的信息。
之后尝试对其eeprom进行操作并且擦除芯片来。
可以看到可以直接对eeprom操作。
然后到了一个关键的时候了,我们要进行熔丝位的处理。就么m16而言,熔丝位一共分为高8位和低8位
时钟源选择
系统时钟源CKSEL3..0
外部石英/陶瓷振荡器
1111-1010
外部低频晶振(32.768KHZ)1001(CKOPT=0:使用内部36pF电容)
外部RC振荡1000-0101
可校准的内部RC振荡
0100-0001
外部时钟0000
外部振荡器的不同工作模式
熔丝位工作频率范围(MHz)C1、C2容量(pF)(仅适用石英晶振)
CKOPTCKSEL3..1
1 101 0.4-0.9 仅适合陶瓷振荡器
1110 0.9-3.0 12-22
1 111 3.0-8.0 12-22
0 101,110,111≥1.0 12-22
当CKOPT被编程时振荡器在输出引脚产生满幅度的振荡。这种模式适合于噪声环境,以及需要通过XTAL2驱动第二个时钟缓冲器的情况。而且这种模式的频率范围比较宽。当保持CKOPT为未编程状态时,振荡器的输出信号幅度比较小。其优点是大大降低了功耗,但是频率范围比较窄,而且不能驱动其他时钟缓冲器。
对于谐振器,CKOPT未编程时的最大频率为8MHz,CKOPT编程时为16MHz。内部RC振荡器工作时不对CKOPT编程。
外部RC振荡器模式
熔丝位(CKSEL3..1)工作频率范围(MHz)
0101≤0.9
0110 0.9-3.0
0111 3.0-8.0
10008.0-12.0
可校准内部RC振荡器工作模式
熔丝位(CKSEL3..0)工作频率范围(MHz)
0001 1.0
0010 2.0
0011 4.0
0100 8.0
JTAGEN:0=JTAG端口使能,1=JTAG端口禁止(不推荐)
OCDEN:0=JTAG DEBUG使用(JTAGICE会自动处理)
BOOT区配置熔丝
BOOTSZ1 BOOTSZ0BOOT区大小BOOT区地址默认
00 1024WORD 0x1C00 默认
01 512WORD 0x1E00
1 0 256WORD 0x1F00
1 1128WORD 0x1F80
● 芯片锁死的主要原因是设错熔丝位,主要有两种情况:
(1)JTAGEN和SPIEN两个熔丝位都为1,不能再进行编程,此时只能用高压并行编程或者有源晶振恢复。
(2)将熔丝位选择了外部晶振或外部RC振荡,而没有接外部晶振或外部RC振荡,或者外接的振荡频率不匹配,导致芯片不能工作,这种情况,需要外挂相应晶体才能再次操作芯片,用户应尽量记起当时设错熔丝的情况,比如错误设置成了外部3-8M晶振,那么外挂一个3-8M晶振即可进行相应操作。
之后了解了熔丝位,可以读取芯片现在的熔丝位了。
可以看到,熔丝位并不是默认值,默认值lfuse应该是e1,因为我使用了12M的外部晶振所以更改过。写入fuses也很简单,只需要whfuse
0 0x99或者wlfuse 0 0xff相似即可。
Dragon+xplain:
输入part
可以发现xmega的资源比么m16要多的很多~哈~
其他都是一样的了,不过既然用了jtag不妨使用下avarice这个仿真用的软件来查看一下。
其中-x是一定要加的否则无法识别xmega这是专门为xmega提供的选项
输出信息
最后一句说明无法调试,查阅了一下官方的说明,xemga调试的时序没有公开所以是无法用此来调试的。所以想调试xmega的话只能不是花钱用IAR就是用avrstudio了.
最后由于AT89S52的使用比较流行因此
sudogedit /etc/avrdude.conf
在最后面加入AT89s52的相关信息(这是JoyShukla写的)
然后保存
现在就可以烧录AT89S52的单片机了.
如果其他单片机的协议公开你想使用的话可以自己加。这款软件的自带说明上说这种工作就是没有太多技术要求而及其枯燥和麻烦的。呵呵。
编译的话建议选择SDCC。
使用51的话参考如下文章
/article/9017254.html
最后说明:附件里的代码都是2种
1:IAR下的ICC
2:GCC-AVR
其中,GCC-AVR是我调试的,例子暂时比较少,但是会不断增加。ICC的也可以保证可行,例子比较全。
-AVRDUDE的使用简介和AVR熔丝位
Galaxy2416
联系方式:sunxiao.gin@gmail.com
附件内容: 例程代码,相关文档,相关软件。
http://download.csdn.net/detail/galaxy_blue/4339966附件网址~
如果安装了avrdude的doc的话(附件里也会有),会得到一个非常全面和详细的使用说明。现在针对常用的几个命令简述一下。
本文环境如下:
OS系统:ubuntu12.04(原为10.04最近升级了)
编译器:avr-gcc
烧录软件:avrdude
对器件进行控制需要先进入AVRDUDE的终端模式。打开终端输入
sudo avrdude -P usb -p m16 -c usbasp -t
就可以进入了,其中-t就是进入其终端控制的命令。
usbasp+m16:
输入part
会得到非常全面的信息。
之后尝试对其eeprom进行操作并且擦除芯片来。
可以看到可以直接对eeprom操作。
然后到了一个关键的时候了,我们要进行熔丝位的处理。就么m16而言,熔丝位一共分为高8位和低8位
时钟源选择
系统时钟源CKSEL3..0
外部石英/陶瓷振荡器
1111-1010
外部低频晶振(32.768KHZ)1001(CKOPT=0:使用内部36pF电容)
外部RC振荡1000-0101
可校准的内部RC振荡
0100-0001
外部时钟0000
外部振荡器的不同工作模式
熔丝位工作频率范围(MHz)C1、C2容量(pF)(仅适用石英晶振)
CKOPTCKSEL3..1
1 101 0.4-0.9 仅适合陶瓷振荡器
1110 0.9-3.0 12-22
1 111 3.0-8.0 12-22
0 101,110,111≥1.0 12-22
当CKOPT被编程时振荡器在输出引脚产生满幅度的振荡。这种模式适合于噪声环境,以及需要通过XTAL2驱动第二个时钟缓冲器的情况。而且这种模式的频率范围比较宽。当保持CKOPT为未编程状态时,振荡器的输出信号幅度比较小。其优点是大大降低了功耗,但是频率范围比较窄,而且不能驱动其他时钟缓冲器。
对于谐振器,CKOPT未编程时的最大频率为8MHz,CKOPT编程时为16MHz。内部RC振荡器工作时不对CKOPT编程。
外部RC振荡器模式
熔丝位(CKSEL3..1)工作频率范围(MHz)
0101≤0.9
0110 0.9-3.0
0111 3.0-8.0
10008.0-12.0
可校准内部RC振荡器工作模式
熔丝位(CKSEL3..0)工作频率范围(MHz)
0001 1.0
0010 2.0
0011 4.0
0100 8.0
JTAGEN:0=JTAG端口使能,1=JTAG端口禁止(不推荐)
OCDEN:0=JTAG DEBUG使用(JTAGICE会自动处理)
BOOT区配置熔丝
BOOTSZ1 BOOTSZ0BOOT区大小BOOT区地址默认
00 1024WORD 0x1C00 默认
01 512WORD 0x1E00
1 0 256WORD 0x1F00
1 1128WORD 0x1F80
● 芯片锁死的主要原因是设错熔丝位,主要有两种情况:
(1)JTAGEN和SPIEN两个熔丝位都为1,不能再进行编程,此时只能用高压并行编程或者有源晶振恢复。
(2)将熔丝位选择了外部晶振或外部RC振荡,而没有接外部晶振或外部RC振荡,或者外接的振荡频率不匹配,导致芯片不能工作,这种情况,需要外挂相应晶体才能再次操作芯片,用户应尽量记起当时设错熔丝的情况,比如错误设置成了外部3-8M晶振,那么外挂一个3-8M晶振即可进行相应操作。
之后了解了熔丝位,可以读取芯片现在的熔丝位了。
可以看到,熔丝位并不是默认值,默认值lfuse应该是e1,因为我使用了12M的外部晶振所以更改过。写入fuses也很简单,只需要whfuse
0 0x99或者wlfuse 0 0xff相似即可。
Dragon+xplain:
sudo avrdude -P usb -p x128a1 -c dragon_jtag -t
输入part
可以发现xmega的资源比么m16要多的很多~哈~
其他都是一样的了,不过既然用了jtag不妨使用下avarice这个仿真用的软件来查看一下。
avarice-x -g -j usb --erase --program --file main.hex :4242
其中-x是一定要加的否则无法识别xmega这是专门为xmega提供的选项
输出信息
JTAGconfig starting. Founda device: AVRDRAGON Serialnumber: 00:a2:00:00:36:48 ReportedJTAG device ID: 0x974C Configuredfor device ID: 0x974C atxmega128a1 JTAGconfig complete. Erasingprogram memory. JTAGICE: Cannot synchronise
最后一句说明无法调试,查阅了一下官方的说明,xemga调试的时序没有公开所以是无法用此来调试的。所以想调试xmega的话只能不是花钱用IAR就是用avrstudio了.
最后由于AT89S52的使用比较流行因此
sudogedit /etc/avrdude.conf
在最后面加入AT89s52的相关信息(这是JoyShukla写的)
#------------------------------------------------------------ #Below chips by added by me .. Joy Shukla(joy_shukla@yahoo.in) #these chips can be programmed with my usbasp programmer(changedatmega8 program) #after adding avrdude support in this file .. #------------------------------------------------------------ #------------------------------------------------------------ #AT89S52 #------------------------------------------------------------ part id = "8052"; desc = "AT89S52"; signature = 0x1E 0x52 0x06; chip_erase_delay= 20000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "xx x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "xx x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 0; memory"flash" size = 8192; paged = no; min_write_delay= 4000; max_write_delay= 9000; readback_p1 = 0xff; readback_p2 = 0xff; read = " 0 0 1 0 0 0 0 0", " x x x a12 a11 a10 a9 a8", "a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; write = " 0 1 0 0 0 0 0 0", " x x x a12 a11 a10 a9 a8", "a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; mode = 0x21; delay = 12; ; memory"signature" size = 3; read = "0 0 1 0 1 0 0 0 x x x 0 0 0 a1a0", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; ; #------------------------------------------------------------
然后保存
现在就可以烧录AT89S52的单片机了.
如果其他单片机的协议公开你想使用的话可以自己加。这款软件的自带说明上说这种工作就是没有太多技术要求而及其枯燥和麻烦的。呵呵。
编译的话建议选择SDCC。
使用51的话参考如下文章
/article/9017254.html
最后说明:附件里的代码都是2种
1:IAR下的ICC
2:GCC-AVR
其中,GCC-AVR是我调试的,例子暂时比较少,但是会不断增加。ICC的也可以保证可行,例子比较全。
相关文章推荐
- Linux下的MCU开发之AVR系列2-AVRDUDE的使用简介和AVR熔丝位
- Linux下的avr系列的编译烧录调试方法 — 大工CSDN – EE01工作室【附件】
- 【Linux 开发】Libevent开源库使用简介及实例
- 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
- 学习笔记:Linux驱动开发git基本使用流程
- 微信小程序开发详解(二)---开发工具使用简介
- Android的Service与BroadcastReceiver之四 BroadcastReceiver 简介、开发与配置;发送广播、有序广播;使用BroadcastReceiver接受系统广播
- android快捷开发框架xUtils简介和使用
- java开发系统内核:像Linux一样使用中断实现内核API
- linux开发初识-csdn文章被攻击找回
- 基于MVC4+EasyUI的Web开发框架之附件上传组件uploadify的使用
- Linux平台下基于C++语言使用gSOAP开发Web Service服务端和客户端程序
- 在linux下使用codelite开发调试cocos2dx工程
- 部署到Linux使用VS Code 开发.NET Core 应用程序
- linux开发之sam9x5 nandflash烧写失败后使用sd卡进行恢复
- Unix/Linux C++应用开发-make工具的使用
- 开发人员学Linux(4):使用JMeter对网站和数据库进行压力测试
- Linux上使用mail命令发送带附件邮件
- Qt简介以及如何配置Qt使用VS2010进行开发
- 使用DDD开发ARM Linux程序