欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

    專注電子技術(shù)學(xué)習(xí)與研究
    當前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

    STC單片機的下載協(xié)議

    作者:萬致遠   來源:www.rwzy.co.cc   點擊數(shù):  更新時間:2012年08月19日   【字體:

       關(guān)于STC的下載在Linux平臺下面一直是一個老大難的問題。我最近一段時間去ourdev網(wǎng)站,和數(shù)碼之家,包括有一些熱心人的協(xié)助。以及一些前人開發(fā)的開源軟件,類似gSTC-ISP之類的軟件。才讓我完全的搞懂了STC的ISP協(xié)議。

    本文以GPL v3條款發(fā)布。但是切勿胡亂傳播。影響宏晶的利益。這個逆向工程做的并不妥當。望宏晶包涵,畢竟你并未公開協(xié)議。導(dǎo)致我們使用Linux的人痛苦不堪。

    現(xiàn)在先放出用Gambas寫的兩個ISP軟件。分別對應(yīng)89系列和12系列。15系列正在分析。別的系列因為不常用暫無協(xié)議。

    SerialPort  kSTC89-ISP

    那么呢,我就先從STC89系列的講起。大同小異的。

    STC89系列的單片機在上電的時候會執(zhí)行在ISP FLASH的ISP程序。只要在串口上收到連續(xù)的0x7f,便會進入ISP模式。老姚選擇 0x7f的理由是里面沒有連續(xù)的低電平。這樣的話就可以讓單片機來調(diào)整自身UART的時鐘到計算機的時鐘,讓波特率同步。但是若頻率太高,則測不準。所以啟動波特率要控制在9600以下為宜。

    而且均有時間限制。如果不在超時時間內(nèi)連接MCU。MCU會自動斷開,跑用戶程序。這就是為什么某些芯片,類似PL2303打開關(guān)閉速度慢的芯片下載容易出問題的原因。

    切入正題:

    STC的數(shù)據(jù)包格式為:

    包頭 2BYTE+標識 2BYTE +長度 1BYTE +包類型1 BYTE+數(shù)據(jù) nnBYTE+校驗碼 1BYTE+包尾1BYTE。

    包頭固定0×46,0xb9.(但是在信息幀中不包含包頭

    標識來自單片機的是68 00

    而來自計算機的是6A 00

    包尾固定0×16.

    至于我這里捕獲的標識,在89系列里大概有

    0×00 ——信息(注意,這里沒有包頭)

    0×00 ——數(shù)據(jù)(這個是切換波特率以后的

    0x8F ——新波特率實驗

    0x8E ——波特率正式更改

    0×84 ——擦除芯片

    0×80 ——校驗返回

    0x8D ——設(shè)置選項并且結(jié)束編程

    0×80 ——(結(jié)束時,上位機)結(jié)束編程,通知MCU復(fù)位。

    0×80 ——暫時未知(交互中的,不影響下載)

    通訊的交互過程

    PC =》開啟0x7f MCU

    MCU=》信息 PC

    PC=》計算重載值,波特率測試 MCU(發(fā)送完立馬要切換波特率到計算值) MCU

    MCU =》確認波特率測試 =》PC

    PC=》(切換回原波特率)波特率正式改變 MCU

    MCU =》(切換到計算值)確認

    PC=》未知

    MCU=》確認

    PC=》擦除

    MCU =》 確認

    PC=》寫入數(shù)據(jù)包

    MCU =》確認

    PC =》設(shè)置選項

    MCU =》確認

    PC=》退出編程

    MCU =》返回。

    校驗和的算法就是除了包頭,包尾,校驗和,其他統(tǒng)統(tǒng)加起來,取低八位(STC89)或者低16位(STC12)。

    —————————–大致的通訊過程如上,現(xiàn)在從信息幀講起—————————-

    信息幀是類似這個的信息(注意,沒有包頭):

    68 00 3B 00 14 DA 14 DA 14 DA 14 DA 14 DA 14 DA 14 DA 14 DA 43 43 FD F0 02 82 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 16

    其中數(shù)據(jù)部分的Byte 4 ~ 19均為測量PC的脈寬,而按照脈寬計算CPU的速度的公式為:

    fOSC=脈寬 *波特率 * 12 /7,依次可以計算出MCU可以用的最高波特率。

    后面的0×43 0×43代表MCU固件是4.3C.

    緊跟的0xFD代表選項信息:

    x x x x x x x x
    8 7 6 5 4 3 2 1
    3=需要短接P1.0/P1.1 才能下載 1=關(guān)閉,0=開啟
    6=ALE腳,0=P4.5,1=ALE
    8=停止看門狗,1=復(fù)位關(guān),0=停電關(guān)
    7=允許訪問內(nèi)部AUX RAM,1=允許,0=不允許
    4=下次下載擦DATAFLASH,0=開,1=管
    5=時鐘增益,1=高,0=低
    1=時鐘倍速,1=12T,0=6T

    然后,PC需要計算出MCU最高可用波特率。但是這里STC89系列比較的奇怪。因為在11.0592M的晶振下,居然能跑到115200的波特率。但是用傳統(tǒng)公式計算。最多就57600.
    似乎是倍頻再倍頻,也就是原來是/16的現(xiàn)在/8了。實在是奇怪。

    PUBLIC FUNCTION Calculate_load(Baud AS Integer, Crystal AS Long) AS String
      'Crystal以HZ計單位
      '12T函數(shù)
      DIM reload AS Byte
      DIM Baud0 AS Integer
      DIM v AS Long
      '使用12T模式,加倍STC超級波特率
      v = Baud * 32
      reload = Int(256 - (crystal / v) + 0.5)
      baud0 = ((crystal / 2) / (256 - reload) / 16)
      TRY calc_error = Abs((Baud / baud0) - 1) * 10000
      RETURN Chr(reload)
    END

    看起來這個玩意的實現(xiàn)應(yīng)該是*軟件模擬的。但是具體的實現(xiàn)的話。我還是不清楚。畢竟現(xiàn)在老姚學(xué)聰明了。MOVC讀FLASH以外的地方均會導(dǎo)致復(fù)位……所以具體實現(xiàn)方式實在弄不清楚。

    波特率實驗幀的數(shù)據(jù)部分是

    FF 重載值 00 00 06 等待回應(yīng)值 ISP定時常數(shù)

    重載值的上面已經(jīng)貼出GAMBAS的計算方式。對于PL2303芯片這種打開和關(guān)閉速度比較慢的串口,等待回應(yīng)值我喜歡用0xE0。因為可以在比較快的速度下不出錯。ISP定時常數(shù)推薦使用0×81。我測試到50M的外部時鐘都不出問題。

    然后PC必須在規(guī)定的時間內(nèi)切換到新的波特率上,等待MCU的回應(yīng)。

    MCU的回應(yīng)PC的幀一模一樣,只是標識和校驗和有差別。

    然后再次重復(fù)。只不過不發(fā)送ISP定時值。

    接著一番交互以后:

     
    1 Sent:46 B9 6A 00 0C 80 02 00 36 01 F0 02 21 16
    2 recv:46 B9 68 00 06 80 EE 16

     

    這一段代碼似乎是固定的。

    PC就會向MCU發(fā)送擦除命令。很簡單,直接順序發(fā)出去即可:

    1 46 B9 6A 00 0D 84 02 33 33 33 33 33 33 2F 16

    然后接受到MCU的回應(yīng)后。發(fā)送ROM數(shù)據(jù)包:

    ROM數(shù)據(jù)包的格式很簡單

    0×00(標識)+0×00 0×00(填充) +高八位地址+低八位地址+0×00+長度(一般固定0×80,后面填充就OK了)+數(shù)據(jù)

    然后MCU的回應(yīng)也比較簡單:

    1 46 B9 68 00 07 80 79 68 16

    0×80是標識。

    至于0×79就是寫入的時候返回的校驗和了。算法就是把上一次發(fā)送的數(shù)據(jù)部分用一次加法校驗和。

    循環(huán)到終點,就發(fā)送設(shè)置選項命令:

    1 46 B9 6A 00 0A 8D FD FF F4 FF F0 16

    其中的0xFD君就是選項信息了。參見信息幀的介紹章。

    等待MCU回應(yīng)后,發(fā)送退出幀讓MCU復(fù)位。執(zhí)行用戶程序。

    STC89系列的先介紹到這里。

    關(guān)閉窗口

    相關(guān)文章