第7讲 熔丝位与锁定位

单片机运行时需要对芯片进行一个基础的状态设置,AVR单片机对芯片功能的设置是通过熔丝位来实现的。单片机在出厂时,熔丝位有一个默认值,如果你不对熔丝位进行编程更改,单片机会使用默认的设置工作。本章主要介绍熔丝位和锁定位的设置方法以及AVR单片机的复位源。

5.1

熔丝位

提到熔丝位,你一定吓坏了。因为很多介绍AVR的书籍或网络媒体都会大谈熔丝位设置是如何的关键,以致错误的设置熔丝位会造成芯片锁死等。其实,AVR单片机的熔丝位设置非常简便,而且熔丝位的设置是可逆的,错误的设置只会导致芯片功能的暂时失效,并不会对芯片造成物理的损害。配合Atmel Studio 6.1集成开发环境,正确地设置熔丝位与打开一个普通的Word窗口更改字体的难度基本相当。以下,我们就来详细地介绍ATmega32单片机的熔丝位以及如何快速地完成对熔丝位的设置。

5.1.1

熔丝位的功能

AVR单片机通过熔丝位来实现对时钟源、JTAG接口等基础功能的设定,对熔丝位的设置是通过对其编程(读为0)或不编程(读为1)来实现的。ATmega32单片机片内熔丝位是由两个字节构成的,具体功能如下:

1.熔丝位的高字节

bit 7OCDEN:片上调试系统OCD(On-chip Debug)使能位。该位默认值为1(未编程),禁用OCD。当使用JTAG接口的仿真功能时,需编程该位。

bit 6JTAGEN:JTAG接口使能位。该位默认值为0(已编程),JTAG接口使能。当JTAGEN位没有被编程的情况下,TDI、TDO、TMS、TCK引脚为正常的I/O端口,TAP控制器处于复位状态,JTAG功能关闭。通常情况下请勿关闭JTAG接口,否则通过JTAG接口的仿真和下载功能会无法使用。

bit 5SPIEN:SPI功能使能位。该位默认值为0(已编程),SPI串行程序和数据下载功能被使能。使用ISP串行下载方式对单片机编程时,该位会强制开启且无法更改。在使用JTAG接口编程/仿真器修改此位时,要特别注意禁用该功能会使基于SPI的串行下载器对芯片编程失效。

bit 4CKOPT:振荡器选择位。该位默认值为1(未编程),禁用此功能。CKOPT位用于提高单片机片内振荡器的输出功率,加大对晶振/陶瓷谐振器的驱动能力。该位启用后可以拓展晶振/陶瓷谐振器的频率适用范围,推荐在常规状态下启用该功能,但功耗会相应提高。

bit 3EESAVE:芯片擦除时E2PROM内容保护位。该位默认值为1(未编程)。此功能一般不使用。

bit 2-1BOOTSZ1:0:BOOT区大小选择位。该位默认值为0(已编程)。此功能一般无需更改。

bit 0BOOTRST:复位向量选择位。该位默认值为1(未编程),复位后程序从FLASH的0x0000地址开始执行。该位为0时,复位后程序从BOOT区开始执行。此功能可以用于IAP升级,编程此位会使单片机不能正常启动,通常情况下无需更改,使用默认值即可。

2.熔丝位的低字节

bit 7BODLEVEL:BOD触发电平选择位。该位默认值为1(未编程),此时BOD掉电检测门限电压为2.7V,如果系统电压低于此值时CPU复位。当BODLEVEL位为0时,BOD掉电检测门限电压为4V。

bit 6BODEN:BOD功能使能位。该位默认值为1(未编程),掉电检测功能禁用。当BODEN位为0时,掉电检测功能被允许。

bit 5-4SUT1:0:复位时启动时间选择位。具体设置详见附录B。

bit 3-0CKSEL3:0:时钟源选择位。默认值为0001,即时钟源为片内RC振荡器,输出时钟频率为1MHz。时钟源可以根据硬件实际情况进行选择,具体设置详见表6-1。

熔丝位的功能和默认值详见表5-1。

5.1.2

熔丝位的设定

在Atmel Studio 6.1集成开发环境中提供了一种便捷的熔丝位设置方法,它将各种配置进行了组合,并且使用下拉菜单的方式供用户选择,这使熔丝位的设置变得清晰且直观。接下来我们就一起体验一下在Atmel Studio 6.1集成开发环境中如何对熔丝位进行设置。

首先,将AVRISP mkⅡ编程器连接至AVR系统板,并将编程器的USB接口连接到电脑上,打开Atmel Studio 6.1软件,单击任务栏上的“Device Programming”(编程按钮)按钮,如图5-1所示。

此时会弹出“Device Programming”窗口,在“Tool”项中选择“AVRISP mkⅡ”,在“Device”项中选择目标单片机型号为“ATmega32A”,鼠标单击“Apply”按钮,在刷新后的窗口左侧中选择“Fuses”(熔丝位)选项,如图5-2所示。

从图5-2中可以看出,ATmega32单片机的熔丝位选项已经用菜单的方式列出。我们已经知道,熔丝位的设置有两种状态,即编程(对该位写0)或不编程(对该位写1)两种,在熔丝位设置窗口中,编程状态对应的是在熔丝位名称后面打“√”,图中JTAGEN和SPIEN两个熔丝位即为编程状态。

注意:JTAGEN和SPIEN两个熔丝位在芯片默认的情况下是勾选的,如果我们此时更改了默认的设置,即将后面的“√”去掉,将会使芯片无法通过JTAG或SPI串行方式编程或仿真,此时软件会对你的操作给出警告。一旦你将SPIEN和JTAGEN均设定为未编程状态,这将使芯片失去JTAG接口和SPI接口两种编程功能,从而导致单片机锁死,出现这种情况就需要高压并行编程的方式才能将单片机的功能恢复,因此在使用时务必格外小心。另外,使用基于ISP方式的编程器(如AVRISP mkⅡ)无法用这种方法禁用SPIEN项。

另外,在图5-2中熔丝位BOOTSZ的后面有一个下三角符号,单击这个下三角按钮,即可打开BOOT区大小选择对话框,如图5-3所示。

在图5-3所示的下拉菜单中会有四组数字,每一组数字都是启动区大小和引导区(BootLoader)起始地址。如“2048W_3800”表示启动区大小是2048字,引导区起始地址为$3800。通过此下拉菜单,我们可以按照软件的提示来轻松设置启动区的大小,而无需记忆熔丝位BOOTSZ1和BOOTSZ0的状态,这也是Atmel Studio 6.1集成开发环境设置熔丝位的方便之处。这里需要说明的是,对于启动区域大小我们仅选择默认设置即可。

不仅如此,Atmel Studio 6.1集成开发环境对BOD触发电平、时钟源及启动时间也提供了类似的菜单方式供用户选择,对BOD触发电平的设置如图5-4所示。

单击SUT_CKSEL选项后面的下三角按钮,打开时钟源和启动时间组合选择菜单,如图5-5所示。

在SUT_CKSEL组合选项中,可选取内部RC时钟、外部RC时钟、外部石英晶体/陶瓷振荡器等时钟源及相应的启动时间。由于我们的AVR系统板上使用的是16M晶体振荡器,所以此处需要选择外部高频晶体振荡器/陶瓷谐振器作为时钟源,启动时间任意,即选择:“EXTHIFXTALRES_258CK_4MS”项,当鼠标停留在该选项上时会有相应的提示信息,如:“Ext.Crystal/Resonator High Freq……”

在完成了所有熔丝位的设置之后,其实你并没有真正对芯片的熔丝位做出更改。要让你的设置生效,需要对芯片进行一次烧写,具体如图5-6所示。

单击图5-6中箭头所指的“Program”按钮,即可对芯片进行一次编程,从而完成对熔丝位的更改,烧写完成后在窗口下方区域内会有相应的提示。另外,对熔丝位的校验和读取也可以在此窗口中完成。

5.1.3

熔丝位的错误设置

熔丝位的错误设置会导致芯片假死、JTAG接口失效等意外情况发生,为了便于解决此问题,我们将错误状态及处理方法列出如下:

1.JTAG接口意外关闭

在对ATmega32单片机编程时,如果将熔丝位JTAGEN设置为1(未编程)时,JTAG接口会被禁用,这时单片机JTAG接口的引脚功能被普通I/O口功能所取代,导致JTAG接口关闭。这时使用基于JTAG接口的调试开发工具已经无法对芯片进行编程和仿真。解决此问题的方法是使用基于SPI串行接口的ISP编程器,再次对熔丝位进行设置,将JTAGEN设置为0(已编程),重新启用JTAG接口即可。

2.SPI接口意外关闭

在使用基于JTAG接口的调试开发工具对芯片编程时,如果将熔丝位SPIEN设置为1(未编程),SPI接口将被禁用。这时再次使用基于ISP方式的编程器时,由于SPI接口失效,芯片将无法通过SPI接口进行编程和下载。解决此问题的方法是再次使用基于JTAG接口的调试开发工具,将熔丝位SPIEN设置为0(已编程),恢复SPI接口的功能即可。

3.JTAG和SPI接口均意外关闭

如果你误将SPIEN和JTAGEN两个熔丝位均设定为未编程状态,芯片将会失去JTAG和SPI两个接口的功能,从而导致无法使用这两种方式为单片机编程,此时需要使用高压并行编程的方式才能将芯片的功能恢复。

4.编程时无可用时钟源

当使用基于ISP方式的编程器进行编程时,如果将芯片的时钟源由片内切换到片外,而片外恰好没有配置外部晶振,单片机会因为没有可用的时钟而停止工作。这时再次使用基于ISP编程器为其编程时,由于SPI串行编程需要芯片的时钟支持,而此时芯片恰好已经没有可用的时钟支持了,致使ISP编程器失败。

解决的办法是使用JTAG接口的调试开发工具,编程相应的熔丝位将芯片的时钟源恢复到片内时钟上。也可以按照所配置的时钟方式将芯片的外部时钟源恢复,或者将外部时钟信号施加到单片机的XTAL1引脚上,此时即可使用ISP编程器修改时钟源。使用1-4M的有源晶振产生时钟信号为单片机提供外部时钟,是为丢失时钟源的芯片解锁的好办法,其原理如图5-7所示。

5.启动地址错误

如果你不使用ATmega32单片机的BOOTLOADER功能,一定注意不要把熔丝位BOOTRST设置为0(已编程)状态,否则会使芯片在上电时不是从Flash的0x0000处开始执行程序,而是转移到BOOT区执行,导致单片机无法正确运行。解决的办法是重新修改熔丝位BOOTRST,将其设置为1(未编程)状态。

列举以上问题的目的在于,当你使用AVR单片机时,如果遇到类似的问题,不应简单地认为是芯片出了问题,而应查看熔丝位的设置,并且尝试换用另外一种编程开发工具。

5.2

锁定位

为了保护开发者的知识产权,确保你的设计成果不被他人剽窃,单片机经常采用数据加密技术,使烧写到芯片内部的程序代码不会被人恶意读取和复制。AVR单片机在这方面则更胜一筹,它采用了位加密锁(Lock Bit)技术,用于确保芯片内的代码安全。

5.2.1

锁定位的功能

对ATmega32单片机的数据保护是通过锁定位来实现的,锁定位有6个,具体功能详见表5-2。

一般情况下,对锁定位的设置是在对单片机熔丝位的设置完成之后进行的。我们已经知道,ATmega32单片机的存储器有三种:数据存储器(SRAM)、程序存储器(FLASH)和E 5.2.2

锁定位的应用

锁定位可以通过并行、SPI或JTAG编程器/仿真器进行设定,但要想使设置生效,必须通过芯片擦除命令来实现,这也是保护数据安全所必需的步骤。锁定位的设置与熔丝位一样具有可逆性,可根据不同的需要多次编程,灵活改变。在Atmel Studio 6.1集成开发环境下配合AVRISP mkⅡ编程器对锁定位进行设置的方法如下:

正确连接JTAG ICE仿真器和小系统板,打开Atmel Studio 6.1软件,单击任务栏上的“Device Programming”按钮,弹出“Device Programming”窗口,在“Tool”项中选择“AVRISP mkⅡ”,在“Device”项中选择目标单片机型号为“ATmega32A”,单击“Apply”按钮,在刷新后的窗口左侧选择“LockBits”(锁定位)选项,如图5-8所示。

在图5-8所示的锁定位设置窗口中,列出了三种不同的保护类型,我们尝试着更改LB选项,单击LB右侧的下三角按钮,打开设置下拉列表,选择“PROG_VER_DISABLED”项,鼠标停留在该选项上时会有详细功能提示“Further programming and verification disabled”,意思是禁止编程和校验,具体如图5-9所示。

接下来为了让设置生效,我们单击“Program”按钮,如图5-10中箭头所指位置所示。

这时窗口下面会有编程的相关提示信息,提示锁定位设置成功。这时,FLASH和E 这时,我们需要在“Device Programming”窗口中切换到“Memories”选项,鼠标单击“Erase now”按钮,完成一次对芯片的擦写操作,如图5-12所示。

当我们再一次将“Device Programming”窗口切换到“Lock bits”选项时,你会发现锁定位已经更改成我们预期的设置了,至此我们已经完成了对FLASH和E2PROM的解锁操作,具体如图5-13所示。

 


评论:

AVR单片机基础教程

作者:高显生   共18讲

AVR系列单片机是8位单片机中第一个真正的RISC结构单片机,它采用了大型快速存取寄存器组、快速的单周期指令系统以及单级流水线等诸多先进技术,使得AVR单片机具备了高达1MIPS/MHz的运行处理能力。