<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
關(guān) 閉

新聞中心

EEPW首頁(yè) > 工控自動(dòng)化 > 設計應用 > 利用I2C總線(xiàn)實(shí)現ATmega88的在應用編程

利用I2C總線(xiàn)實(shí)現ATmega88的在應用編程

作者: 時(shí)間:2012-12-05 來(lái)源:網(wǎng)絡(luò ) 收藏

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

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

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

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

c.JPG


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


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>