引言 目前市場(chǎng)上影響力較大的針對S12的集成開(kāi)發(fā)環(huán)境CodeWarrior HCS12,功能完善、性能穩定,但是價(jià)格昂貴,不利于嵌入式領(lǐng)域的教學(xué)和開(kāi)發(fā)。在國內由清華大學(xué)開(kāi)發(fā)的 S12BDM調試頭,目前可支持的目標CPU外部晶振頻率不高于19 MHz,它的軟件部分由飛思卡爾半導體公司提供。蘇州大學(xué)2005年研制了針對S12系列MCU的編程調試器,采用MC68HC908JB8(以下簡(jiǎn)稱(chēng) JB8)作為編程調試器芯片;但是隨著(zhù)芯片制造技術(shù)的更新,S12系列MCU的品種越來(lái)越多,性能越來(lái)越好,典型的S12系列MCU總線(xiàn)頻率為25 MHz,而JB8的總線(xiàn)頻率只有3 MHz,可適用目標芯片的型號有限,且JB8只有256字節的RAM空間,可用于接收數據的緩存太小,影響通信速度。因此更加迫切地需要一款功能更加強大并且具有通用性的編程調試器來(lái)滿(mǎn)足S12系列MCU的需求。 本文在分析了S12系列MCU編程調試器MC68HC908JB8的基礎上,設計了基于MC9S08JM60(以下簡(jiǎn)稱(chēng)JM60)的新型編程調式器,主要解決JB8在通信速率上存在的不足和在通用性方面存在的問(wèn)題。 1 總體概述 本文所說(shuō)的編程系統包括編程調試器和PC方的通信,以及編程調試器和目標芯片的通信。圖1是編程系統的基本架構。在編程系統中,JM60通過(guò) USB2.O和PC方進(jìn)行交互,接收來(lái)自PC方的命令并執行相應的操作,然后通過(guò)BDM接口將命令和數據發(fā)送到目標芯片,完成對目標芯片的操作。 ![]() BDM是飛思卡爾半導體公司推出的一種單線(xiàn)調試方式。圖2是BDM接口引腳圖,所有命令和參數均通過(guò)BKGD專(zhuān)用引腳進(jìn)行傳輸,不占用其他任何資源;而且 BDM子模塊獨立于CPU,有獨立的狀態(tài)機來(lái)處理單線(xiàn)接口。與通常的開(kāi)發(fā)手段相比,BDM子模塊能利用CPU的空閑周期與CPU打交道,不需要停止處理器即可訪(fǎng)問(wèn)存儲器資源。 ![]() 本編程系統中,作為編程調試器芯片的JM60所擁有的USB2.O全速設備較之串口和USBl.1,它和PC方通信速率非?。JM60可達 24 MHz的總線(xiàn)頻率以及充足的RAM空間使得通信流程可以得到進(jìn)一步改進(jìn);同時(shí),JM60的高總線(xiàn)頻率也解決了以往采用JB8作為編程調試器芯片但由于 JB8自身總線(xiàn)頻率低而限制目標芯片通信頻率的瓶頸,使得編程系統的通用性得到提高。 2 通信系統的改進(jìn) 2.1 通信流程的改進(jìn) 編程系統的通信由PC機、編程調試器和目標芯片的交互來(lái)完成,因而編程系統通信流程的高效與否直接影響著(zhù)整個(gè)編程系統的通信速率。編程系統的通信過(guò)程如下: ①PC發(fā)送進(jìn)入BDM命令,目標芯片進(jìn)入BDM模式; ②PC發(fā)送完全擦除命令,擦除目標芯片Flash并進(jìn)行空白校驗,返回校驗碼; ③PC發(fā)送命令將寫(xiě)入子程序的目標代碼發(fā)送到目標芯片內存中,寫(xiě)入子程序的功能是將存放在目標芯片內存上的用戶(hù)目標代碼寫(xiě)入Flash中; ④PC分析S19文件,提取需要發(fā)送的目標代碼,以512字節組合成一頁(yè),分頁(yè)發(fā)送到目標芯片內存中,然后運行已發(fā)送目標芯片中的寫(xiě)入子程序,將用戶(hù)目標代碼寫(xiě)入目標芯片Flash中; ⑤PC判斷是否需要發(fā)送下一頁(yè),并接收校驗碼判斷一頁(yè)數據發(fā)送是否正確。 PC發(fā)送一頁(yè)數據到目標芯片內存之前,先將數據發(fā)送到編程調試器內存,和一次向S12系列芯片Flash寫(xiě)入512字節相比較。JB8的RAM 只有有限的 256字節,并且堆棧也在RAM區域,可用于接收一頁(yè)數據的RAM緩存太小,因而每次寫(xiě)入的數據量就會(huì )受到限制,要分多次寫(xiě)入。這就增加了PC和編程調試器之間的通信次數以及編程調試器和目標芯片的通信次數,從而影響了編程的速度。圖3中,JB8以串行的方式接收和發(fā)送數據,先從PC方接收一頁(yè)128字節用戶(hù)目標代碼(1,3,5,7過(guò)程),然后將數據發(fā)送到目標芯片內存(2,4,6,8過(guò)程)。經(jīng)過(guò)4次的接收之后,目標芯片將RAM空間的512字節數據一次寫(xiě)入Flash空間,返回校驗碼。 ![]() 而JM60作為編程調試器則擁有4 KB的RAM,可以直接開(kāi)辟512字節作為緩沖。在整個(gè)編程系統通信流程的設計上,就可以借鑒指令流水線(xiàn)操作的思想,充分考慮可作預取的操作,利用編程調試器和目標芯片之間通信的時(shí)間完成PC方單獨的操作,以及利用目標芯片自身進(jìn)行操作的時(shí)間來(lái)完成PC方和編程調試器之間的操作,提高編程系統的運行速率,盡量減少空等待操作。 ![]() 在圖4所示的以JM60作為編程調試器的編程系統通信流程中,首先PC發(fā)送第1頁(yè)用戶(hù)目標代碼到JM60內存(過(guò)程1),然后發(fā)送到目標芯片內存(過(guò)程 2),目標芯片執行寫(xiě)入子程序將數據寫(xiě)入Flash。寫(xiě)入子程序執行過(guò)程中,字寫(xiě)入命令時(shí)間t=9×(1÷fNMVOP)+25×(1÷fbus)。 fNMVOP指Flash操作頻率,fbus指總線(xiàn)頻率。S12系列芯片Flash的操作頻率范圍限制在150~200 kHz,取fNMVOP=200 kHz,fbus=40 MHz,計算得1個(gè)字寫(xiě)入時(shí)間在最小情況下為t=0.045 625 ms,寫(xiě)入512字節需要時(shí)間為11.68 ms,而PC發(fā)送1頁(yè)數據的時(shí)間為512×8÷12Mbps=0.341 ms。因此PC和JM60可以利用目標芯片寫(xiě)入1頁(yè)數據的時(shí)間進(jìn)行交互,將下一頁(yè)數據提前發(fā)送到JM60,完成從PC→JM60內存,如圖5所示。 JM60和目標芯片也可以在PC對前一頁(yè)數據進(jìn)行校驗的同時(shí),將1頁(yè)數據從JM60發(fā)送到目標芯片,如圖6所示。 ![]() 在實(shí)現以上思想的同時(shí)也充分考慮了寫(xiě)入過(guò)程出錯的情況,如圖4在JM60內存區域開(kāi)辟了可存放2頁(yè)數據的緩沖區用于接收用戶(hù)目標代碼。若前一頁(yè)數據寫(xiě)入錯誤,則將這頁(yè)數據在Flash的塊寫(xiě)入首地址傳遞給塊擦除程序,重新進(jìn)行擦除,等待當前頁(yè)發(fā)送完畢,作為下一頁(yè)數據參與整個(gè)流程進(jìn)行寫(xiě)入。 2.2 通信子程序的改進(jìn) 2.2.1 優(yōu)化通信子程序代碼 通信流程的改進(jìn)提高了整個(gè)編程系統的通信速率。進(jìn)一步分析編程系統,從JM60發(fā)送數據到目標芯片,內存需要的時(shí)間在整個(gè)程序下載過(guò)程中占用比例比較大;而在1位發(fā)送過(guò)程中,如圖7所示,從位開(kāi)始時(shí)刻到目標芯片讀取時(shí)刻的周期間隔是固定的10~13個(gè)目標周期,但位與位之間的發(fā)送存在時(shí)隙。 在原有編程系統的字節發(fā)送代碼中,發(fā)送位1和位0是兩個(gè)單獨的子程序,需要通過(guò)判斷來(lái)分別調用兩個(gè)子程序。所使用的BCC、JSR、BRA都是周期較長(cháng)的指令,且每發(fā)送1位就調用1次JSR指令,就有一次RTS指令返回,需要周期較多。在改進(jìn)編程系統的字節發(fā)送代碼中,將位1和位0的發(fā)送代碼很好地結合在 1個(gè)子程序之內,縮短了位與位之間發(fā)送的時(shí)隙。 編程系統通過(guò)BDM硬件命令WRITE_WORD發(fā)送1個(gè)字,需要調用5次字節發(fā)送程序。發(fā)送的5字節分別是1字節的命令操作碼、2字節的內存地址、2字節的數據,同時(shí)硬件命令WRTE_WORD的完成還需要延遲150個(gè)編程調試器時(shí)鐘周期。所以假如從編程調試器發(fā)送100 KB的數據到目標芯片內存,其所需要花費的時(shí)間計算如下: 在JB8的編程系統中,發(fā)送1個(gè)字節的周期為:2+(1+3+5+4+4+4+3+3+4+7)×8+4=310,100 KB的數據需要(100×1024÷2)個(gè)字×(5×310+150)個(gè)周期÷(3×106)=29.01 s。 在改進(jìn)的編程系統中,發(fā)送1個(gè)字節的周期為:2+2+4+3+1+1+2+4+(1+3+6+88)×8+2+4=809,100 KB的數據需要(100×1024÷2)個(gè)字×(5×809+150)個(gè)周期÷(24×105)=8.95 s。 而JM60緩存中的數據是以連續存放的形式寫(xiě)入目標芯片內存的,因此可以選用BDM固件命令WRITE_NEXT,每次執行命令時(shí)寄存器X的值會(huì )先自動(dòng)加 2,然后將1個(gè)字寫(xiě)入到X所指向的地址。所以只需要在寫(xiě)入開(kāi)始時(shí),對寄存器X進(jìn)行一次地址賦值操作,將目標芯片內存地址減2處的地址值賦給X即可,后續數據可以直接調用WRITE_NEXT命令寫(xiě)入,不需要再發(fā)送地址信息。采用WRITE_NEXT寫(xiě)1個(gè)字需要發(fā)送3個(gè)字節(1個(gè)字節的命令操作碼、2個(gè)字節的數據),它的完成需要延遲32個(gè)編程調試器時(shí)鐘周期。因而從編程調試器發(fā)送100 KB的數據到目標芯片內存需要花費的時(shí)間計算如下: (100×1024÷2)個(gè)字×(3×809+32)個(gè)周期÷(24×106)=5.25 s 改進(jìn)后的編程系統在編程調試器內存與目標芯片內存的數據通信速度上提高了5.5倍,大大提高了編程調試器的工作效率。 2.2.2 編寫(xiě)目標芯片接收程序 優(yōu)化通信子程序代碼之后,從編程調試器內存向目標芯片內存發(fā)送數據的時(shí)間大大減少,但是使用BDM命令,除了發(fā)送2個(gè)字節的用戶(hù)數據之外,還需要發(fā)送額外的字節,并且命令的完成都需要較長(cháng)的延遲時(shí)間。由于BDM采用單線(xiàn)引腳串行通信,因此可以自己編寫(xiě)一段模擬BDM串行通信的程序,目標芯片只從編程調試器接收用戶(hù)目標代碼,提高通信速度。 另外將JM60的引腳PTBD.O與目標芯片PTA.0引腳相連來(lái)傳送數據,以便數據通信過(guò)程不影響B(tài)KGD引腳。過(guò)程如下: ①按照編程調試器發(fā)送1位時(shí)序,在編程調試器方編寫(xiě)以PTBD.0為發(fā)送引腳的字節發(fā)送代碼; ②按照目標芯片接收1位的過(guò)程,編寫(xiě)目標芯片以PTA.0為接收引腳的字節接收代碼,進(jìn)而編寫(xiě)好目標芯片接收程序; ③將自定義的目標芯片接收程序編譯成目標代碼,通過(guò)基本的BDM命令發(fā)送到目標芯片內存; ④執行目標芯片中自定義的接收程序,將接收到的字節寫(xiě)入目標芯片指定的內存空間。 由于目標芯片的接收程序是自己定義的,因此編程調試器不需要發(fā)送操作碼與地址信息,也無(wú)需等待命令完成延遲時(shí)間。自定義的目標芯片接收程序代碼量少于50字節,這部分時(shí)間很短。因而假如從編程調試器發(fā)送100KB的數據到目標芯片內存,需要花費的時(shí)間計算如下: (100×1024)個(gè)字節×809個(gè)周期÷(24×106)=3.45 s 使用自定義目標芯片接收程序,在原有系統編程調試器內存與目標芯片內存的數據通信速度上提高了8倍多。 3 編程系統的通用性設計 編程系統的通用性在于兩點(diǎn):一是可以根據不同型號的目標芯片獲取相應的MCU參數進(jìn)行操作;二是可以根據不同型號MCU的總線(xiàn)頻率調用相應的發(fā)送接收代碼。 3.1 MCU信息的存儲 S12系列MCU有很多型號,而且未來(lái)還會(huì )推出更多新型號。表1給出了數據庫中MCU的信息。不同型號MCU屬性參數不同,包括內部RAM及 Flash的大小和起始地址。這些參數在對目標芯片進(jìn)行擦除、寫(xiě)入及調試操作時(shí)極為重要。為了便于通用性方面的設計,在PC方數據庫中保存了每款MCU的相關(guān)信息,在用戶(hù)建立工程的時(shí)候就可以獲取這些字段信息,對目標芯片進(jìn)行正確的操作。 ![]() 2.2 通信子程序的改進(jìn) 2.2.1 優(yōu)化通信子程序代碼 通信流程的改進(jìn)提高了整個(gè)編程系統的通信速率。進(jìn)一步分析編程系統,從JM60發(fā)送數據到目標芯片,內存需要的時(shí)間在整個(gè)程序下載過(guò)程中占用比例比較大;而在1位發(fā)送過(guò)程中,如圖7所示,從位開(kāi)始時(shí)刻到目標芯片讀取時(shí)刻的周期間隔是固定的10~13個(gè)目標周期,但位與位之間的發(fā)送存在時(shí)隙。 在原有編程系統的字節發(fā)送代碼中,發(fā)送位1和位0是兩個(gè)單獨的子程序,需要通過(guò)判斷來(lái)分別調用兩個(gè)子程序。所使用的BCC、JSR、BRA都是周期較長(cháng)的指令,且每發(fā)送1位就調用1次JSR指令,就有一次RTS指令返回,需要周期較多。在改進(jìn)編程系統的字節發(fā)送代碼中,將位1和位0的發(fā)送代碼很好地結合在 1個(gè)子程序之內,縮短了位與位之間發(fā)送的時(shí)隙。 編程系統通過(guò)BDM硬件命令WRITE_WORD發(fā)送1個(gè)字,需要調用5次字節發(fā)送程序。發(fā)送的5字節分別是1字節的命令操作碼、2字節的內存地址、2字節的數據,同時(shí)硬件命令WRTE_WORD的完成還需要延遲150個(gè)編程調試器時(shí)鐘周期。所以假如從編程調試器發(fā)送100 KB的數據到目標芯片內存,其所需要花費的時(shí)間計算如下: 在JB8的編程系統中,發(fā)送1個(gè)字節的周期為:2+(1+3+5+4+4+4+3+3+4+7)×8+4=310,100 KB的數據需要(100×1024÷2)個(gè)字×(5×310+150)個(gè)周期÷(3×106)=29.01 s。 在改進(jìn)的編程系統中,發(fā)送1個(gè)字節的周期為:2+2+4+3+1+1+2+4+(1+3+6+88)×8+2+4=809,100 KB的數據需要(100×1024÷2)個(gè)字×(5×809+150)個(gè)周期÷(24×105)=8.95 s。 而JM60緩存中的數據是以連續存放的形式寫(xiě)入目標芯片內存的,因此可以選用BDM固件命令WRITE_NEXT,每次執行命令時(shí)寄存器X的值會(huì )先自動(dòng)加 2,然后將1個(gè)字寫(xiě)入到X所指向的地址。所以只需要在寫(xiě)入開(kāi)始時(shí),對寄存器X進(jìn)行一次地址賦值操作,將目標芯片內存地址減2處的地址值賦給X即可,后續數據可以直接調用WRITE_NEXT命令寫(xiě)入,不需要再發(fā)送地址信息。采用WRITE_NEXT寫(xiě)1個(gè)字需要發(fā)送3個(gè)字節(1個(gè)字節的命令操作碼、2個(gè)字節的數據),它的完成需要延遲32個(gè)編程調試器時(shí)鐘周期。因而從編程調試器發(fā)送100 KB的數據到目標芯片內存需要花費的時(shí)間計算如下: (100×1024÷2)個(gè)字×(3×809+32)個(gè)周期÷(24×106)=5.25 s 改進(jìn)后的編程系統在編程調試器內存與目標芯片內存的數據通信速度上提高了5.5倍,大大提高了編程調試器的工作效率。 2.2.2 編寫(xiě)目標芯片接收程序 優(yōu)化通信子程序代碼之后,從編程調試器內存向目標芯片內存發(fā)送數據的時(shí)間大大減少,但是使用BDM命令,除了發(fā)送2個(gè)字節的用戶(hù)數據之外,還需要發(fā)送額外的字節,并且命令的完成都需要較長(cháng)的延遲時(shí)間。由于BDM采用單線(xiàn)引腳串行通信,因此可以自己編寫(xiě)一段模擬BDM串行通信的程序,目標芯片只從編程調試器接收用戶(hù)目標代碼,提高通信速度。 另外將JM60的引腳PTBD.O與目標芯片PTA.0引腳相連來(lái)傳送數據,以便數據通信過(guò)程不影響B(tài)KGD引腳。過(guò)程如下: ①按照編程調試器發(fā)送1位時(shí)序,在編程調試器方編寫(xiě)以PTBD.0為發(fā)送引腳的字節發(fā)送代碼; ②按照目標芯片接收1位的過(guò)程,編寫(xiě)目標芯片以PTA.0為接收引腳的字節接收代碼,進(jìn)而編寫(xiě)好目標芯片接收程序; ③將自定義的目標芯片接收程序編譯成目標代碼,通過(guò)基本的BDM命令發(fā)送到目標芯片內存; ④執行目標芯片中自定義的接收程序,將接收到的字節寫(xiě)入目標芯片指定的內存空間。 由于目標芯片的接收程序是自己定義的,因此編程調試器不需要發(fā)送操作碼與地址信息,也無(wú)需等待命令完成延遲時(shí)間。自定義的目標芯片接收程序代碼量少于50字節,這部分時(shí)間很短。因而假如從編程調試器發(fā)送100KB的數據到目標芯片內存,需要花費的時(shí)間計算如下: (100×1024)個(gè)字節×809個(gè)周期÷(24×106)=3.45 s 使用自定義目標芯片接收程序,在原有系統編程調試器內存與目標芯片內存的數據通信速度上提高了8倍多。 3 編程系統的通用性設計 編程系統的通用性在于兩點(diǎn):一是可以根據不同型號的目標芯片獲取相應的MCU參數進(jìn)行操作;二是可以根據不同型號MCU的總線(xiàn)頻率調用相應的發(fā)送接收代碼。 3.1 MCU信息的存儲 S12系列MCU有很多型號,而且未來(lái)還會(huì )推出更多新型號。表1給出了數據庫中MCU的信息。不同型號MCU屬性參數不同,包括內部RAM及 Flash的大小和起始地址。這些參數在對目標芯片進(jìn)行擦除、寫(xiě)入及調試操作時(shí)極為重要。為了便于通用性方面的設計,在PC方數據庫中保存了每款MCU的相關(guān)信息,在用戶(hù)建立工程的時(shí)候就可以獲取這些字段信息,對目標芯片進(jìn)行正確的操作。 3.2 目標芯片總線(xiàn)頻率的測定 不同型號的MCU總線(xiàn)頻率不一樣,因此編程系統的通用性還在于能使編程調試器自動(dòng)獲取目標MCU的通信頻率,使之適應不同型號的MCU。 在HCS12中有一條比較特殊的BDM指令SYNC,它用于探測目標MCU的BDM接口的通信頻率。該指令沒(méi)有具體的操作碼,因此不要求知道具體的目標芯片BDM通信頻率。表2給出了使用SYNC指令探測目標芯片BDM通信頻率的過(guò)程。 編程調試器是通過(guò)拉低至少128個(gè)目標芯片時(shí)鐘周期來(lái)請求SYNC指令的,為了能夠測量所有的S12系列芯片BDM通信頻率,需要設置一個(gè)缺省計時(shí)參數。當目標芯片總線(xiàn)頻率低于1 MHz的時(shí)候,Flash的擦除寫(xiě)入操作不能正常運行,因此可以設置目標芯片的最低BDM接口頻率為1 MHz。128個(gè)周期時(shí)長(cháng)為128÷1 MHz=128μs。在這個(gè)延時(shí)時(shí)間內,可以向S12系列芯片成功請求SYNC指令。下面給出了測試目標芯片通信頻率的代碼。 ![]() 陰影部分是JM60在目標芯片發(fā)送128個(gè)周期低電平的時(shí)間所做的操作,花費的指令周期為count=5+1+6×A(寄存器A的計數次數),目標芯片的通信頻率就可以通過(guò)公式fBDM=128×fbus÷count計算得到。編程調試器只需要根據計算得到的目標芯片的通信頻率,調用在編程調試器方編寫(xiě)的針對不同通信頻率段的收發(fā)子程序,就可以實(shí)現和不同型號目標芯片的正確通信。 結語(yǔ) 編程系統的通信速率和通用性是衡量編程調試器性能的重要指標。在實(shí)際應用中,用戶(hù)需要不斷地修改、調試程序,程序的下載操作會(huì )頻繁發(fā)生,因此減少數據的通信時(shí)間,提高用戶(hù)目標代碼的寫(xiě)入速度顯得尤為重要。本文針對S12新型編程系統的設計思想已經(jīng)應用于SD-Pro-grammer For S12 V2中,通信速度提高了5倍多,能適應當前S12系列所有的MCU,對于新款MCU可以實(shí)現快速支持。文中給出的編程系統中提高通信速度的設計方法對類(lèi)似于嵌入式系統的應用開(kāi)發(fā)也有著(zhù)很好的借鑒作用。 參考文獻 1. 清華大學(xué)Freescale MCU/DSP應用開(kāi)發(fā)研究中心 BDM for S12,(TBDML)用戶(hù)手冊 2006 2. 徐清.王宜懷 嵌入式微控制器MC68HC912B32背景調試模式設計與實(shí)現 2006(6) 3. 張琴.王宜懷.劉曉升 單線(xiàn)調試接口BDM的通信技術(shù)研究 [期刊論文] -單片機與嵌入式系統應用2008(5) 4. William Wong Background Debug Mode Speeds Up 16?Bit Microcontroller Application Development 2002(6) 5. Freescale Inc Background Debug Module (BDM) V4 2008 6. Freescale Inc FTS128K Block User Guide V02.01 2008 7. 王宜懷.劉曉升 嵌入式系統-使用HCS12微控制器的設計與應用 2008 作者:蘇州大學(xué) 沈曉慧 劉曉升 王宜懷 朱巧明 來(lái)源:《單片機與嵌入式系統應用 》 2009(6) |