<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > LPC21XX系列ARM微處理器ISP升級(jí)程序設(shè)計(jì)

          LPC21XX系列ARM微處理器ISP升級(jí)程序設(shè)計(jì)

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


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

          1. ISP模式的進(jìn)入
          復(fù)位時(shí)P0.14的3ms以上持續(xù)的低電平是LPC2000系列微處理器進(jìn)入ISP功能模式的必要條件。PC的串口應(yīng)設(shè)定為8個(gè)數(shù)據(jù)位、1個(gè)停止位和無(wú)奇偶校驗(yàn),波特率建議設(shè)置為9600bps,由于受ISP處理速度的影響,過(guò)高的波特率并不見(jiàn)得會(huì)提高ISP處理速度,反而容易導(dǎo)致ISP處理沒(méi)有響應(yīng)。
          2. 自動(dòng)波特率檢測(cè)
          LPC2000系列微處理器在進(jìn)入ISP模式之后,會(huì)自動(dòng)進(jìn)行“自動(dòng)波特率檢測(cè)”,因?yàn)槲⑻幚砥鞑⒉磺宄约核B接的晶振頻率和PC程序所設(shè)置的串口波特率。在“自動(dòng)波特率檢測(cè)”通過(guò)之后,微處理器就進(jìn)入處理PC程序所發(fā)送的ISP命令的狀態(tài)。
          自動(dòng)波特率檢測(cè)的流程如下圖所示:

          PC機(jī)先發(fā)送一個(gè)同步字“?”,若微處理器因?yàn)樵趶?fù)位時(shí)檢測(cè)到P0.14為低電平而進(jìn)入了ISP模式,則微處理器會(huì)發(fā)送“Synchronized\r\n”給PC,PC在接收到“Synchronized\r\n”之后,回發(fā)“Synchronized\r\n”給微處理器,微處理器在收到“Synchronized\r\n”之后,發(fā)送“Synchronized\r\nOK\r\n”給PC,PC在收到“Synchronized\r\nOK\r\n”之后,以ASCII碼的形式發(fā)送晶振頻率(kHz)給微處理器。例如晶振頻率為12MHz,則PC發(fā)送給微處理器的字串為“12000\r\n”。微處理器在接收到晶振頻率之后會(huì)發(fā)送“OK\r\n”給PC作為響應(yīng)。
          注意事項(xiàng):
          (1) 處理器與PC的數(shù)據(jù)交換過(guò)程中,所有數(shù)據(jù)均以“\r\n”作為結(jié)尾,十六進(jìn)制為0x0D,0x0A。
          (2) 任何發(fā)送或接收出錯(cuò)之后,只能通過(guò)PC軟件提示“操作失敗”,并要求用戶(hù)重啟(復(fù)位/開(kāi)關(guān)電源)微處理器來(lái)解決。
          (3) 所有數(shù)字均以ASCII碼的形式發(fā)送。
          3.ISP命令處理
          在自動(dòng)波特率檢測(cè)之后,PC就可以通過(guò)串口發(fā)送ISP命令和數(shù)據(jù)給微處理器了。
          ISP命令簡(jiǎn)介
          LPC2000系列微處理器支持的ISP命令如下表所示,更詳細(xì)的介紹參見(jiàn)周立功網(wǎng)站的http://www.zlgmcu.com/philips/arm/about/LPC2000_FLASH.pdf以及《ARM微控制器基礎(chǔ)與實(shí)戰(zhàn)》一書(shū)。
          ISP命令簡(jiǎn)單匯總
          ISP命令 功能
          U 23130 解鎖。在對(duì) FLASH編程、擦除運(yùn)行之前必須執(zhí)行該命令。
          B 波特率>停止位>設(shè)置波特率。
          A 1/0>回聲開(kāi)關(guān)??刂莆⑻幚砥魇欠駥⒔邮盏降臄?shù)據(jù)回發(fā)給 PC。
          W RAM地址>長(zhǎng)度>PC寫(xiě)數(shù)據(jù)到微處理器RAM。數(shù)據(jù)格式為UU碼。
          R RAM地址>長(zhǎng)度>PC從微處理器RAM讀數(shù)據(jù)。數(shù)據(jù)格式為UU碼。
          P 起始扇區(qū)>結(jié)束扇區(qū)>選定即將操作的扇區(qū)范圍。
          C FLASH地址>RAM地址>字節(jié)數(shù)>命令微處理器將 RAM中的數(shù)據(jù)燒寫(xiě)到FLASH中。
          G 地址>模式>執(zhí)行 FLASH或RAM中的代碼。
          E 起始扇區(qū)>結(jié)束扇區(qū)>擦除選定的扇區(qū)。
          I(yíng) 起始扇區(qū)>結(jié)束扇區(qū)>檢查指定的扇區(qū)是否為空。
          J讀器件 ID。
          K讀 BOOT代碼版本號(hào)。
          M 地址1>地址2>字節(jié)數(shù)>比較 FLASH和/或RAM中的數(shù)據(jù)。
          注意事項(xiàng):
          (1) 處理器與PC的數(shù)據(jù)交換過(guò)程中,所有數(shù)據(jù)均以“\r\n”作為結(jié)尾,十六進(jìn)制為0x0D,0x0A。
          (2) 任何發(fā)送或接收出錯(cuò)之后,只能通過(guò)PC軟件提示“操作失敗”,并要求用戶(hù)重啟(復(fù)位/開(kāi)關(guān)電源)微處理器來(lái)解決。
          (3) 所有數(shù)字均以ASCII碼的形式發(fā)送。
          (4) 所有參數(shù)均以空格作為分隔符, 十六進(jìn)制為0x20。
          ISP命令的響應(yīng)
          在執(zhí)行ISP命令之后,微處理器會(huì)發(fā)送“0\r\n”之類(lèi)的字串給PC作為響應(yīng)。這里的“0”即為執(zhí)行結(jié)果?!?”表示執(zhí)行結(jié)果正確,非“0”表示執(zhí)行失敗,至于非“0”的具體的含義,參見(jiàn)周立功網(wǎng)站的http://www.zlgmcu.com/philips/arm/about/LPC2000_FLASH.pdf以及《ARM微控制器基礎(chǔ)與實(shí)戰(zhàn)》一書(shū)。
          ISP讀取器件ID的過(guò)程
          這里之所以介紹通過(guò)ISP讀取器件ID的過(guò)程,是因?yàn)橥ㄟ^(guò)ISP命令來(lái)燒寫(xiě)程序相對(duì)通過(guò)ISP讀取器件ID來(lái)說(shuō)復(fù)雜很多,而且燒寫(xiě)程序之前往往包含讀取器件ID部分。
          下面為對(duì)ISP2106讀器件ID的完整的過(guò)程: 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是針對(duì)PC而言的。
          UU編碼簡(jiǎn)介
          向FLASH中燒寫(xiě)的程序代碼是通過(guò)UU編碼之后傳給微處理器的。
          UU編碼算法將3字節(jié)二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成4字節(jié)可打印的ASCII字符集。因?yàn)镠ex格式是將1字節(jié)二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成2字節(jié)ASCII數(shù)據(jù),所以UU編碼的效率高于Hex格式。
          UU編碼的編碼方法如下:
          因?yàn)?字節(jié)二進(jìn)制數(shù)據(jù)共24Bits,把它們按6Bits分成4份,這樣就變成了4個(gè)字節(jié),再把新生成的4個(gè)字節(jié)每個(gè)都加上0x20,若這樣處理后的數(shù)值為0x20,則用0x60取代。用C語(yǔ)言表示的UU編碼過(guò)程如下:
          #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);
          若原數(shù)據(jù)字節(jié)數(shù)不是3的倍數(shù),則以0x00填充。
          數(shù)據(jù)通過(guò)UU編碼之后,以UU編碼行的形式打包發(fā)送。
          UU編碼行的第一個(gè)字節(jié)表示數(shù)據(jù)的長(zhǎng)度,且為UU編碼。
          UU編碼規(guī)定:任何UU編碼行的長(zhǎng)度都不應(yīng)超過(guò)61個(gè)字節(jié)(字符),也就是說(shuō),一個(gè)UU編碼最多可以包含45字節(jié)原始的二進(jìn)制數(shù)據(jù)。
          例如,對(duì)一個(gè)用十六進(jìn)制表示的數(shù)據(jù)“18F09FE518F09FE518F09FE518F09FE5”,(注意該數(shù)據(jù)實(shí)際長(zhǎng)度為16字節(jié),因?yàn)轱@示的問(wèn)題,這里采用HEX表示。)在經(jīng)過(guò)UU編碼之后,數(shù)據(jù)變?yōu)椤癕/"?Y1CPG^48\)_E/"?Y1CPG^6`7R"Y\/\?Y1CPG^7`````0````$0```!(”。
          LPC2000系列微處理器UU編碼發(fā)送規(guī)則
          LPC2000系列微處理器規(guī)定:
          1.發(fā)送器(通常為PC)以UU編碼行的形式發(fā)送實(shí)際數(shù)據(jù),且每個(gè)數(shù)據(jù)包都以 “\r\n”結(jié)束,所以在UU編碼行長(zhǎng)度為61字節(jié)的時(shí)候,發(fā)送器實(shí)際發(fā)送的數(shù)據(jù)長(zhǎng)度為63字節(jié)(61個(gè)字節(jié)UU編碼+2字節(jié)“\r\n”)。
          2.在發(fā)送20個(gè)UU編碼行之后,應(yīng)該發(fā)送數(shù)據(jù)校驗(yàn)和。
          數(shù)據(jù)校驗(yàn)和即為上次校驗(yàn)和計(jì)算之后所有發(fā)送的原始數(shù)據(jù)的和。
          數(shù)據(jù)校驗(yàn)和以ASCII碼的方式發(fā)送,以 “\r\n”結(jié)束。
          接收器在收到校驗(yàn)和后與它接收的數(shù)據(jù)的校驗(yàn)和相比較,如果校驗(yàn)和匹配,接收器就發(fā)送“OK\r\n”,并等待下一次發(fā)送。如果校驗(yàn)和不匹配,接收器就發(fā)送“RESEND\r\n”。
          3.在數(shù)據(jù)發(fā)送結(jié)束,即使不足20個(gè)UU編碼行也仍然應(yīng)該發(fā)送數(shù)據(jù)校驗(yàn)和。
          由于FLASH的燒寫(xiě)通常是以4096字節(jié)為單位的,所以在每發(fā)送4096字節(jié)之后也必須發(fā)送一個(gè)數(shù)據(jù)校驗(yàn)和。(4096字節(jié)=91個(gè)UU編碼行+1個(gè)字節(jié)=4×20個(gè)UU編碼行+11UU編碼行+1個(gè)字節(jié))
          所以實(shí)際發(fā)送4096字節(jié)數(shù)據(jù)的過(guò)程如下:
          WRITE 63BYTES(1)
          WRITE 63BYTES(2)
          WRITE 63BYTES(3)
          ......
          WRITE 63BYTES(18)
          WRITE 63BYTES(19)
          WRITE 63BYTES(20)
          WRITE CHECKSUM(已發(fā)送900字節(jié))
          WRITE 63BYTES(21)
          WRITE 63BYTES(22)
          WRITE 63BYTES(23)
          ......
          WRITE 63BYTES(38)
          WRITE 63BYTES(39)
          WRITE 63BYTES(40)
          WRITE CHECKSUM(已發(fā)送1800字節(jié))
          WRITE 63BYTES(41)
          WRITE 63BYTES(42)
          WRITE 63BYTES(43)
          ......
          WRITE 63BYTES(58)
          WRITE 63BYTES(59)
          WRITE 63BYTES(60)
          WRITE CHECKSUM(已發(fā)送2700字節(jié))
          WRITE 63BYTES(61)
          WRITE 63BYTES(62)
          WRITE 63BYTES(63)
          ......
          WRITE 63BYTES(78)
          WRITE 63BYTES(79)
          WRITE 63BYTES(80)
          WRITE CHECKSUM(已發(fā)送3600字節(jié))
          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(已發(fā)送4096字節(jié))
          注意上面只包含的PC向微處理器寫(xiě)數(shù)據(jù)的情況,實(shí)際上若沒(méi)關(guān)閉“回聲”,微處理器會(huì)將上面所有數(shù)據(jù)回發(fā)一次,另外還有校驗(yàn)和響應(yīng)等。
          LPC2000系列微處理器ISP編程完整過(guò)程
          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
          
          發(fā)送4096字節(jié)UU編碼后的數(shù)據(jù)
          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
          
          發(fā)送4096字節(jié)UU編碼后的數(shù)據(jù)
          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
          
          發(fā)送4096字節(jié)UU編碼后的數(shù)據(jù)
          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
          發(fā)送92字節(jié)UU編碼后的數(shù)據(jù)
          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
          實(shí)際程序長(zhǎng)度12,380字節(jié)

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


          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();