官方文檔-AVR109_自編程_第1頁
官方文檔-AVR109_自編程_第2頁
官方文檔-AVR109_自編程_第3頁
官方文檔-AVR109_自編程_第4頁
官方文檔-AVR109_自編程_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、AVR109: 自編程 翻譯:邵子揚(yáng)AVR109: 自編程翻譯:邵子揚(yáng) 2006年8月4日shaoziyang1. 特點(diǎn)l 自編程的 C 語言代碼示例l 讀寫 Flash 和 EEPROMl 讀寫鎖定位l 讀取熔絲位l 設(shè)計為可以在 AVR911 開源編程器下工作l 和 AVRProg 兼容l 為高效編程優(yōu)化協(xié)議2. 介紹這篇應(yīng)用筆記說明了怎樣使用 SPM 指令(Store Program Memory)對 AVR 單片機(jī)自編程。示例應(yīng)用通過 UART 和 PC 上的 AVR 開源編程器(AVROSP,參考應(yīng)用筆記AVR911)進(jìn)行通信,對 Flash 和 EEPROM 進(jìn)行編程而無需硬件編程

2、器。代碼也兼容于 AVRProg (僅支持 AVRProg 的芯片)。一個啟動管理(BootLoader)程序位于 Flash 的 Boot 區(qū)。這個程序處理和計算機(jī)之間的通信,對 Flash 和 EEPROM 進(jìn)行編程。一旦編程后,不同級別的保護(hù)可以應(yīng)用到 boot 或者用戶程序的 Flash 上。AVR 提供了一種獨(dú)特的適應(yīng)性,允許用戶修改存儲器的保護(hù)。3. SPM 說明為了更好的理解 AVR 的自編程能力,下面解釋這個基本特點(diǎn)。3.1 存儲器組織Flash 存儲器分為兩個部分,用戶程序區(qū)和 BootLoader 區(qū)。用戶程序區(qū)包含了應(yīng)用程序的代碼,而 BootLoader 區(qū)包含了自編程

3、的代碼,SPM 指令只能在 BootLoader 區(qū)執(zhí)行(注意:BootLoader 區(qū)可以用于執(zhí)行一般程序)。Flash 存儲器分成包含 32、64 或 128 字的頁,頁的用法在后面解釋。整個存儲器,包括用戶程序區(qū)和 BootLoader 區(qū),都是這樣分頁的。例如,一個具有 8 KB Flash 的芯片每頁有 32 個字(64 字節(jié)),總共有 128 頁。存儲器結(jié)構(gòu)如圖1 所示。圖1. 存儲器組織BootLoader 區(qū)的大小可以用兩個 BOOTSZx 熔絲位進(jìn)行選擇,通過熔絲可以選擇四個預(yù)定義的大小。BOOTSZx 熔絲可以通過串行或并行編程器進(jìn)行修改。參考芯片的數(shù)據(jù)手冊獲取詳細(xì)內(nèi)容。如

4、果要執(zhí)行 BootLoader,可以用 call 或 jump 從用戶程序區(qū)直接調(diào)用,或者編程 BOOTRST 熔絲。當(dāng) BOOTRST 熔絲被編程后,單片機(jī)在復(fù)位后將從 BootLoader 區(qū)開始執(zhí)行,而不是從地址 0 開始運(yùn)行。3.2 Read-While-Write 能力另外,可以選擇劃分用戶程序區(qū)和 BootLoader 區(qū)。而 Flash 也分為兩個固定大小的區(qū),第一個區(qū)是 Read-While-Write (RWW) 區(qū),第二個區(qū)是非 No-Read-While-Write (NRWW) 區(qū)。NRWW 區(qū)大小總是等于最大可選擇的 BootLoader 區(qū)大小,就是說 BootLo

5、ader 區(qū)占用全部或部分 NRWW 區(qū)。如圖2 所示。圖2. RWW 和 NRWW 區(qū)不同之處在于當(dāng)更新 RWW 區(qū)時可以訪問 NRWW 區(qū),而更新 RWW 區(qū)時是不能訪問 RWW 區(qū)的。當(dāng) NRWW 更新時(如更新 BootLoader 自身的代碼),在整個操作期間單片機(jī)被停止。換句話說, 對 NRWW 區(qū) 不能 Read-While-Writing,但是可以對 RWW 區(qū) Read-While-Writing。具體參考芯片的數(shù)據(jù)手冊。這個功能使得可以在更新 RWW 區(qū)時繼續(xù)執(zhí)行程序。注意這些代碼必須在 NRWW 區(qū)之中(不需要包含在 BootLoader 區(qū)中)。查看下面中斷小節(jié)。ATm

6、ega163 和 ATmega323 沒有 NRWW 和 RWW 區(qū),只能選擇劃分用戶程序區(qū)和 BootLoader 區(qū)。任何對 Flash 的更新都會停止單片機(jī)的運(yùn)行。3.3 使用 SPM 指令所有自編程操作都使用了 SPM 指令,通過 SPMCR 寄存器進(jìn)行選擇(某些芯片是 SPMCSR)。寄存器如圖3。圖3. SPMCR 寄存器當(dāng)使用 SPM 功能,SPMEN 位必須在執(zhí)行 SPM 指令的 4 個周期內(nèi)設(shè)置,這是防止意外改寫 Flash。軟件必須保證在設(shè)置 SPMEN 位和執(zhí)行 SPM 指令時不進(jìn)入中斷程序,超過了 4 個周期的限制。其它 4 個灰色位選擇不同的 SPM 函數(shù)。SPMEN

7、 位在操作完成后和函數(shù)位一起被自動清除。SPM 函數(shù)的說明如下。3.3.1 頁擦除所有 Flash 存儲器的更新是一頁一頁完成的,在寫入新數(shù)據(jù)之前,必須擦除頁。Z 寄存器用于選擇擦除的頁,設(shè)置 Z 寄存器指向要擦除的頁,頁選擇字節(jié)的低位被忽略。例如,一個頁有32字(64字節(jié))的單片機(jī),z 寄存器的低 6 位被忽略。要擦除一頁,設(shè)置 SPMCR 寄存器的 PGERS 和 SPMEN 位,并執(zhí)行 SPM 指令。3.3.2 載入頁緩存為了寫入新數(shù)據(jù)到頁,必須首先填充頁緩存。頁緩存是一個獨(dú)立的(不是 SRAM)只寫的緩存,用來保存一個臨時頁。這個緩存必須一個字一個字的填充,緩存一次性就復(fù)制到 Flas

8、h 存儲器中。Z 寄存器用來選擇寫入緩存的字。Z 寄存器的 LSB 被忽略,因為整個字總是一次寫入,單字節(jié)訪問是不允許的。Z 寄存器的高位選擇寫入頁緩存時忽略的頁。Z 寄存器對于 32 字(64 字節(jié))的位結(jié)構(gòu)如圖4,大頁面使用更多位來選擇。圖4. 寫入頁緩存為了寫入字到頁緩存,載入字到 R1:R0 寄存器。設(shè)置 Z 寄存器指向正確的字并只設(shè)置 SPMCR寄存器的 SPMEN 位,然后 SPM 指令必須在 4 個周期內(nèi)執(zhí)行。3.3.3 頁寫當(dāng)頁緩存載入新數(shù)據(jù)后,它就可以寫入 Flash。為了完成這個步驟,和頁擦除小節(jié)說明的一樣設(shè)置 Z 寄存器。然后設(shè)置 SPMCR 寄存器的 PGWRT 和 S

9、PMEN 位,并執(zhí)行 SPM 指令,R1:R0 寄存器的內(nèi)容被忽略。32 字(64 字節(jié))的頁寫入時 Z 寄存器的用法如圖5。圖5. 寫入頁到 Flash可以查詢SPMEN位看頁更新是否完成,更新過程也可以用中斷控制,具體請查看下面的中斷小節(jié)。3.3.4 RWW 區(qū)忙標(biāo)志當(dāng)執(zhí)行 RWW 區(qū)頁擦除或頁寫入時,RWWSB 標(biāo)志位被硬件設(shè)置,指示這個區(qū)不能被訪問。RWWSB 標(biāo)志位需要在 SPM 完成后用軟件清除,即設(shè)置 SPMCR 寄存器的 RWWSRE 和 SPMEN 位,在 SPM 指令 4 個周期內(nèi)。標(biāo)志位在開始載入頁緩存時自動被清除。RWWSB 標(biāo)志位可以被其他程序用來檢查 RWW 區(qū)是否

10、可以被訪問。參考芯片的數(shù)據(jù)手冊獲得詳細(xì)資料。注意在使用 RWWSRE 功能時 Z 寄存器的內(nèi)容和 R1:R0 寄存器被忽略。注意如果 RWW 區(qū)在擦除或?qū)懭牒鬀]有被重新允許就訪問,所有 RRW 區(qū)地址讀取都是 0xFFFF。這對使用 LPM 讀取 Flash 和執(zhí)行調(diào)用或跳轉(zhuǎn)到 RWW 區(qū)都起作用。沒有允許就執(zhí)行跳轉(zhuǎn)到 RWW 區(qū)的結(jié)果是執(zhí)行“0xFFFF”,最終將導(dǎo)致程序計數(shù)器直接超過代碼空間,直到遇到第一個可以執(zhí)行的代碼。這種情況下首先執(zhí)行的代碼一般位于 NRWW 區(qū)的起始地址。3.3.5 Boot 鎖定位程序和 BootLoader 區(qū)可以用不同等級保護(hù)。一共有 4 級保護(hù),下面是幾種模

11、式的簡單說明。表1. Boot 鎖定位Mode位說明Mode 111完全讀寫訪問Mode 210沒有寫訪問Mode 300沒有從其他區(qū)的讀寫訪問(數(shù)據(jù)或執(zhí)行中斷)Mode 401沒有從其他區(qū)的讀訪問(數(shù)據(jù)或執(zhí)行中斷)注意一旦編程后(清除),除非使用編程器外就不能再次編程這些位了。例如,為了使程序可以被更新一次,設(shè)置程序區(qū) Boot 鎖定模式 1 ,并且設(shè)置 BootLoader 區(qū)鎖定模式4。這就防止程序訪問 BootLoader,而 BootLoader 可以完全訪問程序區(qū)進(jìn)行更新。更新后,BootLoader 再設(shè)置程序區(qū)為模式 3,就可以阻止所有的訪問了。為了編程 Boot 鎖定位,使用

12、 R0 寄存器裝載鎖定位,設(shè)置 BLBSET 和 SPMEN 位并執(zhí)行 SPM 指令。Z 寄存器的內(nèi)容被忽略。使用 LPM 指令代替 SPM 指令讀取這些位。3.4 中斷處理寫 RWW 區(qū)時可以使用中斷,但是軟件必須防止其它任何訪問 RWW 區(qū)。換句話說,中斷服務(wù)程序在更新 RWW 區(qū)時,必須放在 NRWW 區(qū)執(zhí)行,包括中斷向量。使用 GICR 寄存器的 IVSEL 位,程序可以使用兩個獨(dú)立的中斷向量表。一個在程序區(qū),另一個在 BootLoader 區(qū),在更新 RWW 區(qū)時使用。這使得程序在臨界時可以繼續(xù)運(yùn)行,如自編程時安全監(jiān)視。參考芯片的數(shù)據(jù)手冊獲取更多中斷和 IVSEL 標(biāo)志位的資料。如果

13、第二中斷向量沒有被使用,在更新 RWW 區(qū)時中斷必須被禁止。3.4.1 SPM 中斷所有支持自編程的芯片,除了 ATmega163 和 ATmega323,可以使用中斷控制 Flash 更新。設(shè)置 SPMIE 位將允許 SPM 中斷,這可以指示當(dāng)前 SPM 操作什么時候結(jié)束。3.5 EEPROM 沖突注意所有寫 EEPROM 必須在執(zhí)行 SPM 指令之前完成,反之亦然。寫/擦除 Flash 和 EEPROM 不能同時發(fā)生。3.6 典型更新過程兩個公共更新過程如圖6。左邊的流程圖說明了 Read-Modify-Write 操作更新小塊 Flash,如一個字符串常數(shù)。右邊的流程圖說明了頁寫入操作用

14、于直接寫入整頁而不讀取以前的內(nèi)容,如將從 UART 接收的數(shù)據(jù)寫入。圖6. 典型更新例流程4. Boot Loader 例子這里介紹的 BootLoader 軟件使用了 AVR 開源編程器(AVROSP)作為用戶接口。例子程序執(zhí)行讀取或更新 Flash 和 EEPROM 存儲器,也可以讀取或更新鎖定位和熔絲位。5. AVRProg 兼容性AVRProg 兼容性依賴于芯片代碼,但是沒有定義所有芯片的代碼。文件 preprocessor.xls 包含了已經(jīng)定義的芯片代碼,但是一些不能運(yùn)行于 AVRProg 下。在這種情況下,使用相同內(nèi)存大小的芯片代碼。AVROSP,只依賴于簽名字節(jié),支持所有具有自

15、編程功能的芯片。6. 協(xié)議BootLoader 程序使用的協(xié)議是 AVRProg 協(xié)議的子集。表2 顯示了一個支持命令的列表,所有命令開始于一個單字符,編程器返回 13d (回車) 或者數(shù)據(jù)。未知命令返回一個 “?”。表2. AVRProg 命令主機(jī)寫主機(jī)讀IDDataData進(jìn)入編程模式“P”13d自動增加地址“a”dd設(shè)置地址“A”ah al13d寫程序存儲器低字節(jié)“c”dd13d寫程序存儲器高字節(jié)“C”dd13d頁寫“m”13d讀鎖定位“r”dd讀程序存儲器“R”2*dd讀數(shù)據(jù)存儲器“d”dd寫數(shù)據(jù)存儲器“D”dd13d芯片擦除“e”13d寫鎖定位“l(fā)”dd13d讀熔絲位“F”dd讀熔絲

16、位高位“N”dd讀擴(kuò)展熔絲位“Q”dd退出編程模式“L”13d選擇芯片型號“T”dd13d讀取簽名字節(jié)“s”3*dd返回支持的芯片代碼“t”n*dd00d返回軟件識別符“S”s7返回軟件版本“V”dd dd返回編程器類型“p”dd設(shè)置 LED“x”dd13d清除 LED“y”dd13d退出 Bootloader“E”13d檢查塊支持“b”“Y”*2*dd開始 Flash 塊載入“B”2*dd“F”n*dd13d開始 EEPROM 塊載入“B”2*dd“E”n*dd13d開始 Flash 塊讀“g”2*dd“F”n*dd開始 EEPROM 塊讀“g”2*dd“E”n*dd7. 編程說明主程序開始于檢查編程是否完成,或者用戶程序區(qū)代碼是否執(zhí)行。在這個應(yīng)用筆記中,這由 PIND 的值標(biāo)明。如果用戶PortD的特殊引腳在復(fù)位時保持低電平,就進(jìn)入編程模式。如果是高電平,就從地址 $0000(如同普通復(fù)位那樣)開始執(zhí)行。在編程模式,程序通過 UART 接受 AVROSP 的命令,每個命令執(zhí)行一個對應(yīng)的任務(wù)。任何不可識別的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論