在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            關(guān) 閉

            新聞中心

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

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

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

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

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

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

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

            c.JPG


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


            上一頁 1 2 下一頁

            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉