新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 關于正確配置AVR熔絲位

        關于正確配置AVR熔絲位

        作者: 時間:2016-11-23 來源:網絡 收藏
        AVR熔絲位的配置是比較細致的工作,用戶往往忽視其重要性,或感到不易掌握。下面給出對AVR熔絲位的配置操作時的一些要點和需要注意的相關事項。有關ATmega128熔絲位的具體定義和功能請查看本書相關章節,在附錄中將給出一個完整的匯總表。

        (1)在AVR的器件手冊中,對熔絲位使用已編程(Programmed)和未編程(Unprogrammed)定義熔絲位的狀態,“Unprogrammed”表示熔絲狀態為“1”(禁止);“Programmed”表示熔絲狀態為“0”(允許)。因此,配置熔絲位的過程實際上是“配置熔絲位成為未編程狀態“1”或成為已編程狀態“0””。
        (2)在使用通過選擇打鉤“√”方式確定熔絲位狀態值的編程工具軟件時,請首先仔細閱讀軟件的使用說明,弄清楚“√”表示設置熔絲位狀態為“0”還是為“1”。
        (3)使用CVAVR中的編程下載程序時應特別注意,由于CVAVR編程下載界面初始打開時,大部分熔絲位的初始狀態定義為“1”,因此不要使用其編程菜單選項中的“all”選項。此時的“all”選項會以熔絲位的初始狀態定義來配置芯片的熔絲位,而實際上其往往并不是用戶所需要的配置結果。如果要使用“all”選項,應先使用“read->fusebits”讀取芯片中熔絲位實際狀態后,再使用“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的應用請參考本章相關內容。
        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”。即使用內部1MHzRC振蕩器,使用最長的啟動延時。這保證了無論外部振蕩電路是否工作,都可以進行最初的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》的目的之一!

        本文引用地址:http://www.104case.com/article/201611/320453.htm

        mega8熔絲位:1:未編程(不選中)0:編程(選中)
        ***************************************
        熔絲位 說明 缺省設置
        ***************************************
        RSTDISBL: 復位或I/O功能選擇 1 1:復位功能;0:I/O功能(PC6)
        WDTON: 看門狗開關 1 1:看門狗打開(通過WDTCR允許);0:看門狗禁止
        SPIEN: SPI下載允許 0 1:SPI下載禁止;0:SPI下載允許(注:當使用SPI編程時,該項不可用)
        EEAVE: 燒錄時EEPROM數據保留 1 1:不保留;0:保留
        BODEN: BOD功能控制 1 1:BOD功能禁止;0:BOD功能允許
        BODLEVEL: BOD電平選擇 1 1:2.7V電平;0:4.0V電平
        BOOTRST: 復位入口選擇 1 1:程序從0x0000地址開始執行;0:程序從引導區確定的入口地址開始執行
        ***************************************
        BOOTSZ1/0: 引導程序大小及入口 00
        00:1024Word/0xc00;
        01:512Word/0xe00;
        10:256Word/0xf00;
        11:128Word/0xf80
        ***************************************
        BLB02/01: 程序區指令位選擇 11
        11:SPM和LPM指令都允許執行
        10:SPM指令禁止寫程序區
        01:引導區LPM指令禁止讀取程序區內容;如果中斷向量定義在引導區,則禁止該中斷在程序區執行。
        00:SPM指令禁止寫程序區;引導區LPM指令禁止讀取程序區內容;如果中斷向量定義在引導區,則禁止該中斷在程序區執行。
        ***************************************
        BLB12/11: 引導區指令位選擇 11
        11:SPM和LPM指令都允許執行
        10:SPM指令禁止寫引導區
        01:程序區LPM指令禁止讀取引導區內容;如果中斷向量定義在程序區,則禁止該中斷在引導區執行。
        00:SPM指令禁止寫引導區;程序區LPM指令禁止讀取引導區內容;如果中斷向量定義在程序區,則禁止該中斷在引導區執行。
        ***************************************
        LB2/1: 程序區加密位選擇 11
        11:未加密
        10:程序和EEPROM編程功能禁止,熔絲位鎖定
        00:程序和EEPROM編程及校驗功能禁止,熔絲位鎖定
        (注:先編程其他熔絲位,再編程加密位)
        ***************************************
        CKSEL3/0: 時鐘源選擇 0001
        CKOPT: 晶振選擇 1
        SUT1/0: 復位啟動時間選擇 10
        ***************************************
        CKSEL3/0=0000:外部時鐘,CKOPT=0:允許芯片內部XTAL1管腳對GND接一個36PF電容;CKOPT=1:禁止該電容
        ----------------
        CKSEL3/0=0001-0100:已經校準的內部RC振蕩,CKOPT總為1
        0001:1.0M
        0010:2.0M
        0011:4.0M
        0100:8.0M
        ----------------
        CKSEL3/0=0101-1000:外部RC振蕩,CKOPT=0:允許芯片內部XTAL1管腳對GND接一個36PF電容;CKOPT=1:禁止該電容
        0101:<0.9M
        0110:0.9-3.0M
        0111:3.0-8.0M
        1000:8.0-12.0M
        ----------------
        CKSEL3/0=1001:外部低頻晶振,CKOPT=0:允許芯片內部XTAL1/XTAL2管腳對GND各接一個36PF電容;CKOPT=1:禁止該電容
        ----------------
        CKSEL3/0=1010-1111:外部晶振,陶瓷振蕩子,CKOPT=0:高幅度振蕩輸出;CKOPT=1:低幅度振蕩輸出
        101X:0.4-0.9M
        110X:0.9-3.0M
        111X:3.0-8.0M
        ***************************************
        SUT1/0: 復位啟動時間選擇
        當選擇不同晶振時,SUT有所不同。

        三、時鐘選擇一覽表
        時鐘源 啟動延時 熔絲
        外部時鐘 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振蕩1MHZ 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.9M) 258 CK + 4.1 ms CKSEL=1010 SUT=00
        低石英/陶瓷振蕩器(0.4-0.9M) 258 CK + 65 ms CKSEL=1010 SUT=01
        低石英/陶瓷振蕩器(0.4-0.9M) 1K CK + 0 ms CKSEL=1010 SUT=10
        低石英/陶瓷振蕩器(0.4-0.9M) 1K CK + 4.1 ms CKSEL=1010 SUT=11
        低石英/陶瓷振蕩器(0.4-0.9M) 1K CK + 65 ms CKSEL=1011 SUT=00
        低石英/陶瓷振蕩器(0.4-0.9M) 16K CK + 0 ms CKSEL=1011 SUT=01
        低石英/陶瓷振蕩器(0.4-0.9M) 16K CK + 4.1ms CKSEL=1011 SUT=10
        低石英/陶瓷振蕩器(0.4-0.9M) 16K CK + 65ms CKSEL=1011 SUT=11
        中石英/陶瓷振蕩器(0.9-3.0M) 258 CK + 4.1 ms CKSEL=1100 SUT=00
        中石英/陶瓷振蕩器(0.9-3.0M) 258 CK + 65 ms CKSEL=1100 SUT=01
        中石英/陶瓷振蕩器(0.9-3.0M) 1K CK + 0 ms CKSEL=1100 SUT=10
        中石英/陶瓷振蕩器(0.9-3.0M) 1K CK + 4.1 ms CKSEL=1100 SUT=11
        中石英/陶瓷振蕩器(0.9-3.0M) 1K CK + 65 ms CKSEL=1101 SUT=00
        中石英/陶瓷振蕩器(0.9-3.0M) 16K CK + 0 ms CKSEL=1101 SUT=01
        中石英/陶瓷振蕩器(0.9-3.0M) 16K CK + 4.1ms CKSEL=1101 SUT=10
        中石英/陶瓷振蕩器(0.9-3.0M) 16K CK + 65ms CKSEL=1101 SUT=11
        高石英/陶瓷振蕩器(3.0-8.0M) 258 CK + 4.1 ms CKSEL=1110 SUT=00
        高石英/陶瓷振蕩器(3.0-8.0M) 258 CK + 65 ms CKSEL=1110 SUT=01
        高石英/陶瓷振蕩器(3.0-8.0M) 1K CK + 0 ms CKSEL=1110 SUT=10
        高石英/陶瓷振蕩器(3.0-8.0M) 1K CK + 4.1 ms CKSEL=1110 SUT=11
        高石英/陶瓷振蕩器(3.0-8.0M) 1K CK + 65 ms CKSEL=1111 SUT=00
        高石英/陶瓷振蕩器(3.0-8.0M) 16K CK + 0 ms CKSEL=1111 SUT=01
        高石英/陶瓷振蕩器(3.0-8.0M) 16K CK + 4.1ms CKSEL=1111 SUT=10
        高石英/陶瓷振蕩器(3.0-8.0M) 16K CK + 65ms CKSEL=1111 SUT=11
        注:1、出廠默認設置
        注意:CKOPT=1(未編程)時,最大工作頻率為8MHZ
        內部RC振蕩1MHZ 6 CK + 4.1 ms CKSEL=0001 SUT=01

        還有進入不了編程模式,提示連接不正常的,可以這樣修復,我親自試過,好極了。也是轉帖的
        當改動了AVR的熔絲位配置,重新加電后,想再用ISP下載,提示:“進入編程模式失敗”等,極有可能是搞錯了熔絲位,導致芯片不知道使用何種主頻而無法正常工作(僅限于內部RC振蕩的情況)。
        通過外加有源晶振的辦法,讓其恢復。
        使用51系列單片機的ALE引腳作為外部時鐘源,將51系列的ALE引腳與M16的XTAL1引腳相連接。我親手試了一下,效果是立竿見影,很快的恢復了錯誤設置的熔絲位。

        論壇轉帖:

        在給ATMEGA8單片機編程時候使用AVR-frighter 軟件,結果編程使用了內部晶振,運行速度很慢。請問怎么設置才能使用外部晶振。我外部用的24M晶振。還要怎樣設置才能用外部?

        問題解決,沒正確配置熔絲,外部晶體不起振,頻率計測不到。照下圖配置,搞定。M8 和M16一樣。



        關鍵詞: 正確配置AVR熔絲

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 永吉县| 尼勒克县| 湛江市| 乌兰浩特市| 台山市| 萨迦县| 新乐市| 海原县| 花莲县| 烟台市| 永康市| 南陵县| 孝义市| 渑池县| 金溪县| 阳高县| 奇台县| 丰原市| 九龙城区| 苗栗县| 延川县| 仙桃市| 新河县| 太白县| 遂溪县| 海淀区| 眉山市| 永定县| 迁西县| 太和县| 佛山市| 工布江达县| 金阳县| 鞍山市| 醴陵市| 襄城县| 滨州市| 龙南县| 丽水市| 农安县| 行唐县|