AVR單片機(jī)具有內(nèi)部RC振蕩器,對(duì)于內(nèi)部振蕩器的校正一直是一個(gè)比較難的問題,由于這個(gè)問題的困擾,導(dǎo)致很多正常的程序無法正常工作,特此整理該文檔供客戶參考,如果有需要英文的可以到ATMEL官方網(wǎng)站下載。
特點(diǎn)
l?????????? 可以使用 STK500, AVRISP, JTAGICE 或 JTAGICE mkII 校正
l?????????? 可以使用第三方編程器校正
l?????????? 調(diào)整 RC 頻率到 +/-1% 精度
l?????????? 在任意電壓和溫度下調(diào)整 RC 振蕩器
l?????????? 調(diào)整 RC 振蕩器到指定頻率
l?????????? 支持所有帶有 RC 振蕩器的 AVR 單片機(jī)
l?????????? 可以選擇振蕩器時(shí)鐘頻率
?
介紹
這篇應(yīng)用筆記說明了快速和精確校正內(nèi)部 RC 振蕩器的方法。它提供了容易修改的固件源代碼,可以用在任何帶有內(nèi)部可調(diào) RC 振蕩器的 AVR 單片機(jī)中。這個(gè)固件允許使用 AVR STK500, AVRISP 或 JTAGICE,但是也可以用在第三方系統(tǒng)中(如編程器)。
?
大部分 AVR 單片機(jī)提供了內(nèi)部 RC 振蕩器。這個(gè) RC 振蕩器的頻率可以校正到 +/-1%。這個(gè)特點(diǎn)使其提供了更大的靈活性和節(jié)約了成本。
?
在 Atmel 的工廠中是在固定電壓和溫度下進(jìn)行了校正(典型是 25°C和 5V),而內(nèi)部 RC 振蕩器的頻率是受到溫度和電壓同時(shí)影響的,這使得用戶在特定的應(yīng)用環(huán)境時(shí)可能需要進(jìn)行再次校正。再次校正可以得到更高的精度,匹配特定的電壓或溫度,甚至調(diào)整到一個(gè)完全不同的頻率。
?
這篇應(yīng)用筆記說明的校正方法使用的時(shí)間只比從簽名中讀取工廠校正字節(jié)并回寫到設(shè)備中稍長(zhǎng)。全部的編程時(shí)間幾乎不受到校正的影響。
?
注意在某些系統(tǒng)中非常依賴于運(yùn)行時(shí)間,這說明在應(yīng)用中在整個(gè)溫度范圍需要一個(gè)精確的與電壓無關(guān)的系統(tǒng)時(shí)鐘。在這種情況下一個(gè)手表晶體可以提供可靠和低成本的解決方案。
?
在這篇文檔的最后有快速開始指南。
?
操作理論 – 內(nèi)部 RC 振蕩器
在產(chǎn)品中內(nèi)部 RC 振蕩器在 5V 或 3.3V 下校正。工廠校正的精度在 +/-3 或 +/-10% (參考數(shù)據(jù)手冊(cè))。如果一個(gè)設(shè)計(jì)需要比工廠標(biāo)準(zhǔn)校正更高的精度,就需要再次校正 RC 振蕩器,這樣可以得到大約 +/-1%(對(duì)于工廠校正精度是+/-10%的器件是 +/-2%)的精度。
?
時(shí)鐘選擇
AVR 熔絲的設(shè)置控制了系統(tǒng)使用的時(shí)鐘源。為了使用內(nèi)部 RC 振蕩器,需要選擇正確的熔絲。數(shù)據(jù)手冊(cè)中說明了可以使用的熔絲設(shè)置。
?
基本頻率
下面小節(jié)給出了 AVR 單片機(jī)內(nèi)部 RC 振蕩器說明。
?
一些 AVR 單片機(jī)有一個(gè) RC 振蕩器,其它的有 4 種不同的 RC 振蕩器可以選擇,頻率范圍從 1MHz 到 9.6MHz。校正內(nèi)部 RC 振蕩器使用晶體校正寄存器:SCCAL(在 IO 頭文件中定義了)。OSCCAL 寄存器是一個(gè)字節(jié)寬度,它可以對(duì)系統(tǒng)頻率進(jìn)行微調(diào),校正 RC 振蕩器就利用了這個(gè)微調(diào)。
?
當(dāng)單片機(jī)被 Atmel 校正后,校正字節(jié)就存放到單片機(jī)的簽名中。不同芯片的校正字節(jié)之間差異可能很大,因?yàn)?RC 振蕩器與工藝有關(guān),有一定離散性。如果芯片有多于一個(gè)振蕩器,那每個(gè)振蕩器都對(duì)應(yīng)一個(gè)校正字節(jié)。
?
大多數(shù)單片機(jī)的缺省 RC 校正字節(jié)在復(fù)位時(shí)自動(dòng)從簽名中載入,并復(fù)制到 OSCCAL 寄存器中。例如,ATmega8 的默認(rèn)時(shí)鐘設(shè)置是內(nèi)部 1MHz RC 振蕩器;對(duì)應(yīng)的 1MHz 校正字節(jié)在復(fù)位后自動(dòng)載入。如果熔絲改變?yōu)?4MHz 振蕩器,校正字節(jié)就需要手工載入 OSCCAL 寄存器了。編程工具可以從簽名中讀取 4MHz 校正字節(jié)并強(qiáng)制存放到 Flash 或 EEPROM 中,然后由用戶程序在運(yùn)行時(shí)讀取出來再?gòu)?fù)制到 OSCCAL 寄存器中。
?
為了容易使用 OSCCAL 寄存器調(diào)整振蕩器,一些單片機(jī)可以設(shè)置系統(tǒng)的預(yù)分頻時(shí)鐘。預(yù)分頻寄存器(CLKPR) 可以用預(yù)定義的系數(shù)比例變化系統(tǒng)時(shí)鐘。同樣,這個(gè)預(yù)分頻可以通過熔絲預(yù)先設(shè)置;編程 CKDIV8 熔絲就設(shè)置 CLKPR 系統(tǒng)時(shí)鐘分頻 8。這可以保證芯片在低于最大頻率下操作,CLKPR 可以在運(yùn)行時(shí)修改。
?
基本頻率是定義為不分頻。
?
RC振蕩器總結(jié)
AVR 單片機(jī)在不同時(shí)期使用了不同的 RC 振蕩器。一個(gè)關(guān)于 RC 振蕩器的回顧參見表1。芯片列表按照振蕩器類型排序,也差不多是按照發(fā)布時(shí)間排序的。表中只列出了可以調(diào)整振蕩器的芯片。
?
表1.帶有內(nèi)部 RC 振蕩器的芯片特點(diǎn),按照版本分類
振蕩器版本 器件 RC 振蕩器頻率 CKDIV PRSCK
1.1 ATtiny12 1.2 - -
1.2 ATtiny15 1.6 - -
2.0 ATmega163 1.0 - -
2.0 ATmega323 1.0 - -
3.0 ATmega8 1.0,2.0,4.0和8.0 - -
3.0 ATmega16 1.0,2.0,4.0和8.0 - -
3.0 ATmega32 1.0,2.0,4.0和8.0 - -
3.1 ATmega64 1.0,2.0,4.0和8.0 - XDIV(1)
3.1 ATmega128 1.0,2.0,4.0和8.0 - XDIV(1)
3.0 ATmega8515 1.0,2.0,4.0和8.0 - -
3.0 ATmega8535 1.0,2.0,4.0和8.0 - -
3.0 ATmega26 1.0,2.0,4.0和8.0 - -
4.0 ATmega162 8.0 是 是
4.0 ATmega169(2) 8.0 是 是
4.0 ATmega165 8.0 是 是
4.1 ATmega13 4.8和9.6 是 是
4.2 ATmega2313 4.0和8.0 是 是
5.0 ATmega48
ATmega88
ATmega168 8.0 是 是
5.0 ATmega25
ATmega45
ATmega85 8.0 是 是
5.0 ATmega325
ATmega3250
ATmega645
ATmega6450 8.0 是 是
5.0 ATmega329
ATmega3290
ATmega649
ATmega6490 8.0 是 是
5.0 AT90CAN128 8.0 是 是
5.0 AT90PWM2
AT90PWM3 8.0 是 是
注意:
1.?????? 這個(gè)器件的預(yù)分頻寄存器叫做 XDIV。
2.?????? ATmega169 修訂 F 使用 5.0 版本的振蕩器。
?
?
版本1.X
這個(gè)版本是 AVR 單片機(jī)最早的可以校正的內(nèi)部 RC 振蕩器,它提供了 1.2MHz 到 1.6MHz 的頻率。校正值存放在簽名中,但是不能自動(dòng)載入,必須在運(yùn)行時(shí)手工加載到 OSCCAL 寄存器。這個(gè)版本的振蕩器的頻率高度依賴于工作電壓和溫度。
?
版本2.X
這個(gè)版本的振蕩器提供了 1MHz 頻率。與1.x版本相比,顯著的減少了對(duì)電壓和溫度的依賴性。
?
版本3.X
這個(gè)版本和35.5k工藝一起引入。
?
擴(kuò)展振蕩器提供多個(gè)頻率,4種不同的 RC 振蕩器,頻率分別是 1, 2, 4 以及 8MHz。這個(gè)版本自動(dòng)載入 1MHz 的校正值。因?yàn)橛?個(gè)不同 RC 振蕩器,所以在簽名中保存了 4 個(gè)校正值。如果使用了不是缺省的 1MHz 頻率,OSCCAL 寄存器需要運(yùn)行時(shí)手工加載校正值。
?
版本4.X
版本4.0中只保留了 8MHz 的振蕩器。稍晚一些的 4.x 版本中提供了兩種頻率:4MHz 和 8MHz(ATtiny2313),4.8MHz 和 9.6MHz(ATtiny13)。OSCCAL 寄存器修改為只有 7 位用于調(diào)整選擇的頻率,最高位沒有使用。可以自動(dòng)載入校正值和預(yù)分頻時(shí)鐘。
?
版本4.X
版本5.0中只有8MHz時(shí)鐘,OSCCAL中所有的8位都可以用于調(diào)整頻率,可以自動(dòng)載入校正值和預(yù)分頻時(shí)鐘。OSCCAL寄存器分為兩個(gè)部分,OSCCAL的最高位選擇頻率范圍,后7位用于調(diào)整指定的頻率。
?
振蕩器特性
內(nèi)部 RC 振蕩器的頻率依賴于溫度和工作電壓。圖1顯示了ATmega169 (版本 A 到 E)的 8MHz RC 振蕩器的頻率。如圖所示,頻率隨著溫度而增加,隨著電壓的增加而稍微降低,這個(gè)特性隨芯片不同而變化。對(duì)于某種具體型號(hào)的芯片參考數(shù)據(jù)手冊(cè)。
?
圖1.晶體頻率和變化與溫度和電壓關(guān)系(ATmega169)
(MHz)
Vcc(V)
所有帶有可調(diào)整振蕩器的芯片都有 OSCCAL 寄存器。增加 OSCCAL 將得到一個(gè)稱為“偽單調(diào)”(pseudo-monotone)增加的頻率。把它稱為“偽單調(diào)”的原因是因?yàn)樵谀承┣闆r下改變 OSCCAL 寄存器的參數(shù)將不會(huì)增加或減少頻率,但是再次改變就會(huì)增加頻率了。換句話說,OSCCAL 寄存器加上 1 可能不增加頻率,但是加上 2 一般都會(huì)使頻率增加。這一特點(diǎn)對(duì)于搜索最佳校正值很重要。一個(gè)偽單調(diào)的例子可以從圖2看出,它是 ATmega169 的 8MHz RC 振蕩器的例子。注意到 OSCCAL 寄存器只使用了 7 位(8 位在 ATmega169 修訂版本 F 及以后版本中),這樣 OSCCAL 的最大值是 128。
?
圖2. ATmega169 校正 RC 振蕩器頻率
(MHz)
晶體參數(shù)
?
對(duì)于所有可以調(diào)整的振蕩器,不推薦調(diào)整頻率超過指定基本頻率的 10%,因?yàn)閮?nèi)部定時(shí)是依賴于 RC 振蕩器的。
?
知道了 RC 振蕩器的基本特性,就可以在 10% 的范圍內(nèi),在任何工作電壓和環(huán)境溫度下,將給定的頻率校正到 +/-1% 的精度。
?
進(jìn)行校正
這一節(jié)分為協(xié)議和固件程序兩部分。協(xié)議是為了適應(yīng)任何支持校正的編程工具,如 AVR 的開發(fā)工具STK500, AVRISP, JTAGICE 和 JTAGICE mkII,這些工具校正的用法在后面說明。
?
STK500, AVRISP, JTAGICE 和 JTAGICE mkII 目前只支持命令行版本的校正,由 AVR Studio 4.11 SP1 (及以后版本)支持。最新版本的 AVR Studio 可以在 http://www.atmel.com/avr/ 下載。
?
校正協(xié)議
校正協(xié)議是簡(jiǎn)單快速的,以保證可以用于產(chǎn)品中。編程使用的管腳是 ISP 接口或 JTAG 接口(如果有),使其可以用于最終產(chǎn)品中(或PCB)。
?
兩個(gè)管腳用于進(jìn)行校正: ISP 中的 MOSI 和 MISO,或 JTAG 中的 TDI 和 TDO。這里為了簡(jiǎn)單只說明 MOSI 和 MISO,TDI 和 TDO 的用法是一樣的。
?
基本概念就是編程器產(chǎn)生校正時(shí)鐘(C-clock),單片機(jī)使用它作為參考來校正自己的內(nèi)部 RC 振蕩器。當(dāng)單片機(jī)完成校正后通過 MISO 發(fā)送 “OK”信號(hào)給編程器。編程器允許 MISO 信號(hào)線上拉,而單片機(jī)允許 MOSI 信號(hào)線上拉,這是為了保證噪聲不影響校正。
?
編程器使用 1024 C-cycles (C-clock 周期)作為溢出時(shí)間,校正程序在這個(gè)時(shí)間內(nèi)完成
?
校正程序按一下步驟運(yùn)行:
1.?????? 編程器寫入校正固件程序到單片機(jī)中,允許 MISO 上拉,并釋放 reset 信號(hào)線。校正時(shí)鐘發(fā)送到 MOSI 信號(hào)線。手表晶體(32.768kHz)的頻率是合適的。
2.?????? 單片機(jī)允許 MOSI 內(nèi)部上拉,并開始監(jiān)聽 MOSI 上的校正時(shí)鐘信號(hào)。
3.?????? 當(dāng)單片機(jī)檢測(cè)到用于二進(jìn)制搜索的校正時(shí)鐘達(dá)到 1% 精度,如果不是需要的參數(shù)值,那么就把鄰近值作為結(jié)果,并進(jìn)行驗(yàn)證
4.?????? 校正值存放到 EEPROM 中(在校正失敗時(shí),忽略這個(gè)步驟)。
5.?????? 當(dāng)成功完成校正后,翻轉(zhuǎn) MISO 信號(hào) 4 次。在 MOSI 時(shí)鐘下降沿時(shí)執(zhí)行 MISO 翻轉(zhuǎn) 5 到 10 個(gè) CPU 周期(C-clock)。在校正失敗時(shí),不進(jìn)行這一步。
6.?????? 如果單片機(jī)沒有 EESAVE 熔絲,編程器必須取回 EEPROM 中的校正值以便恢復(fù),因?yàn)樯院蠊碳绦驅(qū)⒈粡?Flash 中擦除。如果有 EESAVE 熔絲,就設(shè)置這一位,這樣在擦除 Flash 時(shí)就不會(huì)擦除 EEPROM 了。
必須在運(yùn)行時(shí)從 EEPROM 復(fù)制校正參數(shù)到 OSCCAL 寄存器,為此需要在最終的固件程序中執(zhí)行它。
?
校正固件程序
校正代碼是用匯編寫的,對(duì)于 AVR Studio 4.11 已經(jīng)安裝了帶有校正包的匯編。
?
校正固件程序是按照方便修改為任何型號(hào)的單片機(jī)(表1中)來組織的。同樣,校正的接口也可以被修改。如果使用 AVR 的開發(fā)工具,所有需要進(jìn)行的修改都在文件 “RC_Calibration.asm”中。
?
文件包括下面內(nèi)容:
1.?? 指定芯片文件(選擇和你的系統(tǒng)對(duì)應(yīng)的),如 “m16.asm”是 Atmega16 的。芯片指定文件包括下面內(nèi)容:
a.?????? AVR Studio 的寄存器和位定義。
b.?????? 定義的內(nèi)存映射文件,指定代碼的位置和存放在 EEPROM 的校正數(shù)據(jù)的位置。
c.???????? OSCCAL 訪問的宏,控制怎樣對(duì) OSCCAL 寄存器進(jìn)行訪問。訪問 OSCCAL 寄存器的方法與 IO 文件和 OSCCAL 寄存器的位置有關(guān)。
d.?????? 振蕩器版本文件。這個(gè)文件定義了二進(jìn)制搜索的初始化步驟,因?yàn)橐恍?OSCCAL 寄存器是 7 位,另外的是 8 位的。
e.?????? 返回堆棧初始化宏文件。一些芯片有硬件堆棧,另外的使用軟件堆棧,需要進(jìn)行初始化。
f.?????? 端口訪問宏文件,定義了怎樣訪問與校正相關(guān)的端口的相關(guān)寄存器。需要這個(gè)文件是因?yàn)橐恍┘拇嫫髟?IO 文件的高端部分,而其它的在低端部分。
g.?????? 重定義位和寄存器名。
請(qǐng)注意使用 ATmega169 修訂版F 的芯片時(shí)需要修改芯片的特殊文件,在“m169.asm”文件中振蕩器版本要設(shè)置成 5。
2.?? 校正接口文件。這個(gè)文件指定使用 ISP 或 JTAG 端口,以及使用的管腳名。校正時(shí)鐘頻率也在這里指定。
3.?? 包含使用宏定義的文件 - “macros.inc”。
4.?? 公共的校正代碼文件 “main.asm”。
校正代碼的結(jié)構(gòu)是按照易于修改而設(shè)計(jì)的,可以更簡(jiǎn)單的適應(yīng)目標(biāo)系統(tǒng)的單片機(jī)和接口。此外,廣泛使用了宏定義保證了代碼可以只要最小的改動(dòng)。最后,芯片和校正接口的設(shè)計(jì)使得只需很小的改動(dòng)就可以支持新的器件。
?
二進(jìn)制搜索算法
這個(gè)搜索是基于二進(jìn)制搜索的, a divide-and-conquer method:
1.??? OSCCAL 寄存器載入初始值,就是 OSCCAL 最大值的一半。OSCCAL 的初始值在初始化步驟中定義了。
2.??? 系統(tǒng)時(shí)鐘頻率和外部參考進(jìn)行比較,校正時(shí)鐘:
a.?????? 如果頻率精度在 1% 之內(nèi),跳到第5步。
b.?????? 如果系統(tǒng)時(shí)鐘太快,就減少 OSCCAL 的值;如果時(shí)鐘太慢,就增加。跳到第3步。
3.??? 步進(jìn)值修改為以前的一半
a.?????? 如果步進(jìn)值達(dá)到0,二進(jìn)制搜索失敗,跳到第4步。
b.?????? 如果步進(jìn)值大于0,在當(dāng)前的 OSCCAL 上加或減去步進(jìn)值,重復(fù)第2步。
4.??? 測(cè)試與 OSCCAL 最鄰近的 4 個(gè)點(diǎn),這是為了補(bǔ)償振蕩器頻率的偽單調(diào)性。
a.?????? 如果測(cè)試后 OSCCAL 的參數(shù)滿足精度要求,跳轉(zhuǎn)到第5步。
b.?????? 如果沒有一個(gè)點(diǎn)滿足要求,MISO 保持低電平表示校正失敗。
5.??? 存儲(chǔ)校正值到 EEPROM。
6.??? MISO 翻轉(zhuǎn)4次表示校正頻率成功。
?
決定振蕩器頻率的方法
在校正時(shí)鐘 (C-clock) 和內(nèi)部 RC 振蕩器之間的比較使用了 8位定時(shí)器/計(jì)數(shù)器0 (TC0),使用8位定時(shí)器是因?yàn)樗谒械膸в锌烧{(diào) RC 振蕩器的單片機(jī)中都有。計(jì)時(shí)40個(gè) C-clock 周期cycles 然后比較定時(shí)器計(jì)數(shù), C-frequency 在接口文件中指定。決定頻率的方法在流程圖中說明了。
?
圖3. 決定振蕩器頻率方法的流程圖
?
為了覆蓋到振蕩器頻率的整個(gè)范圍,從 1MHz 到 9.6MHz,通過檢查 TC0 溢出標(biāo)志(OVF) 來擴(kuò)展定時(shí)器,得到了一個(gè)16位定時(shí)器。OVF 標(biāo)志每半個(gè)周期(Cclock)檢查一次,可以充分保證檢查到所有的 TC0 OVF 標(biāo)志。因?yàn)槭褂?16位定時(shí)器的關(guān)系,最差的情況是在 9.6MHz 時(shí),OSCCAL 寄存器載入 0xFF。在這個(gè)情況下,振蕩器能 100%? 高于指定頻率,定時(shí)器計(jì)數(shù)到 23,541,在16位計(jì)數(shù)范圍中。
?
從另外一個(gè)方面看,最低的振蕩器頻率也必須被考慮。最低可以得到的頻率是寫入 0x00 到 OSCCAL 寄存器時(shí),此時(shí)頻率可能低于指定頻率的 50%。因?yàn)?TC0 OVF 標(biāo)志位每半個(gè)周期檢查一次,只有不超過7個(gè)CPU周期來處理 OVF 標(biāo)志位以及檢測(cè) C-clock 沿 –在指定的 1MHz 頻率下。當(dāng) OVF 標(biāo)志位沒有設(shè)置時(shí)會(huì)遇到這個(gè)時(shí)間約束,而設(shè)置標(biāo)志位需要 8 個(gè)周期,這樣當(dāng)檢測(cè)時(shí)間時(shí)將引起一個(gè)小錯(cuò)誤,不過不影響最后的結(jié)果:振蕩器被判斷為太慢。
?
這些極端一般不會(huì)遇到,但是需要考慮到它們。
?
?
修正時(shí)間錯(cuò)誤
因?yàn)椴荒苁褂弥袛鄟頇z測(cè) C-clock 的沿,只能使用輪詢法。這樣的結(jié)果是檢測(cè)可能會(huì)有 2 個(gè)CPU 周期的延時(shí),使校正可能失敗。為了補(bǔ)償這個(gè)時(shí)間誤差,收縮門限 2 個(gè) ticks (2 個(gè)CPU周期)。
?
所有參數(shù)和門限的計(jì)算由單片機(jī)完成,使用了 32 位精度(在AVRASM中)或 64 位精度(在 AVRASM2中)。
?
校正固件程序不能用于校正時(shí)鐘源,參考這篇文檔 “校正時(shí)鐘精度”的小節(jié)。
?
使用STK500,AVRISP,JTAGICE或JTAGICE mkII進(jìn)行校正
校正固件的源碼和批處理文件是作為怎樣使用 STK500, AVRISP, JTAGICE 或 JTAGICE mkII 進(jìn)行校正的例子來提供的。固件幾乎不需要就可以用于其它校正系統(tǒng)上。
?
編譯校正固件
校正固件的主程序是 RC_Calibration.asm。這個(gè)文件需要在AVR Studio中添加到一個(gè)匯編工程里。在這個(gè)文件中指定了單片機(jī)型號(hào)和使用的校正接口:STK500, AVRISP, JTAGICE 或 JTAGICE mkII。甚至還可以指定校正的精度。
?
一旦修改這些選項(xiàng),編譯工程產(chǎn)生一個(gè)二進(jìn)制文件 “rc_calib.hex”,就是使用這個(gè)文件進(jìn)行校正。
?
注意正確設(shè)置熔絲很重要:如果選擇了 1MHz RC 振蕩器,就不能校正為單片機(jī) 8MHz。
?
使用命令行工具
STK500, AVRISP, JTAGICE 和 JTAGICE mkII 目前只支持以命令行方式調(diào)用的工具 (AVR Studio 4.11 SP1 及以后版本)。提供這種支持的軟件包可以在http://www.atmel.com/avr/中查找到。
?
軟件包中包括了校正需要的新固件程序。當(dāng)?shù)谝淮芜B接到AVR Studio時(shí)固件自動(dòng)進(jìn)行更新,或者按照AVR Studio幫助文件中的說明進(jìn)行手工更新。
?
單獨(dú)提供了3個(gè)批處理文件,這些文件展示了怎樣使用命令行工具編程校正代碼到用戶系統(tǒng),執(zhí)行校正和用最終的固件再編程。批處理文對(duì) ATmega16 通過 STK500 或 ISP, JTAGICE 和 JTAGICE mkII 分別進(jìn)行校正。請(qǐng)研究這些批處理文件和 AVR Studio 幫助來了解 STK500/ISP, JTAGICE 和 JTAGICE mkII 命令行工具的用法。表2 包括了新命令列表。
?
表2. stk500.exe 和 jtagice.exe 新選項(xiàng)
命令 說明
-Z[addr] 從EEPROM讀取校正字節(jié),addr是讀取的地址。讀取操作在芯片擦除命令前執(zhí)行,使用 “-S#”將在芯片擦除后重新寫入?yún)?shù)到flash或EEPROM中。
-Y 按次序執(zhí)行校正,這個(gè)命令不考慮其它所有操作。如果沒有獲得響應(yīng)信號(hào),返回錯(cuò)誤級(jí)別1。
?
支持新型號(hào)
為了支持新型號(hào)的器件,所需要的就是復(fù)制一個(gè)類似的設(shè)備文件(最好引腳兼容),并修改新型號(hào)的特點(diǎn)。下面步驟用ATmega8535為例顯示了這一過程:
1.??? 復(fù)制引腳和功能兼容的設(shè)備文件。
ATmega8535 和 ATmega16 引腳兼容,但是 ATmega8535 沒有 JTAG 接口。復(fù)制文件 “m16.asm”并改名為 “m8535.asm”。
2.??? 修改寄存器和位定義文件,以適合新的型號(hào)。
對(duì)于 ATmega8535 定義寄存器和位變量的文件是 “m8535.inc”。
3.??? 修改引腳輸出描述文件以適合新器件。
因?yàn)?ATmega8535 沒有 JTAG 接口,修改引腳輸出文件為 “s8535_family_pinout.inc”。
4.??? 修改新型號(hào)器件對(duì)應(yīng)的振蕩器版本文件。
5.??? 在 RC_Calibration 文件中添加新器件到設(shè)備列表。
對(duì)程序進(jìn)行編譯驗(yàn)證是否正確。如果錯(cuò)誤,一般都是因?yàn)樾薷牧思拇嫫骰蛭蛔兞棵?、端口、引腳或者定時(shí)器引起的。
?
固件的性能
代碼有如下特點(diǎn):整個(gè)校正運(yùn)行相當(dāng)快速,其性能依賴于校正固件的大小和完成校正的時(shí)間。校正固件有 183 到 240 個(gè)字節(jié),與用戶系統(tǒng)和使用的接口有關(guān)。固件編程需要的時(shí)間非常短。
?
校正程序完成時(shí)間少于 1024 個(gè)校正周期,最短時(shí)間與二進(jìn)制搜索搜索速度和寫EEPPROM時(shí)間有關(guān)。目前,使用 STK500.exe 或 JTAGICE.exe,校正時(shí)間少于 32ms。
?
校正時(shí)鐘精度
校正的精度高度依賴于外部校正時(shí)鐘。由 AVR 工具產(chǎn)生的校正時(shí)鐘的頻率可能發(fā)生變化,所以要測(cè)量出使用的準(zhǔn)確頻率并輸入到接口源文件中。因?yàn)檎袷幤髋c工作電壓和溫度都有關(guān),校正頻率要在相同的條件下進(jìn)行測(cè)量。
?
快速開始指南
參考下面的步驟:
1.?????? 下載并解壓 AVR053 的源代碼(可以放在任何位置,這里寫為 \AVR053\)。
2.?????? 從http://www.atmel.com/avr/下載并安裝 AVR Stdio 4.11 SP1。
3.?????? 打開 AVR Studio,創(chuàng)建新工程”rc_calib”,并添加源文件 RC_Calibration.asm 到工程中。
4.?????? 在RC_Calibration.asm中選擇用戶系統(tǒng)的單片機(jī)(添加或刪除設(shè)備行前面的分號(hào))。
5.?????? 選擇接口,和選擇單片機(jī)一樣。
6.?????? 使用頻率計(jì)測(cè)量出校正時(shí)鐘的頻率。這個(gè)信號(hào)在STK500/AVRISP 的MOSI 引腳,或者 JTAG ICE的TDI引腳。在接口文件的行 ”.EQU CALIB_CLOCK_FREQ = XXXX” 中修改頻率。
7.?????? 指定用戶系統(tǒng)期望的頻率和精度。注意精度太高會(huì)可能校正失敗,參考數(shù)據(jù)手冊(cè)查看可能達(dá)到的精度。
8.?????? 編譯工程產(chǎn)生 hex 二進(jìn)制文件。
9.?????? 如果使用 STK500/AVRISP 進(jìn)行校正:
a.?????? 在文本編輯器中打開批處理文件 ”\AVR053\AVR Asm\Batch file\ISP_rc_calib.bat” (使用命令行 STK500.exe -h 查看相關(guān)參數(shù)的信息)。
b.?????? 編輯文件,對(duì)應(yīng)使用的單片機(jī)型號(hào)。修改 -datmega16 參數(shù)為 -d[用戶型號(hào)]。
c.?????? 修改熔絲設(shè)置,確定熔絲設(shè)置是校正需要的:選擇 8MHz 內(nèi)部 RC 如果需要校正單片機(jī)到 8MHz。熔絲設(shè)置通過參數(shù) -E(擴(kuò)展熔絲)和 -f(高/低熔絲)設(shè)置。確認(rèn)熔絲設(shè)置中看門狗定時(shí)器總是關(guān)閉。
d.?????? 如果 AVR Studio 的安裝路徑和批處理文件的不同(標(biāo)準(zhǔn)英文 Windows 版本),請(qǐng)修改 stk500.exe 的路徑。
e.?????? 保存文件。
10.??? 如果使用 JTAGICE 校正:請(qǐng)注意復(fù)位必須可用。
a.?????? 打開文件 ”\AVR053\AVR Asm\Batch file\JTAGICE_rc_calib.bat”(使用命令行方式j(luò)tagice.exe -h 查看詳細(xì)參數(shù))。
b.?????? 編輯文件,修改單片機(jī)型號(hào),修改 -datmega16 參數(shù)為 -d[用戶型號(hào)]。
c.?????? 修改熔絲設(shè)置。確定熔絲設(shè)置是正確的:如果校正單片機(jī)到 8MHz 就選擇 8MHz 內(nèi)部 RC 振蕩器。熔絲設(shè)置通過參數(shù) -E(擴(kuò)展熔絲)和 -f(高/低熔絲)設(shè)置。確認(rèn)熔絲設(shè)置中看門狗定時(shí)器總是關(guān)閉。
d.?????? 如果 AVR Studio 的安裝路徑不同于批處理文件(標(biāo)準(zhǔn)英文 Windows 版本),請(qǐng)修改jtagice.exe 的路徑。
e.?????? 保存文件。
11.??? 如果使用 JTAGICE mkII 進(jìn)行校正:請(qǐng)注意復(fù)位可用
a.?????? 打開文件 ”\AVR053\AVR Asm\Batch file\JTAGICE_mkII_rc_calib.bat”(使用命令行方式 jtagiceii.exe -h 查看詳細(xì)參數(shù)設(shè)置)。
b.?????? 編輯文件,修改單片機(jī)型號(hào),修改 -datmega16 參數(shù)為 -d[用戶型號(hào)]。
c.?????? 修改熔絲設(shè)置。確定熔絲設(shè)置是正確的:如果校正單片機(jī)到 8MHz 就選擇 8MHz 內(nèi)部 RC 振蕩器。熔絲設(shè)置通過參數(shù) -E(擴(kuò)展熔絲)和 -f(高/低熔絲)設(shè)置。確認(rèn)熔絲設(shè)置中看門狗定時(shí)器總是關(guān)閉。
d.?????? 如果 AVR Studio 的安裝路徑不同于批處理文件(標(biāo)準(zhǔn)英文 Windows 版本),請(qǐng)修改jtagiceii.exe 的路徑。
e.?????? 保存文件。
12.??? 連接 STK500, AVRISP, JTAGICE 或 JTAGICE mkII 到用戶板,并給它們上電。檢查串口線與計(jì)算機(jī)連接好。
13.??? 打開 windows 的 DOS 方式,切換到目錄 ”\AVR053\AVR Asm\Batch file\”。執(zhí)行批處理文件(ISP_rc_calib.bat, JTAGICE_rc_calib.bat 或 JTAGICE_mkII_rc_calib.bat)。
14.??? 等待校正完成。
?
批處理文件也可以修改為在校正后編程自定義的固件代替 test.hex。要清楚新的校正值要在運(yùn)行時(shí)由固件載入 OSCCAL 寄存器。
評(píng)論
查看更多