AVR熔丝位的设置<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
初学者对熔丝经常不解,AVR芯片使用熔丝来设定时钟、启动时间、一些功能的使能、BOOT区设定、当然还有最让初学者头疼的保密位,设不好锁了芯片很麻烦。要想使MCU功耗最小也要了解一些位的设定。
1:未编程
0:编程
1.BOD(Brown-out Detection) 掉电检测电路
BODLEVEL(BOD电平选择): 1: 2.7V电平; 0:4.0V电平
BODEN(BOD功能控制): 1:BOD功能禁止;0:BOD功能允许
使用方法:如果BODEN使能(复选框选中)启动掉电检测,则检测电平由BODLEVEL决定。一旦VCC下降到触发电平(2.7v或4.0v)以下,MCU复位;当VCC电平大于触发电平后,经过tTOUT 延时周后重新开始工作。
因为M16L可以工作在2.7v~5.5v,所以触发电平可选2.7v(BODLEVEL=1)或4.0v(BODLEVEL=0);而M16工作在4.5~5.5V,所以只能选BODLEVEL=0,BODLEVEL=1不适用于ATmega16。
2.复位启动时间选择
SUT 1/0: 当选择不同晶振时,SUT有所不同。
如果没有特殊要求推荐SUT 1/0设置复位启动时间稍长,使电源缓慢上升。
3.CKSEL3/0: 时钟源选择(时钟总表)
时钟总表
时钟源 启动延时 熔丝
外部时钟 6 CK + 0 ms CKSEL="0000" SUT="00"
外部时钟 6 CK + 4.1 ms CKSEL="0000" SUT="01"
外部时钟 6 CK + 65 ms CKSEL="0000" SUT="10"
内部RC振荡
1MHZ 6 CK + 0 ms CKSEL="0001" SUT="00"
内部RC振荡1MHZ 6 CK + 4.1 ms CKSEL="0001" SUT="01"
内部RC振荡1MHZ1 6 CK + 65 ms CKSEL="0001" SUT="10"
内部RC振荡2MHZ 6 CK + 0 ms CKSEL="0010" SUT="00"
内部RC振荡
2MHZ 6 CK + 4.1 ms CKSEL="0010" SUT="01"
内部RC振荡2MHZ 6 CK + 65 ms CKSEL="0010" SUT="10"
内部RC振荡4MHZ 6 CK + 0 ms CKSEL="0011" SUT="00"
内部RC振荡4MHZ 6 CK + 4.1 ms CKSEL="0011" SUT="01"
内部RC振荡4MHZ 6 CK + 65 ms CKSEL="0011" SUT="10"
内部RC振荡8MHZ 6 CK + 0 ms CKSEL="0100" SUT="00"
内部RC振荡8MHZ 6 CK + 4.1 ms CKSEL="0100" SUT="01"
内部RC振荡8MHZ 6 CK + 65 ms CKSEL="0100" SUT="10"
外部RC振荡≤0.9MHZ 18 CK + 0 ms CKSEL="0101" SUT="00"
外部RC振荡≤0.9MHZ 18 CK + 4.1 ms CKSEL="0101" SUT="01"
外部RC振荡≤0.9MHZ 18 CK + 65 ms CKSEL="0101" SUT="10"
外部RC振荡≤0.9MHZ 6 CK + 4.1 ms CKSEL="0101" SUT="11"
外部RC振荡0.9-3.0MHZ 18 CK + 0 ms CKSEL="0110" SUT="00"
外部RC振荡0.9-3.0MHZ 18 CK + 4.1 ms CKSEL="0110" SUT="01"
外部RC振荡0.9-3.0MHZ 18 CK + 65 ms CKSEL="0110" SUT="10"
外部RC振荡0.9-3.0MHZ 6 CK + 4.1 ms CKSEL="0110" SUT="11"
外部RC振荡3.0-8.0MHZ 18 CK + 0 ms CKSEL="0111" SUT="00"
外部RC振荡3.0-8.0MHZ 18 CK + 4.1 ms CKSEL="0111" SUT="01"
外部RC振荡3.0-8.0MHZ 18 CK + 65 ms CKSEL="0111" SUT="10"
外部RC振荡3.0-8.0MHZ 6 CK + 4.1 ms CKSEL="0111" SUT="11"
外部RC振荡8.0-12.0MHZ 18 CK + 0 ms CKSEL="1000" SUT="00"
外部RC振荡8.0-12.0MHZ 18 CK + 4.1 ms CKSEL="1000" SUT="01"
外部RC振荡8.0-12.0MHZ 18 CK + 65 ms CKSEL="1000" SUT="10"
外部RC振荡8.0-12.0MHZ 6 CK + 4.1 ms CKSEL="1000" SUT="11"
低频晶振(32.768KHZ) 1K CK + 4.1 ms CKSEL="1001" SUT="00"
低频晶振(32.768KHZ) 1K CK + 65 ms CKSEL="1001" SUT="01"
低频晶振(32.768KHZ) 32K CK + 65 ms CKSEL="1001" SUT="10"
低频石英/陶瓷振荡器(0.4-0.9MHZ) 258 CK + 4.1 ms CKSEL="1010" SUT="00"
低频石英/陶瓷振荡器(0.4-0.9MHZ) 258 CK + 65 ms CKSEL="1010" SUT="01"
低频石英/陶瓷振荡器(0.4-0.9MHZ) 1K CK + 0 ms CKSEL="1010" SUT="10"
低频石英/陶瓷振荡器(0.4-0.9MHZ) 1K CK + 4.1 ms CKSEL="1010" SUT="11"
低频石英/陶瓷振荡器(0.4-0.9MHZ) 1K CK + 65 ms CKSEL="1011" SUT="00"
低频石英/陶瓷振荡器(0.4-0.9MHZ) 16K CK + 0 ms CKSEL="1011" SUT="01"
低频石英/陶瓷振荡器(0.4-0.9MHZ) 16K CK + 4.1ms CKSEL="1011" SUT="10"
低频石英/陶瓷振荡器(0.4-0.9MHZ) 16K CK + 65ms CKSEL="1011" SUT="11"
中频石英/陶瓷振荡器(0.9-3.0MHZ) 258 CK + 4.1 ms CKSEL="1100" SUT="00"
中频石英/陶瓷振荡器(0.9-3.0MHZ) 258 CK + 65 ms CKSEL="1100" SUT="01"
中频石英/陶瓷振荡器(0.9-3.0MHZ) 1K CK + 0 ms CKSEL="1100" SUT="10"
中频石英/陶瓷振荡器(0.9-3.0MHZ) 1K CK + 4.1 ms CKSEL="1100" SUT="11"
中频石英/陶瓷振荡器(0.9-3.0MHZ) 1K CK + 65 ms CKSEL="1101" SUT="00"
中频石英/陶瓷振荡器(0.9-3.0MHZ) 16K CK + 0 ms CKSEL="1101" SUT="01"
中频石英/陶瓷振荡器(0.9-3.0MHZ) 16K CK + 4.1ms CKSEL="1101" SUT="10"
中频石英/陶瓷振荡器(0.9-3.0MHZ) 16K CK + 65ms CKSEL="1101" SUT="11"
高频石英/陶瓷振荡器(3.0-8.0MHZ) 258 CK + 4.1 ms CKSEL="111"0 SUT="00"
高频石英/陶瓷振荡器(3.0-8.0MHZ) 258 CK + 65 ms CKSEL="111"0 SUT="01"
高频石英/陶瓷振荡器(3.0-8.0MHZ) 1K CK + 0 ms CKSEL="111"0 SUT="10"
高频石英/陶瓷振荡器(3.0-8.0MHZ) 1K CK + 4.1 ms CKSEL="111"0 SUT="11"
高频石英/陶瓷振荡器(3.0-8.0MHZ) 1K CK + 65 ms CKSEL="1111" SUT="00"
高频石英/陶瓷振荡器(3.0-8.0MHZ) 16K CK + 0 ms CKSEL="1111" SUT="01"
高频石英/陶瓷振荡器(3.0-8.0MHZ) 16K CK + 4.1ms CKSEL="111"1 SUT="10"
高频石英/陶瓷振荡器(3.0-8.0MHZ) 16K CK + 65ms CKSEL="1111" SUT="11"
高位(BOOT区设置):
1. JTAGEN(JTAG允许): 1:JTAG禁止; 0:JTAG允许
OCDEN(OCD功能允许): 1:OCD功能禁止;0:OCD功能允许
注:OCDEN(On-chip Debug):片上调试使能位
JTAGEN(JTAG使能): JTAG测试访问端口
使用方法:在JTAG调试时,使能OCDEN JTAGEN两位(复选框打勾),并保持所有的锁定位处于非锁定状态;在实际使用时为降低功耗,不使能OCDEN JTAGEN,大约减少2-3mA的电流。
2. SPIEN(SPI下载允许): 1:SPI下载禁止;0:SPI下载使能
注:在ISP的软件里,SPIEN是不能编辑的,默认为0。
3. CKOPT(选择放大器模式): CKOPT=0:高幅度振荡输出;CKOPT
=1:低幅度振荡输出
当CKOPT 被编程时振荡器在输出引脚产生满幅度的振荡。这种模式适合于噪声环境,以及需要通过XTAL2 驱动第二个时钟缓冲器的情况,而且这种模式的频率范围比较宽。当保持CKOPT 为未编程状态时,振荡器的输出信号幅度比较小。其优点是大大降低了功耗,但是频率范围比较窄,而且不能驱动其他时钟缓冲器。
对于谐振器,当CKOPT未编程时的最大频率为8 MHz,CKOPT编程时为16 MHz。内部RC振荡器工作时不对CKOPT编程。
4.EEAVE(烧录时EEPROM数据保留): 1:不保留;0:保留
5.BOOTRST(复位入口选择): 1:程序从0x0000地址开始 0:复位后
从BOOT区执行(参考BOOTSZ0/1)
6.BOOTSZ 1/0(引导区程序大小及入口):
00: 1024Word/0xc00;
01: 512Word/0xe00;
10: 256Word/0xf00;
11: 128Word/0xf80
总之:使用不同的晶振都是在下载时通过设置熔丝位来设定上面的3-8的晶振的设定可以是用做3-16的设定
二 正确配置AVR熔丝位
对AVR熔丝位的配置是比较细致的工作,用户往往忽视其重要性,或感到不易掌握。下面给出对AVR熔丝位的配置操作时的一些要点和需要注意的相关事项。
(1)在AVR的器件手册中,对熔丝位使用已编程(Programmed)和未编程(Unprogrammed)定义熔丝位的状态,“Unprogrammed”表示熔丝状态为“1”(禁止);“Programmed”表示熔丝状态为“0”(允许)。因此,配置熔丝位的过程实际上是“配置熔丝位成为未编程状态“1”或成为已编程状态“0””。
熔丝位状态显示框,显示芯片的各个熔丝位的详细状况,AVR的熔丝位打勾表示0,表示启用该选项;取消表示1,表示不启用该选项,需要注意。
(2)在使用通过选择打钩“√”方式确定熔丝位状态值的编程工具软件时,请首先仔细阅读软件的使用说明,弄清楚“√”表示设置熔丝位状态为“<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />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的应用请参考本章相关内容。
(12)CKOPT
CKOPT 不编程即不打勾时为0状态为晶体振荡器;打勾为选中为谐振器;
XTAL1 与XTAL2 分别为用作片内振荡器的反向放大器的输入和输出,如Figure 12 所示,这个振荡器可以使用石英晶体,也可以使用陶瓷谐振器。熔丝位CKOPT 用来选择这两种放大器模式的其中之一。
当CKOPT 被编程时振荡器在输出引脚产生满幅度的振荡。这种模式适合于噪声环境,以及需要通过XTAL2 驱动第二个时钟缓冲器的情况。而且这种模式的频率范围比较宽。当保持CKOPT 为未编程状态时,振荡器的输出信号幅度比较小。其优点是大大降低了功耗,但是频率范围比较窄,而且不能驱动其他时钟缓冲器。
对于谐振器, CKOPT 未编程时的最大频率为8 MHz, CKOPT 编程时为16 MHz。C1和C2 的数值要一样,不管使用的是晶体还是谐振器。最佳的数值与使用的晶体或谐振器有关,还与杂散电容和环境的电磁噪声有关。Table8 给出了针对晶体选择电容的一些指南。对于陶瓷谐振器,应该使用厂商提供的数值。若想得到更多的有关如何选择电容以及振荡器如何工作的信息,请参考多用途振荡器应用手册。
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熔丝位的改写需要十分慎重,因为一旦改写错误,会造成芯片无法启动。
(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》的目的之一!
用户427929 2012-11-5 11:26