Linux下的MCU开发之AVR系列2-AVRDUDE的使用简介和AVR熔丝位

Linux下的MCU开发之AVR系列2

-AVRDUDE的使用简介和AVR熔丝位

Galaxy2416

联系方式:[email protected]

附件内容: 例程代码,相关文档,相关软件。

http://download.csdn.net/detail/galaxy_blue/4339966附件网址~

如果安装了avrdudedoc的话(附件里也会有),会得到一个非常全面和详细的使用说明。现在针对常用的几个命令简述一下。

本文环境如下:

OS系统:ubuntu12.04(原为10.04最近升级了)

编译器:avr-gcc

烧录软件:avrdude

对器件进行控制需要先进入AVRDUDE的终端模式。打开终端输入

[plain]   view plain copy
  1. sudo avrdude -P usb -p m16 -c usbasp -t  

就可以进入了,其中-t就是进入其终端控制的命令。

usbasp+m16:

Linux下的MCU开发之AVR系列2-AVRDUDE的使用简介和AVR熔丝位_第1张图片

输入part

会得到非常全面的信息。

Linux下的MCU开发之AVR系列2-AVRDUDE的使用简介和AVR熔丝位_第2张图片


之后尝试对其eeprom进行操作并且擦除芯片来。


Linux下的MCU开发之AVR系列2-AVRDUDE的使用简介和AVR熔丝位_第3张图片

可以看到可以直接对eeprom操作。


然后到了一个关键的时候了,我们要进行熔丝位的处理。就么m16而言,熔丝位一共分为高8位和低8


Linux下的MCU开发之AVR系列2-AVRDUDE的使用简介和AVR熔丝位_第4张图片


时钟源选择


系统时钟源CKSEL3..0
外部石英/陶瓷振荡器 1111-1010
外部低频晶振(32.768KHZ)1001(CKOPT=0:使用内部36pF电容)
外部RC振荡1000-0101
可校准的内部RC振荡 0100-0001
外部时钟0000
外部振荡器的不同工作模式

熔丝位工作频率范围(MHz)C1C2容量(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未编程时的最大频率为8MHzCKOPT编程时为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


 芯片锁死的主要原因是设错熔丝位,主要有两种情况:
1JTAGENSPIEN两个熔丝位都为1,不能再进行编程,此时只能用高压并行编程或者有源晶振恢复。
2)将熔丝位选择了外部晶振或外部RC振荡,而没有接外部晶振或外部RC振荡,或者外接的振荡频率不匹配,导致芯片不能工作,这种情况,需要外挂相应晶体才能再次操作芯片,用户应尽量记起当时设错熔丝的情况,比如错误设置成了外部3-8M晶振,那么外挂一个3-8M晶振即可进行相应操作。



之后了解了熔丝位,可以读取芯片现在的熔丝位了。

Linux下的MCU开发之AVR系列2-AVRDUDE的使用简介和AVR熔丝位_第5张图片


可以看到,熔丝位并不是默认值,默认值lfuse应该是e1,因为我使用了12M的外部晶振所以更改过。写入fuses也很简单,只需要whfuse 0 0x99或者wlfuse 0 0xff相似即可。


Dragon+xplain:


[plain]   view plain copy
  1. sudo avrdude -P usb -p x128a1 -c dragon_jtag -t  


输入part


Linux下的MCU开发之AVR系列2-AVRDUDE的使用简介和AVR熔丝位_第6张图片


可以发现xmega的资源比么m16要多的很多~哈~


其他都是一样的了,不过既然用了jtag不妨使用下avarice这个仿真用的软件来查看一下。


[plain]   view plain copy
  1. avarice-x -g -j usb --erase --program --file main.hex :4242  


其中-x是一定要加的否则无法识别xmega这是专门为xmega提供的选项

输出信息

[plain]   view plain copy
  1. JTAGconfig starting.    
  2. Founda device: AVRDRAGON    
  3. Serialnumber: 00:a2:00:00:36:48    
  4. ReportedJTAG device ID: 0x974C    
  5. Configuredfor device ID: 0x974C atxmega128a1    
  6. JTAGconfig complete.    
  7. Erasingprogram memory.    
  8. JTAGICE: Cannot synchronise    


最后一句说明无法调试,查阅了一下官方的说明,xemga调试的时序没有公开所以是无法用此来调试的。所以想调试xmega的话只能不是花钱用IAR就是用avrstudio.


最后由于AT89S52的使用比较流行因此

sudogedit /etc/avrdude.conf


在最后面加入AT89s52的相关信息(这是JoyShukla写的)

[plain]   view plain copy
  1. #------------------------------------------------------------  
  2. #Below chips by added by me .. Joy Shukla([email protected])  
  3. #these chips can be programmed with my usbasp programmer(changedatmega8 program)  
  4. #after adding avrdude support in this file ..  
  5. #------------------------------------------------------------  
  6.   
  7. #------------------------------------------------------------  
  8. #AT89S52  
  9. #------------------------------------------------------------  
  10. part  
  11. id = "8052";  
  12. desc = "AT89S52";  
  13. signature = 0x1E 0x52 0x06;  
  14. chip_erase_delay= 20000;  
  15. pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1",  
  16. "xx x x x x x x x x x x x x x x";  
  17.   
  18. chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x",  
  19. "xx x x x x x x x x x x x x x x";  
  20.   
  21. timeout = 200;  
  22. stabdelay = 100;  
  23. cmdexedelay = 25;  
  24. synchloops = 32;  
  25. bytedelay = 0;  
  26. pollindex = 3;  
  27. pollvalue = 0x53;  
  28. predelay = 1;  
  29. postdelay = 1;  
  30. pollmethod = 0;  
  31.   
  32. memory"flash"  
  33. size = 8192;  
  34. paged = no;  
  35. min_write_delay= 4000;  
  36. max_write_delay= 9000;  
  37. readback_p1 = 0xff;  
  38. readback_p2 = 0xff;  
  39. read = " 0 0 1 0 0 0 0 0",  
  40. " x x x a12 a11 a10 a9 a8",  
  41. "a7 a6 a5 a4 a3 a2 a1 a0",  
  42. " o o o o o o o o";  
  43.   
  44. write = " 0 1 0 0 0 0 0 0",  
  45. " x x x a12 a11 a10 a9 a8",  
  46. "a7 a6 a5 a4 a3 a2 a1 a0",  
  47. " i i i i i i i i";  
  48. mode = 0x21;  
  49. delay = 12;  
  50. ;  
  51.   
  52. memory"signature"  
  53. size = 3;  
  54. read = "0 0 1 0 1 0 0 0 x x x 0 0 0 a1a0",  
  55. "0 0 0 0 0 0 0 0 o o o o o o o o";  
  56. ;  
  57. ;  
  58. #------------------------------------------------------------  


然后保存

现在就可以烧录AT89S52的单片机了.

如果其他单片机的协议公开你想使用的话可以自己加。这款软件的自带说明上说这种工作就是没有太多技术要求而及其枯燥和麻烦的。呵呵。

编译的话建议选择SDCC

使用51的话参考如下文章

http://blog.csdn.net/galaxy_blue/article/details/7599883




最后说明:附件里的代码都是2

1IAR下的ICC

2GCC-AVR

其中,GCC-AVR是我调试的,例子暂时比较少,但是会不断增加。ICC的也可以保证可行,例子比较全。

你可能感兴趣的:(linux,AVR,avrdude)