关于avr的熔丝的使用和设置(摘自《M128》上)
看到这么多的人对AVR的熔丝位不会使用和误操作,给出参考。5.1.1 正确配置AVR熔丝位
对AVR熔丝位的配置是比较细致的工作,用户往往忽视其重要性,或感到不易掌握。下面给出对AVR熔丝位的配置操作时的一些要点和需要注意的相关事项。有关ATmega128熔丝位的具体定义和功能请查看本书相关章节,在附录中将给出一个完整的汇总表。
(1)在AVR的器件手册中,对熔丝位使用已编程(Programmed)和未编程(Unprogrammed)定义熔丝位的状态,“Unprogrammed”表示熔丝状态为“1”(禁止);“Programmed”表示熔丝状态为“0”(允许)。因此,配置熔丝位的过程实际上是“配置熔丝位成为未编程状态“1”或成为已编程状态“0””。
(2)在使用通过选择打钩“√”方式确定熔丝位状态值的编程工具软件时,请首先仔细阅读软件的使用说明,弄清楚“√”表示设置熔丝位状态为“0”还是为“1”。
(3)使用CVAVR中的编程下载程序时应特别注意,由于CVAVR编程下载界面初始打开时,大部分熔丝位的初始状态定义为“1”,因此不要使用其编程菜单选项中的“all”选项。此时的“all”选项会以熔丝位的初始状态定义来配置芯片的熔丝位,而实际上其往往并不是用户所需要的配置结果。如果要使用“all”选项,应先使用“read->fuse bits”读取芯片中熔丝位实际状态后,再使用“all” 选项。
(4)新的AVR芯片在使用前,应首先查看它熔丝位的配置情况,再根据实际需要,进行熔丝位的配置,并将各个熔丝位的状态记录备案。
(5)AVR芯片加密以后仅仅是不能读取芯片内部Flash和E2PROM中的数据,熔丝位的状态仍然可以读取但不能修改配置。芯片擦除命令是将Flash和E2PROM中的数据清除,并同时将两位锁定位状态配置成“11”,处于无锁定状态。但芯片擦除命令并不改变其它熔丝位的状态。
(6)正确的操作程序是:在芯片无锁定状态下,下载运行代码和数据,配置相关的熔丝位,最后配置芯片的锁定位。芯片被锁定后,如果发现熔丝位配置不对,必须使用芯片擦除命令,清除芯片中的数据,并解除锁定。然后重新下载运行代码和数据,修改配置相关的熔丝位,最后再次配置芯片的锁定位。
(7)使用ISP串行方式下载编程时,应配置SPIEN熔丝位为“0”。芯片出厂时SPIEN位的状态默认为“0”,表示允许ISP串行方式下载数据。只有该位处于编程状态“0”,才可以通过AVR的SPI口进行ISP下载,如果该位被配置为未编程“1”后,ISP串行方式下载数据立即被禁止,此时只能通过并行方式或JTAG编程方式才能将SPIEN的状态重新设置为“0”,开放ISP。通常情况下,应保持SPIEN的状态为“0”,允许ISP编程不会影响其引脚的I/O功能,只要在硬件电路设计时,注意ISP接口与其并接的器件进行必要的隔离,如使用串接电阻或断路跳线等。
(8)当你的系统中,不使用JTAG接口下载编程或实时在线仿真调试,且JTAG接口的引脚需要作为I/O口使用时,必须设置熔丝位JTAGEN的状态为“1”。芯片出厂时JTAGEN的状态默认为“0”,表示允许JTAG接口,JTAG的外部引脚不能作为I/O口使用。当JTAGEN的状态设置为“1”后,JTAG接口立即被禁止,此时只能通过并行方式或ISP编程方式才能将JTAG重新设置为“0”,开放JTAG。
(9)一般情况下不要设置熔丝位把RESET引脚定义成I/O使用(如设置ATmega8熔丝位RSTDISBL的状态为“0”),这样会造成ISP的下载编程无法进行,因为在进入ISP方式编程时前,需要将RESET引脚拉低,使芯片先进入复位状态。
(10)使用内部有RC振荡器的AVR芯片时,要特别注意熔丝位CKSEL的配置。一般情况下,芯片出厂时CKSEL位的状态默认为使用内部1MHz的RC振荡器作为系统的时钟源。如果你使用了外部振荡器作为系统的时钟源时,不要忘记首先正确配置CKSEL熔丝位,否则你整个系统的定时都会出现问题。而当在你的设计中没有使用外部振荡器(或某钟特定的振荡源)作为系统的时钟源时,千万不要误操作或错误的把CKSEL熔丝位配置成使用外部振荡器(或其它不同类型的振荡源)。一旦这种情况产生,使用ISP编程方式则无法对芯片操作了(因为ISP方式需要芯片的系统时钟工作并产生定时控制信号),芯片看上去“坏了”。此时只有使用取下芯片使用并行编程方式,或使用JTAG方式(如果JTAG为允许时且目标板上留有JTAG接口)来解救了。另一种解救的方式是:尝试在芯片的晶体引脚上临时人为的叠加上不同类型的振荡时钟信号,一旦ISP可以对芯片操作,立即将CKSEL配置成使用内部1MHz的RC振荡器作为系统的时钟源,然后再根据实际情况重新正确配置CKSEL。
(11)使用支持IAP的AVR芯片时,如果你不使用BOOTLOADER功能,注意不要把熔丝位BOOTRST设置为“0”状态,它会使芯片在上电时不是从Flash的0x0000处开始执行程序。芯片出厂时BOOTRST位的状态默认为“1”。关于BOOTRST的配置以及BOOTLOADER程序的设计与IAP的应用请参考本章相关内容。
5.1.2 ATmega128中重要熔丝位的配置
上一小节介绍了配置AVR熔丝位的要点和注意事项,本小节把在一般情况下使用ATmega128时,几个重要的熔丝位配置情况进行说明。
(1)熔丝位M103C。M103C的配置将设定ATmega128是以ATmega103兼容方式工作运行还是以ATmega128本身的方式工作运行。ATmega128在出厂时M103C默认状态为“0”,即默认以ATmega103兼容方式工作。当用户系统设计使芯片以ATmega128方式工作时,应首先将M103C的状态配置为“1”。
(2)CLKSEL0..3。CLKSEL0、CLKSEL1、CLKSEL2、CLKSEL3用于选择系统的时钟源。有五种不同类型的时钟源可供选择(每种类型还有细的划分)。芯片出厂时的默认情况为CLKSEL3..0和SUT1..0分别是“0001”和“10”。即使用内部1MHz RC振荡器,使用最长的启动延时。这保证了无论外部振荡电路是否工作,都可以进行最初的ISP下载。对于CLKSEL3..0熔丝位的改写需要十分慎重,因为一旦改写错误,会造成芯片无法启动,见上一小节第10点说明。
(3)JTAGEN。如果不使用JTAG接口,应将JTAGEN的状态设置为“1”,即禁止JTAG,JTAG引脚用于I/O口。
(4)SPIEN。SPI方式下载数据和程序允许,默认状态为允许“0”。一般保留其状态。
(5)WDTON。看门狗的定时器始终开启。WDTON默认为“1”,即禁止看门狗的定时器始终开启。如果该位设置为“0”后,看门狗的定时器就会始终打开,不能被内部程序控制了,这是为了防止当程序跑飞时,未知代码通过写寄存器将看门狗定时器关断而设计的(尽管关断看门狗定时器需要特殊的方式,但它保证了更高的可靠行)。
(6)EESAVE。执行擦除命令时是否保留E2PROM中的内容,默认状态为“1”,表示E2PROM中的内容同Flash中的内容一同擦除。如果该位设置为“0”,对程序进行下载前的擦除命令只会对FLASH代码区有效,而对E2PROM区无效。这对于希望在系统更新程序时,需要保留E2PROM中数据的情况下是十分有用的。
(7)BOOTRST。决定芯片上电起动时,第一条执行指令的地址。默认状态为“1”,表示起动时从0x0000开始执行。如果BOOTRST设置为“0”,则起动时从BOOTLOADER区的起始地址处开始执行程序。BOOTLOADER区的大小由BOOTSZ1和BOOTSZ0决定,因此其首地址也随之变化。
(8)BOOTSZ1和BOOTSZ0:这两位确定了BOOTLOADER区的大小以及其起始的首地址。默认的状态为“00”,表示BOOTLOADER区为4096字,起始首地址为0xF000。
(9)推荐用户使用ISP方式配置熔丝位。配置工具选用BASCOM-AVR(网上下载试用版,它对ISP下载无限制),和STK200/STK300兼容的下载电缆(见第四章内容)。
注:不同AVR的熔丝也不同,使用前必须仔细查看芯片手册。
要重视手册学习,不仅是掌握如何使用,也是从根本上认识和掌握原理和结构。对于硬件工程师来将,数据手册是真正的“经书”,其它都是“修练经验”。不熟读“经书”,你无法修_炼成“仙”的。这也是《M128》、《M8》的目的之一! 谢谢马老师!!!!!!!!!!!!!!!!!!!!!!!!!!! 马老师写的东西真实言简意赅,一看就明白!!pfpf!!! 都怪我眼浊,没有看到,要不就这几天不会这么郁闷了,谢谢马老师~ 大家要多点留意“马潮老师专栏” 啊。大家可以在三个地方找到入口:
1。主页上的红色字体的入门
2。论坛上的滚动广告入口
3。论坛的分类入口。 没发现对我有用的 m48的呢 M48的在M48的器件手册中。
你真的了解了M128的熔丝作用,再参考48手册对照一下,有特殊的地方,但大部分相同。 正在学习 ATmega128 谢谢提供资料!!! 听马老师的话! 谢谢 谢谢马老师的资料
有个问题要请教您
是5.1.1第(10)里面关于解救的方法:另一种解救的方式是:尝试在芯片的晶体引脚上临时人为的叠加上不同类型的振荡时钟信号,一旦ISP可以对芯片操作,立即将CKSEL配置成使用内部1MHz的RC振荡器作为系统的时钟源,然后再根据实际情况重新正确配置CKSEL。
人为的叠加上不同类型的振荡时钟信号,是什么意思?
我在网上看到一种办法,是反接工作正常的51板子的晶振,上电后可以设置熔丝位了,这时是不是应该配置成它出厂的熔丝位配置? AVR芯片锁死的解救是有条件的:
1.首先芯片本身没有坏(多余了)
2.如果RESET引脚被禁止作为I/O用了(如M48,M8等),那么通过通常的串行编程方式是不能解救的(这类芯片通常没有JTAG口).
3.如果SPI和JTAG都被禁止了,那么通过通常的串行编程方式是不能解救的.
4.2、3情况只能通过高压串行或高压并行方式解救,当然,通常就要把芯片从板上取下了。
我所讲的“解救”,主要是由于时钟熔丝配置错误造成的锁死,但SPI或JTAG是允许的。这种情况通常发生在系统设计使用内部RC振荡源的情况下,这时X1、X2为空脚,或作为I/O使用。但下载程序时出现问题,或熔丝配置错误,选择了非内部RC振荡源。由于此时AVR无系统时钟源,表现为锁死。
错误的出现可能为:
1。配置错误,这是人为的。
2。下载程序过程中,突然断电;下载接头接触不良;下载器本身不稳定。
3。错误的使用下载功能,如CVAVR中下载功能中的ALL(当熔丝位没有正确选择)。有些下载软件的功能不是非常完善,如使用CVAVR中下载功能的ALL项,不先读一次熔丝位就使用肯定出问题(通常会将SPI也禁止了)因为初始化的熔丝配置都不打勾。另外还有使用SPI下载,但还能让用户配置SPIEN等,也是不完善的。
如果仅仅是系统熔丝配置错误,那么可以通过尝试在芯片的晶体引脚上临时人为的叠加上不同类型的振荡时钟信号进行解救。如将一个5v/1M的脉冲波加在X1上(地当然要连通了),或用2个电容和一个晶体临时搭个外部电路加在X1、X2上。如果板上AVR的X1、X2没有使用还是比较方便的,如果X1、X2已经作为I/O使用连接了其它外部器件的话,就可能也行不通。因为外部连接的器件可能会影响叠加上的时钟信号的。
另外,叠加上的时钟信号频率不要太高,1M左右比较合适,因为通常叠加时引线比较长,频率高的话,振荡信号不稳定了。还必须注意将ISP下载的频率降低,因为AVR规定,ISP下载频率必须是系统时钟的1/2以下。因此,叠加1M的话,ISP的频率不能大于500K。 危机解除了,外接了51板子上的晶振就可以重新设置熔丝位了
昨天才发现SPIEN位居然打上勾了,原本是不可点的选项,为什么会突然打上勾呢?
而且我的下载线也坏掉了 向马老师问个很弱的问题,AVR32是不是要在烧写时烧写熔丝位才能是AVR32的时钟频率为外接晶振呢 你是问Mega32还是AVR32?
AVR 和 AVR32是完全不同的东西. 我是AVR的初学者,我有个问题想请教马老师:
我使用的是ATmega16的芯片,用ISP串行方式下载编程,熔丝配置错误,用了外部振荡器作为系统的时钟源,然后就不能下载了,我以前看见过老师操作,为什么他可以随便地改变熔丝配置的时钟,而不被锁,为什么我的就不能,反被锁了呢???
后来我以为芯片坏了,又买了个16的,在使用时,我居然设置熔丝位JTAGEN的状态打上勾即为“1”,然后就不能下载编程了,可能这就是你所说的,当JTAGEN的状态设置为“1”后,JTAG接口立即禁止,JTAG的外部引脚不能作为I/O口使用,我想问怎样通过并行方式或ISP编程方式才能将JTAG重新设置为“0”,开放JTAG???现在我的两个芯片都不能下载了,求马老师帮帮忙!!! 收藏,谢谢. 学习 马老师,我是个AVR单片机初学者,请问《M128》这本书的全称是什么?我现在有块M128的芯片,正打算好好学习它,就是找不到相对应的教程。 《M128》不适合初学人员,建议你先从M16开始学习.本栏里有基于M16教材的前两篇电子稿下载,可参考. 谢谢,马老师! 而当在你的设计中没有使用外部振荡器(或某钟特定的振荡源)作为系统的时钟源时,千万不要误操作或错误的把CKSEL熔丝位配置成使用外部振荡器(或其它不同类型的振荡源)。一旦这种情况产生,使用ISP编程方式则无法对芯片操作了(因为ISP方式需要芯片的系统时钟工作并产生定时控制信号),芯片看上去“坏了”。此时只有使用取下芯片使用并行编程方式,或使用JTAG方式(如果JTAG为允许时且目标板上留有JTAG接口)来解救了。
配置成使用外部振荡器--在外面加上晶振不就符合条件了,为什么还要拿下芯片恢复?
AVR内部的振荡器是不是只要有:VCC+晶振+配置外部晶体熔丝就可以振荡了? 好象我已经讲的很明白和很全面了,楼上还有什么不明白?
“配置成使用外部振荡器--在外面加上晶振不就符合条件了”===》你要加的上呀,如果PCB上根本没有设计加晶体和电容,你怎么加?
“为什么还要拿下芯片恢复?”不拿下也可以,后面不是讲了还可以“强行”在引脚上叠加时钟信号解救吗? 这样啊,了解了.我刚看完论坛中一些有关熔丝的帖子,我的理解是,一般实验下只要注意AVR的SPI和RESET熔丝就不必担心ISP下载不了...
谢谢马老师的回答,没想到您这么晚还在线...辛苦了.
不过我却遇到一个新问题,我用M16+16M晶体无法使用ISP下载.运行程序时测量IO电压,能随代码变化,晶体应该起振了,但ISP提示效验失败.使用8M晶体正常.
硬件:自己DIY的M16最小系统,仅连接了ISP下载口.ISP线使用HC244的成品下载线.
软件:双龙的SLISP V1.6.0.5,熔丝位仅改变CKSEL为1111.
我自己猜想的几个原因:
1,正常,本来不支持16M时钟下的ISP编程?
2,我的最小系统硬件有问题?
3,16M晶体的电容大小问题?
4,ISP上位机设置问题?
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_344723.jpg
(原文件名:m16 isp.jpg) mark~` 看官方PDF是真正的经书啊!`这话一点也没错```不过刚入门确实头疼`
经历了一个多月的时间我才能看懂经书`学51用了一星期就基本掌握了内部结构
所以AVR也有个“平凡老师”该多好! 51是“普桑”,而AVR相当“F1”了。
学习掌握了AVR后,更加容易进入32位的层次。 mark 记号 实用知识,记号 ji 学习 多谢马老师!!! 不错,回头好好看看! 收藏了 mark mark 马老师好 Mark! 谢谢老师! 看的晕晕的。先mark 学习了 刚接解AVR,注_册该论坛后,受益匪浅啊 学习了……………………
页:
[1]