ATMEGA128熔丝位配置详解
AVR系列单片机在仿真调试之前,首先必须对AVR的熔丝位和锁定位进行配置。如果配置不当,则可能造成单片机不能正常工作,严重时可能导致单片机死锁。因此,对单片机熔丝位和锁定位的正确配置显得尤为重要。
熔丝位是对单片机具体功能和工作模式的限定,其正确配置与否直接影响到单片机能否正常工作;锁定位是对单片机的程序和数据进行加密,以防止单片机中的程序和数据被读出或写入。在进行配置时,一般先配置熔丝位,再配置锁定位。锁定位又分为引导程序区锁定位和程序及数据存储器锁定位两类。对引导程序区锁定位进行编程可以实现两套保护模式,即应用区保护模式和Boot Loader区保护模式;不同的编程配置可以实现不同的加密级别。对程序及数据存储器锁定位进行编程可以禁止对并行和SPI/JTAG串行编程模式中Flash和EEPROM进一步编程,从而对程序和存储器中的数据进行保护。
由于引导程序锁定位和程序及数据存储器锁定位的配置具有可逆性,因此可根据不同的需要多次编程,灵活改变。但是,在配置熔丝位时应特别注意,部分熔丝位(如OCDEN、JTAGEN和SPIEN等)的配置是不可逆的。在采用单一编程下载情况下(例如只采用JTAG下载或者只采用AVRISP并行下载),一旦配置后将不可改变。鉴于熔丝位配置的重要性,本文以AVR系列的ATmega128单片机为例,详细介绍熔丝位的配置以及在配置过程中常出现的一些问题,并给出相应的解决办法,成功地解决了因熔丝位配置不当而引起的单片机不能正常工作和死锁等一系列问题。
1 熔丝位的配置
ATmega128的熔丝位共有3个字节: 熔丝位扩展字节、熔丝位高字节和熔丝位低字节。表1、表2和表3分别描述了所有熔丝位的功能、默认值以及它们是如何映射到熔丝位字节的。如果熔丝位被编程,则返回值为0。表中0代表编程,1代表未编程。
表1 熔丝位扩展字节
表2 熔丝位高字节
表3 熔丝位低字节
2 熔丝位配置常见问题
(1) ATmega128部分引脚功能不可用
这是一个典型的ATmega103兼容模式熔丝位没有正确配置的问题。ATmega128与ATmega103的引脚百分百兼容,而且通过编程熔丝位M103C,使ATmega128和ATmega103从RAM、I/O引脚和中断向量角度完全兼容,在使用上完全取代ATmega103。但在兼容模式下ATmega128的一些新特点无法使用:① 只剩下一个USART,而且只支持异步模式,波特率只有低8位可用;② 只有1个16位定时器和2个比较器,而不是2个16位定时器和3个比较器;③ 不支持两线接口;④ 端口C只能输出;⑤ 端口G可能用作第二功能,而不能作为通用I/O端口;⑥ 端口F只能作为输入,而不能作为ADC的模拟输入引脚;⑦ 不支持引导程序功能;⑧ 不能调节片内RC振荡器的频率。这些新
特点无法使用,直接导致ATmega128部分引脚功能不可用。
(2) ATmega128启动后停止在Boot Loader区
这是一个复位向量熔丝位和Boot区大小选择熔丝位没有正确配置的问题。ATmega128具有128 KB的系统内可编程Flash。它由两个区构成,即应用区和Boot Loader区;两个区的大小可通过BOOTSZ熔丝位配置。在默认配置下,应用区区间为0000H~EFFFH;Boot Loader区区间为F000H~FFFFH。
(3) USART不能或不能正确收发数据
这是一个较难解决的问题,可分两步来排除错误。首先检查USART的工作模式、数据帧和波特率等设置是否正确;然后根据表4中波特率的计算公式计算BAUD值和UBRR值。如果计算出的BAUD值与设置的波特率值相差很远,则说明晶振没有正常工作或晶振频率选择得不对,这时应对晶振的熔丝位进行正确配置。在默认状态下,ATmega128工作于内部提供的晶振1 MHz下。若要使ATmega128工作于外部晶振下,应对相应的熔丝位进行配置。
表4 波特率计算公式
(4) ATmega128的PF口不能正常工作
ATmega128的PF口是普通I/O口、数模转换口和JTAG接口的分时复用口。PF口用作JTAG接口后,不能再用作普通I/O口;若想作普通I/O使用,则须对熔丝位进行编程禁止JTAGEN使能端。
(5) JTAG仿真器不能连接到目标板
出现这一问题主要是由于JTAGEN使能端熔丝位被编程为禁止。如果使用JTAG仿真器进行程序编程下载,则此时JTAGEN使能端的熔丝位不可恢复。
3 ATmega128死锁的预防和解救措施
ATmega128的JTAG接口支持片内调试和程序下载,还能实现对Flash、EEPROM、熔丝位和锁定位的编程,其接口电路如图1所示。虽然JTAG接口使用非常方便,但是存在因熔丝位JTAGEN使能端配置不当而造成单片机死锁的安全隐患。
图1 ATmega128的JTAG接口电路
ATmega128死锁的预防原理: ATmega128程序的下载方式有JTAG下载和AVRISP下载两种,通过这两种方式都可以进行熔丝位的配置。如果只使用JTAG接口,则当熔丝位JTAGEN使能端配置为禁止时,不能再通过JTAG接口恢复。理论上,如果只使用AVRISP接口,则当熔丝位SPIEN使能端禁止后也不能再通过AVRISP接口恢复。但这种情况一般不会出现,因为芯片在出厂时已默认为SPI编程使能,且不可再对其进行配置。因此当使用JTAG接口时应预设AVRISP接口,以便当JTAGEN使能端被禁止时仍可通过AVRISP接口恢复,从而达到预防单片机死锁的目的。
ATmega128死锁后解救措施: 首先制作一条AVRISP并行下载线,电路如图2所示。对于ATmega128和ATmega64,图中MOSI和MISO分别用引脚PE0(PDI/RXD)和PE1(PDO/TXD)替代。把并行口连接到计算机,10针接口与目标板上单片机预留的AVRISP接口相连;通过双龙公司的SLAVRISP软件进行相应的熔丝位配置,就能重新使能JTAGEN使能端,从而达到单片机死锁后解救的目的。
ATmega128死锁后解救措施: 首先制作一条AVRISP并行下载线,电路如图2所示。对于ATmega128和ATmega64,图中MOSI和MISO分别用引脚PE0(PDI/RXD)和PE1(PDO/TXD)替代。把并行口连接到计算机,10针接口与目标板上单片机预留的AVRISP接口相连;通过双龙公司的SLAVRISP软件进行相应的熔丝位配置,就能重新使能JTAGEN使能端,从而达到单片机死锁后解救的目的。
4 结论
熔丝位的正确配置是学习和使用AVR单片机的第一步。熔丝位配置不当,可能出现单片机不能正常工作和死锁等一系列问题。本文列举了熔丝位在配置过程中常出现的一些典型问题,并给出了相应的解决办法,尤其详细介绍了一种ATmega128死锁的预防和解救办法。这些典型问题和解决办法有助于正确地理解与配置AVR单片机的熔丝位,对初学者起到参考作用。
——————————————————
初学者对熔丝经常不解,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
赞() |