新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > LPC21XX系列ARM微處理器ISP升級程序設計

        LPC21XX系列ARM微處理器ISP升級程序設計

        作者: 時間:2011-03-14 來源:網絡 收藏


        在系統中編程,英文簡稱ISP,即In System Programming,是Lattice半導體公司首先提出來的一種讓我們能在產品設計、制造過程中的每個環節,甚至在產品賣給最終用戶以后,具有對其器件、電路板或整個電子系統的邏輯和功能隨時進行重組或重新編程的技術。
        ISP使得MCU、CPLD等不必從目標板中拔出,通過串口或專用下載電纜就可實現本地或遠程下載來實現程序升級。
        飛利浦的LPC2000系列片內含FLASH的ARM7微處理器支持ISP和IAP(In ApplIcation Programming——在應用編程)。
        LPC2000系列微處理器通過其UART0與PC(或其他設備)的COM口聯機實現ISP。
        復位時,P0.14為低電平會使LPC2000系列微處理器進入ISP功能模式,否則進入正常工作模式。
        P0.14在復位后默認初始化為高阻模式,用戶需要提供外部硬件條件——上拉或接地,使引腳處于一個確定的狀態,否則可能導致功能紊亂——非預期的ISP模式或正常工作模式。
        飛利浦提供公用的ISP下載程序,但是在某些情況下,例如為了程序統一性,個性化或固件的保密性,我們有必要設計自己的ISP下載程序。
        ISP處理過程
        ISP的整個過程如下圖所示:

        1. ISP模式的進入
        復位時P0.14的3ms以上持續的低電平是LPC2000系列微處理器進入ISP功能模式的必要條件。PC的串口應設定為8個數據位、1個停止位和無奇偶校驗,波特率建議設置為9600bps,由于受ISP處理速度的影響,過高的波特率并不見得會提高ISP處理速度,反而容易導致ISP處理沒有響應。
        2. 自動波特率檢測
        LPC2000系列微處理器在進入ISP模式之后,會自動進行“自動波特率檢測”,因為微處理器并不清楚自己所連接的晶振頻率和PC程序所設置的串口波特率。在“自動波特率檢測”通過之后,微處理器就進入處理PC程序所發送的ISP命令的狀態。
        自動波特率檢測的流程如下圖所示:

        PC機先發送一個同步字“?”,若微處理器因為在復位時檢測到P0.14為低電平而進入了ISP模式,則微處理器會發送“Synchronized\r\n”給PC,PC在接收到“Synchronized\r\n”之后,回發“Synchronized\r\n”給微處理器,微處理器在收到“Synchronized\r\n”之后,發送“Synchronized\r\nOK\r\n”給PC,PC在收到“Synchronized\r\nOK\r\n”之后,以ASCII碼的形式發送晶振頻率(kHz)給微處理器。例如晶振頻率為12MHz,則PC發送給微處理器的字串為“12000\r\n”。微處理器在接收到晶振頻率之后會發送“OK\r\n”給PC作為響應。
        注意事項:
        (1) 處理器與PC的數據交換過程中,所有數據均以“\r\n”作為結尾,十六進制為0x0D,0x0A。
        (2) 任何發送或接收出錯之后,只能通過PC軟件提示“操作失敗”,并要求用戶重啟(復位/開關電源)微處理器來解決。
        (3) 所有數字均以ASCII碼的形式發送。
        3.ISP命令處理
        在自動波特率檢測之后,PC就可以通過串口發送ISP命令和數據給微處理器了。
        ISP命令簡介
        LPC2000系列微處理器支持的ISP命令如下表所示,更詳細的介紹參見周立功網站的http://www.zlgmcu.com/philips/arm/about/LPC2000_FLASH.pdf以及《ARM微控制器基礎與實戰》一書。
        ISP命令簡單匯總
        ISP命令 功能
        U 23130 解鎖。在對 FLASH編程、擦除運行之前必須執行該命令。
        B 波特率>停止位>設置波特率。
        A 1/0>回聲開關。控制微處理器是否將接收到的數據回發給 PC。
        W RAM地址>長度>PC寫數據到微處理器RAM。數據格式為UU碼。
        R RAM地址>長度>PC從微處理器RAM讀數據。數據格式為UU碼。
        P 起始扇區>結束扇區>選定即將操作的扇區范圍。
        C FLASH地址>RAM地址>字節數>命令微處理器將 RAM中的數據燒寫到FLASH中。
        G 地址>模式>執行 FLASH或RAM中的代碼。
        E 起始扇區>結束扇區>擦除選定的扇區。
        I 起始扇區>結束扇區>檢查指定的扇區是否為空。
        J讀器件 ID。
        K讀 BOOT代碼版本號。
        M 地址1>地址2>字節數>比較 FLASH和/或RAM中的數據。
        注意事項:
        (1) 處理器與PC的數據交換過程中,所有數據均以“\r\n”作為結尾,十六進制為0x0D,0x0A。
        (2) 任何發送或接收出錯之后,只能通過PC軟件提示“操作失敗”,并要求用戶重啟(復位/開關電源)微處理器來解決。
        (3) 所有數字均以ASCII碼的形式發送。
        (4) 所有參數均以空格作為分隔符, 十六進制為0x20。
        ISP命令的響應
        在執行ISP命令之后,微處理器會發送“0\r\n”之類的字串給PC作為響應。這里的“0”即為執行結果。“0”表示執行結果正確,非“0”表示執行失敗,至于非“0”的具體的含義,參見周立功網站的http://www.zlgmcu.com/philips/arm/about/LPC2000_FLASH.pdf以及《ARM微控制器基礎與實戰》一書。
        ISP讀取器件ID的過程
        這里之所以介紹通過ISP讀取器件ID的過程,是因為通過ISP命令來燒寫程序相對通過ISP讀取器件ID來說復雜很多,而且燒寫程序之前往往包含讀取器件ID部分。
        下面為對ISP2106讀器件ID的完整的過程: OPEN COM bps:9600, StopBits:1, Parity:No, DataBits:8
        WRITE 0x3F
        ?
        READ 0x53 0x79 0x6E 0x63 0x68 0x72 0x6F 0x6E 0x69 0x7A 0x65 0x64 0x0D 0x0A
        Synchronized\r\n
        WRITE 0x53 0x79 0x6E 0x63 0x68 0x72 0x6F 0x6E 0x69 0x7A 0x65 0x64 0x0D 0x0A
        Synchronized\r\n
        READ 0x53 0x79 0x6E 0x63 0x68 0x72 0x6F 0x6E 0x69 0x7A 0x65 0x64 0x0D 0x0A 0x4F 0x4B 0x0D 0x0A
        Synchronized\r\nOK\r\n
        WRITE 0x31 0x32 0x30 0x30 0x30 0x0D 0x0A
        12000\r\n
        READ 0x31 0x32 0x30 0x30 0x30 0x0D 0x0A 0x4F 0x4B 0x0D 0x0A
        12000\r\nOK\r\n
        WRITE 0x55 0x20 0x32 0x33 0x31 0x33 0x30 0x0D 0x0A
        U 23130\r\n
        READ 0x55 0x20 0x32 0x33 0x31 0x33 0x30 0x0D 0x0A 0x30 0x0D 0x0A
        U 23130\r\n0\r\n
        WRITE 0x4A 0x0D 0x0A
        J\r\n
        READ 0x4A 0x0D 0x0A 0x30 0x0D 0x0A
        J\r\n0\r\n
        READ 0x34 0x32 0x39 0x33 0x39 0x38 0x34 0x30 0x35 0x30 0x0D 0x0A
        4293984050
        
        其中WRITE和READ是針對PC而言的。
        UU編碼簡介
        向FLASH中燒寫的程序代碼是通過UU編碼之后傳給微處理器的。
        UU編碼算法將3字節二進制數據轉換成4字節可打印的ASCII字符集。因為Hex格式是將1字節二進制數據轉換成2字節ASCII數據,所以UU編碼的效率高于Hex格式。
        UU編碼的編碼方法如下:
        因為3字節二進制數據共24Bits,把它們按6Bits分成4份,這樣就變成了4個字節,再把新生成的4個字節每個都加上0x20,若這樣處理后的數值為0x20,則用0x60取代。用C語言表示的UU編碼過程如下:
        #define ENCODE_BYTE(b) (((b) == 0) ? 0x60 : ((b) + 0x20))
        outbuf [0] = ENCODE_BYTE ((inbytep [0] 0xFC) >> 2);
        outbuf [1] = ENCODE_BYTE (((inbytep [0] 0x03) 4) +
        ((inbytep [1] 0xF0) >> 4));
        outbuf [2] = ENCODE_BYTE (((inbytep [1] 0x0F) 2) +
        ((inbytep [2] 0xC0) >> 6));
        outbuf [3] = ENCODE_BYTE (inbytep [2] 0x3F);
        若原數據字節數不是3的倍數,則以0x00填充。
        數據通過UU編碼之后,以UU編碼行的形式打包發送。
        UU編碼行的第一個字節表示數據的長度,且為UU編碼。
        UU編碼規定:任何UU編碼行的長度都不應超過61個字節(字符),也就是說,一個UU編碼最多可以包含45字節原始的二進制數據。
        例如,對一個用十六進制表示的數據“18F09FE518F09FE518F09FE518F09FE5”,(注意該數據實際長度為16字節,因為顯示的問題,這里采用HEX表示。)在經過UU編碼之后,數據變為“M/"?Y1CPG^48\)_E/"?Y1CPG^6`7R"Y\/\?Y1CPG^7`````0````$0```!(”。
        LPC2000系列微處理器UU編碼發送規則
        LPC2000系列微處理器規定:
        1.發送器(通常為PC)以UU編碼行的形式發送實際數據,且每個數據包都以 “\r\n”結束,所以在UU編碼行長度為61字節的時候,發送器實際發送的數據長度為63字節(61個字節UU編碼+2字節“\r\n”)。
        2.在發送20個UU編碼行之后,應該發送數據校驗和。
        數據校驗和即為上次校驗和計算之后所有發送的原始數據的和。
        數據校驗和以ASCII碼的方式發送,以 “\r\n”結束。
        接收器在收到校驗和后與它接收的數據的校驗和相比較,如果校驗和匹配,接收器就發送“OK\r\n”,并等待下一次發送。如果校驗和不匹配,接收器就發送“RESEND\r\n”。
        3.在數據發送結束,即使不足20個UU編碼行也仍然應該發送數據校驗和。
        由于FLASH的燒寫通常是以4096字節為單位的,所以在每發送4096字節之后也必須發送一個數據校驗和。(4096字節=91個UU編碼行+1個字節=4×20個UU編碼行+11UU編碼行+1個字節)
        所以實際發送4096字節數據的過程如下:
        WRITE 63BYTES(1)
        WRITE 63BYTES(2)
        WRITE 63BYTES(3)
        ......
        WRITE 63BYTES(18)
        WRITE 63BYTES(19)
        WRITE 63BYTES(20)
        WRITE CHECKSUM(已發送900字節)
        WRITE 63BYTES(21)
        WRITE 63BYTES(22)
        WRITE 63BYTES(23)
        ......
        WRITE 63BYTES(38)
        WRITE 63BYTES(39)
        WRITE 63BYTES(40)
        WRITE CHECKSUM(已發送1800字節)
        WRITE 63BYTES(41)
        WRITE 63BYTES(42)
        WRITE 63BYTES(43)
        ......
        WRITE 63BYTES(58)
        WRITE 63BYTES(59)
        WRITE 63BYTES(60)
        WRITE CHECKSUM(已發送2700字節)
        WRITE 63BYTES(61)
        WRITE 63BYTES(62)
        WRITE 63BYTES(63)
        ......
        WRITE 63BYTES(78)
        WRITE 63BYTES(79)
        WRITE 63BYTES(80)
        WRITE CHECKSUM(已發送3600字節)
        WRITE 63BYTES(81)
        WRITE 63BYTES(82)
        WRITE 63BYTES(83)
        WRITE 63BYTES(84)
        WRITE 63BYTES(85)
        WRITE 63BYTES(86)
        WRITE 63BYTES(87)
        WRITE 63BYTES(88)
        WRITE 63BYTES(89)
        WRITE 63BYTES(90)
        WRITE 63BYTES(91)
        WRITE 7 BYTES
        WRITE CHECKSUM(已發送4096字節)
        注意上面只包含的PC向微處理器寫數據的情況,實際上若沒關閉“回聲”,微處理器會將上面所有數據回發一次,另外還有校驗和響應等。
        LPC2000系列微處理器ISP編程完整過程
        WRITE ?
        READSynchronized\r\n
        WRITE Synchronized\r\n
        READSynchronized\r\n
        READOK\r\n
        WRITE 12000\r\n
        READ12000\r\n
        READOK\r\n
        WRITE U 23130\r\n
        READU 23130\r\n
        READ0\r\n
        WRITE P 0 1\r\n
        READP 0 1\r\n
        READ0\r\n
        WRITE E 0 1\r\n
        READE 0 1\r\n
        READ0\r\n
        WRITE W 1073742336 4096\r\n
        READW 1073742336 4096\r\n
        READ0\r\n
        
        發送4096字節UU編碼后的數據
        WRITE P 0 0\r\n
        READP 0 0\r\n
        READ0\r\n
        WRITE C 0 1073742336 4096\r\n
        READC 0 1073742336 4096\r\n
        READ0\r\n
        
        發送4096字節UU編碼后的數據
        WRITE P 0 0\r\n
        READP 0 0\r\n
        READ0\r\n
        WRITE C 4096 1073742336 4096\r\n
        READC 4096 1073742336 4096\r\n
        READ0\r\n
        
        發送4096字節UU編碼后的數據
        WRITE P 1 1\r\n
        READP 1 1\r\n
        READ0\r\n
        WRITE C 8192 1073742336 4096\r\n
        READC 8192 1073742336 4096\r\n
        READ0\r\n
        發送92字節UU編碼后的數據
        WRITE P 1 1\r\n
        READP 1 1\r\n
        READ0\r\n
        WRITE C 12288 1073742336 4096\r\n
        READC 12288 1073742336 4096\r\n
        READ0\r\n
        實際程序長度12,380字節

        程序下載:
        LPC21XXISP.rarhttp://www.dragon-2008.com/download/ArmDsp/LPC21XXISP.rar
        參考資料:
        1.LPC210X Datasheet
        2.LPC2000系列ARM Flash存儲器系統和編程
        http://www.zlgmcu.com/philips/arm/about/LPC2000_FLASH.pdf
        3.《ARM微控制器基礎與實戰》
        相關連接:
        1.Intel HEX文件格式http://www.dragon-2008.com/ArmDsp/ARTICLE/INTEL-HEX.htm
        2.UU編碼簡介http://www.dragon-2008.com/ArmDsp/ARTICLE/UUCODE.htm
        (綜合電子論壇)
        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 九江县| 重庆市| 兴隆县| 邓州市| 当阳市| 策勒县| 湟中县| 浦江县| 全州县| 康乐县| 临夏市| 松原市| 岚皋县| 手机| 唐海县| 嘉祥县| 台州市| 葫芦岛市| 虎林市| 峨山| 北宁市| 万安县| 长汀县| 丰原市| 犍为县| 云浮市| 太康县| 松桃| 武鸣县| 磐石市| 洪江市| 五寨县| 台前县| 金塔县| 鄂尔多斯市| 桃江县| 乃东县| 吉木萨尔县| 瑞昌市| 衡山县| 马山县|