a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

關 閉

新聞中心

EEPW首頁 > 工控自動化 > 設計應用 > 利用I2C總線實現ATmega88的在應用編程

利用I2C總線實現ATmega88的在應用編程

作者: 時間:2012-12-05 來源:網絡 收藏

摘要:提出了一種利用實現的方法,詳述了Bootloader程序及與其相應的上位機程序設計,以及利用PC機串口握手信號模擬的方法。實踐證明,該方法可成功實現上多個的在線調試與升級,也可用于其他AVR系列微控制器的
關鍵詞:I2C總線;

引言
隨著嵌入式系統技術的發展,電可擦除的Flash存儲器由于具有容量大、成本低、編程方便等優點,在微控制器領域得到了廣泛的應用Flash微控制器在正常運行前必須將Flash寫入用戶應用程序,目前對微控制器的Flash程序存儲器進行編程的方法主要有出廠固化、編程器編程、在系統編程(In System Programming,ISP)和在應用編程(In Application programming,IAP)4種。
其中,出廠固化和編程器編程方法都要求微控制器在焊接前將程序寫入,這顯然不滿足開發階段的調試和日后升級的需要。目前比較普及的是在板可編程的ISP和IAP方法。ISP是通過微控制器的串行編程寫入應用程序,需要少量的外部電路輔助實現;IAP將Flash映射為用戶程序和Bootloader兩個存儲區,Bootloader可通過系統已有的USB、串口、SPI、I2C總線等各種通信接口,對用戶程序進行更新而不需要外部電路輔助,實現更加靈活,可方便地實現程序的在線及遠程升級。
在利用ATmega88微控制器開發四旋翼飛行器的無感無刷直流電機驅動器時,由于定時器PWM輸出口與SPI接口存在引腳共用問題,用SPI口進行ISP編程時會使MOS管誤導通而燒毀。由于驅動器中的4個ATmega88微控制器是通過I2C總線通信的,為了調試和升級方便,提出并實現了通過I2C總線對AVR微控制器進行在應用編程的方法,包括Bootloader程序、I2C總線的PC機串口模擬、上位機程序及相關的通信協議。實踐證明,該方法可成功實現I2C總線上多個ATmega88微控制器的在線升級。

1 ATmega88微控制器的Bootloader設計
ATmega88是一款基于AVR增強RISC體系結構的CMOS低功耗8位微處理器,它通過執行強大的單周期指令,達到接近1 MIPS/MHz的運算效率。ATmega88的Flash被分為128個大小為64字節的頁面,Flash的編程操作都是以頁面為單位進行的。為了用戶程序的安全性,以及用戶的ISP和IAP編程需要,ATmega88的Flash存儲空間被分為引導程序區(Bootloader Section)和應用程序區(Application Program Section)兩部分。
引導程序區為非同時讀寫區,應用程序區為同時讀寫區。在非同時讀寫區內執行的代碼可以對同時讀寫區內的頁面進行編程操作,根據這一機制我們可以編制Bootloader程序并將其存儲于引導程序區內,以實現應用程序區代碼的在線與遠程升級。
由于ATmega88分配給引導程序區的空間大小有限(最大2 KB),Bootloader程序一定要簡潔而高效,圖1給出了以I2C總線為通信接口的Bootloader程序流程圖。

本文引用地址:http://www.j9360.com/article/159653.htm

c.JPG


為了能夠執行Bootloader程序,ATmega88熔絲位中的BOOTRST應設為零,這樣在系統上電或應用程序接收到升級命令利用看門狗復位后,系統就能從引導程序區運行Bootloader程序。Bootloader程序中維持了一個溢出時間為2 s的定時器,該定時器利用TIM1以查詢的方式實現。沒有程序更新或程序更新完畢,程序在2 s內沒有從I2C總線接收到數據幀時則利用(*((void(*)(void))(0x0000)))()函數跳轉到應用程序區執行應用程序,在2s內接收到數據幀后,則將定時器重置,以繼續接收數據幀更新應用程序。
在Bootloader實現中,ATmega88的I2C總線工作在從模式,上位機的I2C總線工作在主模式。上位機發送的數據幀由2字節的Flash頁面地址、64字節的頁面數據、1字節的密碼和1字節的異或校驗和構成。Bootloader接收到數據幀后會用數據長度、密碼、異或校驗和對數據幀進行校驗,校驗正確的話則根據數據幀中Flash的頁面地址和數據相應的Flash頁面進行編程,并將flag置1;校驗錯誤的話,則丟棄數據幀等待重發的數據幀。
上位機在發送數據幀后讀取flag,并根據其狀態重發數據幀或發送下一頁面的數據幀。flag被讀取后Bootloader程序將其清零,這樣就形成了一個簡潔而有效的差錯控制機制。Flash中頁面的編程由頁擦除和頁編程兩個過程組成,頁擦除由AVR庫函數中的boot_page_erase(addr)函數實現,addr為相應頁面中的字節地址。
ATmega88的Flash是以頁為單位進行擦除和寫入操作的,因此在進行Flash頁面寫入前,要多次調用boot_page_fill(addr,data)函數將整頁的程序代碼寫入臨時緩沖區,其中addr為指令所要寫入的字節地址,data為相應的由2個字節構成的16位程序指令。Flash頁面的寫入由boot_page_write(addr)函數實現,addr為相應頁面中的字節地址。
為了程序安全,Flash執行頁擦除和編程操作時要求CPU處于等待狀態,因此Flash的頁擦除和寫入函數執行后都要調用boot_spm_busy_ wait()函數等待操作完成。此時,I2C總線也處于掛起狀態,等所有操作完成后才能將總線釋放。上位機軟件在發送完數據幀后就一直監聽總線狀態,等總線釋放后再讀取flag狀態,并決定是重發還是發送下一幀,這樣就實現了有效的通信流量控制。
整個Bootloader程序編譯完成后,大小為506字節。因此,熔絲位中的BOOTSZI和BOOTSZ0應設為1和0,將引導程序區設置為地址0x1E00~0x1FFF、大小為512字節的區域。為了使Bootloader程序能正確寫入到該區域,程序編譯時要將程序起始地址設定在0x1E00,在WinAVR中可以通過在Makefile中添加“LDFLAGS+=-W1,——section—start=.text=0x1E00”實現。編譯完成的Bootloader可以在ATmega88確定PCB前,通過編程器或ISP寫入到Flash中。


上一頁 1 2 下一頁

評論


相關推薦

技術專區

關閉