您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!
單片機(jī)應(yīng)用系統(tǒng)由硬件和軟件組成,軟件的載體是硬件的程序存儲(chǔ)器,程序存儲(chǔ)器采用只讀存儲(chǔ)器,這種存儲(chǔ)器在電源關(guān)閉后,仍能保存程序,在系統(tǒng)上電后,CPU可取出這些指令重新執(zhí)行。只讀存儲(chǔ)器(Read Only Memory,ROM)中的信息一旦寫入,就不能隨意更改,特別是不能在程序運(yùn)行過程中寫入新的內(nèi)容,
本文引用地址: http://power.21ic.com//digi/technical/201805/62042.html
故稱只讀存儲(chǔ)器。向ROM中寫入信息稱為ROM編程。根據(jù)編程方式不同,
掩模ROM.
在制造過程中編程,是以掩模工藝實(shí)現(xiàn)的,因此稱為掩模ROM。這種芯片存儲(chǔ)結(jié)構(gòu)簡單,集成度高,但是由于掩模工藝成本較高,只適合于大批量生產(chǎn)。
可編程ROM(PROM).
芯片出廠時(shí)沒有任何程序信息,用獨(dú)立的編程器寫入。但是PROM只能寫一次,寫入內(nèi)容后,就不能再修改。
EPROM.
用紫外線擦除,用電信號(hào)編程。在芯片外殼的中間位置有一個(gè)圓形窗口,對該窗口照射紫外線就可擦除原有的信息,使用編程器可將調(diào)試完畢的程序?qū)懭搿?/p>
E2PROM(EEPROM).
用電信號(hào)擦除,用電信號(hào)編程。對E2PROM的讀寫操作與RAM存儲(chǔ)器幾乎沒什么差別,只是寫入速度慢一些,但斷電后仍能保存信息。
Flash ROM.
閃速存儲(chǔ)器(簡稱閃存),是在EPROM和E2PROM的基礎(chǔ)上發(fā)展起來的一種電擦除型只讀存儲(chǔ)器。特點(diǎn)是可快速在線修改其存儲(chǔ)單元中的數(shù)據(jù),改寫次數(shù)達(dá)一萬次(ROM都有改寫次數(shù)),讀寫速度快,存取時(shí)間可達(dá)70ns,而成本比E2PROM低得多,因此正逐步取代E2PROM。
注意:更多存儲(chǔ)器內(nèi)容請參考,《電子技術(shù)基礎(chǔ)》數(shù)字部分(第五版) 主編 康華光. 第七章,或者 電工學(xué)(第七版)(下冊) 主編 秦曾煌 第22章.
燒寫器、燒錄器、編程器、下載器、仿真器、調(diào)試器
單片機(jī)編程器(燒寫器、燒錄器)是用來將程序代碼寫入存儲(chǔ)器芯片或者單片機(jī)內(nèi)部的工具。編程器主要修改只讀存儲(chǔ)器中的程序,編程器通常與計(jì)算機(jī)連接,再配合編程軟件使用。如下圖所示是一個(gè)典型的編程器外形。圖中黑色的是集成電路插座(也有下載編程器,不用取下芯片,涉及ISP、ICP,后面有介紹),通過撥動(dòng)手柄可以將置于其中的集成電路芯片鎖緊或松開。編程時(shí)鎖緊以保證接觸好,編程完畢松開,可以更換下一片芯片。
當(dāng)芯片是雙列直插形式時(shí),直接插在座子上就可以燒寫了,但是如果遇到下圖所示的各種封裝形式的芯片,又如何燒寫呢?一種方法是使用適配器,下圖是各種封裝芯片所使用的適配器。
下載器(下載線)是將編譯好的機(jī)器碼寫進(jìn)單片機(jī)的工具。程序經(jīng)過編譯生成目標(biāo)代碼,然后通過下載軟件和下載器下載到單片機(jī)的ROM或者Flash中。下載器主要來控制編程時(shí)序等。
仿真器(調(diào)試器)指以調(diào)試單片機(jī)軟件為目的而專門設(shè)計(jì)制作的一套專用的硬件裝置。單片機(jī)在體系結(jié)構(gòu)上與PC機(jī)是完全相同的,也包括中央處理器,輸入輸出接口,存儲(chǔ)器等基本單元,因而與PC機(jī)等設(shè)備的軟件結(jié)構(gòu)也是類似的。因?yàn)閱纹瑱C(jī)在軟件開發(fā)的過程中需要對軟件進(jìn)行調(diào)試,觀察其中間結(jié)果,排除軟件中存在的問題。但是由于單片機(jī)的應(yīng)用場合問題,其不具備標(biāo)準(zhǔn)的輸入輸出裝置,受存儲(chǔ)空間限制,也難以容納用于調(diào)試程序的專用軟件,因此要對單片機(jī)軟件進(jìn)行調(diào)試,就必須使用單片機(jī)仿真器。單片機(jī)仿真器具有基本的輸入輸出裝置,具備支持程序調(diào)試的軟件,使得單片機(jī)開發(fā)人員可以通過單片機(jī)仿真器輸入和修改程序,觀察程序運(yùn)行結(jié)果與中間值,同時(shí)對與單片機(jī)配套的硬件進(jìn)行檢測與觀察,可以大大提高單片機(jī)的編程效率和效果。(許多仿真器具有下載器的功能)
片內(nèi)Flash存儲(chǔ)器的編程器
Flash存儲(chǔ)器是一種電擦除型只讀存儲(chǔ)器。它的主要特點(diǎn)是在不加電的情況下能長期保持存儲(chǔ)的信息,又可快速在線修改其存儲(chǔ)單元中的數(shù)據(jù),其在線改寫功能使單片機(jī)的程序改寫和固化過程更加簡便。目前很多單片機(jī)都用Flash作為片內(nèi)程序存儲(chǔ)器。當(dāng)片內(nèi)的Flash存儲(chǔ)器滿足要求時(shí),不必?cái)U(kuò)展外部程序存儲(chǔ)器。
下面討論如何把已經(jīng)調(diào)試完畢的程序?qū)懭階T89S51單片機(jī)中的片內(nèi)Flash存儲(chǔ)器。
AT89S51單片機(jī)片內(nèi)4KB的Flash存儲(chǔ)器的特點(diǎn):
可擦寫壽命10,000次
數(shù)據(jù)保存時(shí)間10年
最大讀取時(shí)間150ns,頁編程時(shí)間10ns
具有3級(jí)加密算法,使得AT89S系列單片機(jī)的解密變得不可能,程序的加密性大大加強(qiáng)
AT89S51出廠時(shí),F(xiàn)lash存儲(chǔ)器處于全部空白狀態(tài)(各單元均為FFH),可直接進(jìn)行編程。若不全為空白狀態(tài)(單元中有不是FFH的),應(yīng)首先將芯片擦除后,方可寫入程序。(某些單片機(jī)出廠前會(huì)固化在ROM中一段Bootloader代碼,其作用就是在啟動(dòng)操作系統(tǒng)之前進(jìn)行初始化并引導(dǎo)系統(tǒng),并能把我們下載在存儲(chǔ)器中的程序加載到RAM中運(yùn)行然后把控制權(quán)交還給系統(tǒng)。就好比PC上的BIOS。ROM編程跟Bootloader沒有直接關(guān)系)
片內(nèi)Flash存儲(chǔ)器有低電壓編程(Vpp=5V)和高電壓編程(Vpp=12V)兩類芯片。低電壓編程可用于在線編程,高電壓編程與一般常用的EPROM編程器兼容。在AT89S51芯片的封裝面上標(biāo)有低電壓編程還是高電壓編程的編程標(biāo)志。不同的單片機(jī)的燒寫電壓,要視數(shù)據(jù)手冊來定。
應(yīng)用程序在PC中與在線仿真器以及用戶目標(biāo)板一起調(diào)試通過后,PC中調(diào)試完畢的程序代碼文件(.HEX目標(biāo)文件),必須寫入到AT89S51片內(nèi)的Flash存儲(chǔ)器中。目前常用的編程方法主要有兩種:一種是使用通用編程器編程,另一種是使用下載型編程器進(jìn)行編程。
通用編程器
通用編程器即不同的器件(比如不同的公司生產(chǎn),不同架構(gòu))能普遍使用的編程器,它是編程器的功能分類下的一個(gè)子類,與之相對的是專用編程器。在硬件上,通用編程器的管腳驅(qū)動(dòng)采用具有各種功能的通用結(jié)構(gòu),只需更新軟件就能支持新的器件,具有很好的靈活性,滿足目前和未來的器件需要。通常通用編程器鎖緊座的每一個(gè)管腳可以用作時(shí)鐘信號(hào)、數(shù)據(jù)總線、地址總線、控制總線、地線、電源線、VCCQ電壓、VPP編程電壓、管腳接觸不良測量專用總線等等。驅(qū)動(dòng)電壓可以從1.8V-25.0V,起碼分256級(jí)可調(diào)。
下載型編程器 (自我理解)
常見的下載型編程器
ISPro下載型編程器、ISP編程器、ICP編程器、ISP-ICP編程器…
幾種燒寫方式
ICP(In Circuit Programing):在電路編程(單片機(jī)通電即可寫入程序,包括bootloader)
ISP(In System Programing):在系統(tǒng)編程(單片機(jī)通電加上晶振,有bootloader引導(dǎo)的情況下,即可寫入應(yīng)用程序)
IAP(In Application Programing):在應(yīng)用編程(單片機(jī)在正常運(yùn)行的程序中,內(nèi)部程序?qū)纹瑱C(jī)局部重寫數(shù)據(jù))
ICP、ISP、IAP詳細(xì)介紹
ISP是指可以在板級(jí)上進(jìn)行編程,而不用把芯片拆下來放到燒寫器中,即不脫離系統(tǒng),所以稱作“在系統(tǒng)編程”,它是對整個(gè)程序的擦除和寫入,通過單片機(jī)專用的串行編程接口對單片機(jī)內(nèi)部的Flash存儲(chǔ)器進(jìn)行編程。即使芯片焊接在電路板上,只要留出和上位機(jī)接口的串行口就能進(jìn)行燒寫。(芯片一般固化了用來ISP升級(jí)的boot程序)
IAP同樣是在板級(jí)上進(jìn)行編程,MCU獲取新代碼并對程序的某部分重新編程,即可用程序來改變程序,修改程序的一部分達(dá)到升級(jí)、消除bug的目的,而不影響系統(tǒng)的其它部分,燒寫過程中程序可以繼續(xù)運(yùn)行,另外接口程序是自已寫的,這樣可以進(jìn)行遠(yuǎn)程升級(jí)而不影響應(yīng)用。IAP的實(shí)現(xiàn)更加靈活,通?衫脝纹瑱C(jī)的串行口接到計(jì)算機(jī)的RS232口,通過專門設(shè)計(jì)的固件程序來編程內(nèi)部存儲(chǔ)器。(通常自己編寫一個(gè)bootloader程序) (注: 有時(shí)候, ISP/IAP的分別并不是那么清楚!)
ICP在電路編程,ICP (In-circuit programmer),在電路編程方法允許使用商業(yè)編程器來實(shí)現(xiàn)編程和擦除功能,而無需將微控制器從系統(tǒng)中移出,可完全由微控器硬件完成,不需要外部引導(dǎo)器。(百度)
ISP、IAP應(yīng)用場合
1、ISP 程序升級(jí)需要到現(xiàn)場解決,不過好一點(diǎn)的是不必拆機(jī)器了。
2、IAP 如果有網(wǎng)管系統(tǒng)的話,用網(wǎng)管下載一切搞定,人不用跑來跑去。
在線編程目前有兩種實(shí)現(xiàn)方法:在系統(tǒng)編程(ISP)和在應(yīng)用編程(IAP)。ISP一般是通過單片機(jī)專用的串行編程接口對單片機(jī)內(nèi)部的Flash存儲(chǔ)器進(jìn)行編程,而IAP技術(shù)是從結(jié)構(gòu)上將Flash存儲(chǔ)器映射為兩個(gè)存儲(chǔ)體,當(dāng)運(yùn)行一個(gè)存儲(chǔ)體上的用戶程序時(shí),可對另一個(gè)存儲(chǔ)體重新編程,之后將控制從一個(gè)存儲(chǔ)體轉(zhuǎn)向另一個(gè)。ISP的實(shí)現(xiàn)一般需要很少的外部電路輔助實(shí)現(xiàn),而IAP的實(shí)現(xiàn)更加靈活,通常可利用單片機(jī)的串行口接到計(jì)算機(jī)的RS232口,通過專門設(shè)計(jì)的固件程序來編程內(nèi)部存儲(chǔ)器。 ISP和IAP很相似,都是不需要把芯片從板子上拔出來,就達(dá)到了用PC-MCU的編程接口(JTAG、串口、雙絞線、SPI等)搞定新版本的升級(jí)的目的。MCU內(nèi)部都是首先執(zhí)行一段獨(dú)立的Boot代碼(這段Boot代碼一般是出廠預(yù)置,或使用編程器燒錄的,通常只有1k或4k,SST通常是占用一塊獨(dú)立的Block,Philips通常是讓BootROM地址與其他Flash重疊,以達(dá)到隱藏的效果),Boot負(fù)責(zé)控制擦除程序存儲(chǔ)器及給程序存儲(chǔ)器編程的代碼(或是處理器外部提供的執(zhí)行代碼),然后通過某種與PC計(jì)算機(jī)的通信方式(如,ether網(wǎng)口),將用戶指定的某個(gè)在PC上編譯完成的MCU可運(yùn)行的二進(jìn)制代碼文件編程入MCU內(nèi)的程序存儲(chǔ)器。
IAP的實(shí)現(xiàn)
通常在用戶需要實(shí)現(xiàn)IAP功能時(shí),即用戶程序運(yùn)行中作自身的更新操作,需要在設(shè)計(jì)固件程序時(shí)編寫兩個(gè)項(xiàng)目代碼,第一個(gè)項(xiàng)目程序不執(zhí)行正常的功能操作,而只是通過某種通信管道(如USB、USART)接收程序或數(shù)據(jù),執(zhí)行對第二部分代碼的更新;第二個(gè)項(xiàng)目代碼才是真正的功能代碼。這兩部分項(xiàng)目代碼都同時(shí)燒錄在User Flash中,當(dāng)芯片上電后,首先是第一個(gè)項(xiàng)目代碼開始運(yùn)行,它作如下操作:
1)檢查是否需要對第二部分代碼進(jìn)行更新
2)如果不需要更新則轉(zhuǎn)到4)
3)執(zhí)行更新操作
4)跳轉(zhuǎn)到第二部分代碼執(zhí)行
第一部分代碼必須通過其它手段,如JTAG或ISP燒入;第二部分代碼可以使用第一部分代碼IAP功能燒入,也可以和第一部分代碼一道燒入,以后需要程序更新是再通過第一部分IAP代碼更新。
對于STM32來說,因?yàn)樗闹袛嘞蛄勘砦挥诔绦虼鎯?chǔ)器的最低地址區(qū),為了使第一部分代碼能夠正確地響應(yīng)中斷,通常會(huì)安排第一部分代碼處于Flash的開始區(qū)域,而第二部分代碼緊隨其后。
在第二部分代碼開始執(zhí)行時(shí),首先需要把CPU的中斷向量表映像到自己的向量表,然后再執(zhí)行其他的操作。
STM32 正常的程序運(yùn)行流程:
當(dāng)加入 IAP 程序之后,程序運(yùn)行流程:
從第二個(gè)圖,STM32 復(fù)位后,還是從 0X08000004 地址取出復(fù)位中斷向量的地址,并跳轉(zhuǎn)到復(fù)位中斷服務(wù)程序,在運(yùn)行完復(fù)位中斷服務(wù)程序之后跳轉(zhuǎn)到 IAP 的 main 函數(shù),如圖標(biāo)號(hào)①所示,此部分同圖 53.1.1 一樣;在執(zhí)行完 IAP 以后(即將新的 APP 代碼寫入 STM32的 FLASH,灰底部分。新程序的復(fù)位中斷向量起始地址為 0X08000004+N+M),跳轉(zhuǎn)至新寫入程序的復(fù)位向量表,取出新程序的復(fù)位中斷向量的地址,并跳轉(zhuǎn)執(zhí)行新程序的復(fù)位中斷服務(wù)程序,隨后跳轉(zhuǎn)至新程序的 main 函數(shù),如圖標(biāo)號(hào)②和③所示,同樣 main 函數(shù)為一個(gè)死循環(huán),并且注意到此時(shí) STM32 的 FLASH,在不同位置上,共有兩個(gè)中斷向量表。
在 main 函數(shù)執(zhí)行過程中,如果 CPU 得到一個(gè)中斷請求,PC 指針仍強(qiáng)制跳轉(zhuǎn)到地址
0X08000004 中斷向量表處,而不是新程序的中斷向量表,如圖標(biāo)號(hào)④所示;程序再根據(jù)我們設(shè)置的中斷向量表偏移量,跳轉(zhuǎn)到對應(yīng)中斷源新的中斷服務(wù)程序中,如圖標(biāo)號(hào)⑤所示;在執(zhí)行完中斷服務(wù)程序后,程序返回 main 函數(shù)繼續(xù)運(yùn)行,如圖標(biāo)號(hào)⑥所示。通過以上兩個(gè)過程的分析,我們知道 IAP 程序必須滿足兩個(gè)要求:
1) 新程序必須在 IAP 程序之后的某個(gè)偏移量為 x 的地址開始;
2) 必須將新程序的中斷向量表相應(yīng)的移動(dòng),移動(dòng)的偏移量為 x;
如果IAP程序被破壞,產(chǎn)品必須返廠才能重新燒寫程序,這是很麻煩并且非常耗費(fèi)時(shí)間和金錢的。針對這樣的需求,STM32在對Flash區(qū)域?qū)嵭凶x保護(hù)的同時(shí),自動(dòng)地對用戶Flash區(qū)的開始4頁設(shè)置為寫保護(hù),這樣可以有效地保證IAP程序(第一部分代碼)區(qū)域不會(huì)被意外地破壞。
ISP與ICP的差別
For ISP
(1) MCU必須處于可執(zhí)行程序的狀態(tài) (除了上電, 還要接XTAL), 且必須預(yù)燒ISP-code在LDROM里面
(2) 燒錄范圍只限于APROM, DataFlash或CONFIG (但對使用者來說, 應(yīng)經(jīng)夠了!)
(3) chip在LOCK的狀態(tài)下, 仍然可以只更新某一區(qū)塊 (APROM, DataFlash或CONFIG)
(4) 因?yàn)闊浀膭?dòng)作取決于ISP-code的寫法, 所以給系統(tǒng)設(shè)計(jì)者的彈性較大
For ICP
(1) MCU只要處于上電狀態(tài)即可, 不必預(yù)燒任何code在MCU里面
(2) 燒錄范圍涵蓋整顆MCU, 包括 APROM, DataFlash, CONFIG, LDROM 和 ROMMAP
(3) chip在LOCK的狀態(tài)下, 無法只更新某一區(qū)塊, 只能在erase-ALL之后, 更新某一區(qū)塊, 再逐一燒回其它區(qū)塊(因?yàn)镮CP的本質(zhì)就是走串行接口的Writer Mode, chip被LOCK之后, 除了erase-ALL, 所有燒錄動(dòng)作皆會(huì)被禁止)
(4) 因?yàn)闊浖兇馐荌CP硬件的行為, MCU無法自己更新自己, 所以給系統(tǒng)設(shè)計(jì)者的彈性較小(例如: 無法藉由ICP去實(shí)現(xiàn)IAP的功能)
ISP與ICP的使用場合
依這兩者的特性, 配合客戶的系統(tǒng)需求, 而后才建議客戶使用ISP或ICP.
注:上述差別的第(3)點(diǎn)和第(4)點(diǎn), 可能是ICP帶給使用者的最大限制. 站在使用者的觀點(diǎn), 若ISP與ICP只能擇一的話, ISP會(huì)是必要的選擇。
ISP、IAP、ICP與傳統(tǒng)燒寫方式的區(qū)別
1)在開發(fā)階段
改code時(shí), 不再需要將MCU從板子上拔起來, 拿到燒錄器上燒, 然后再裝回去. 可以直接利用ISP/ICP Programmer做板上燒錄, 為開發(fā)者提供了極大的便利性.
2)在量產(chǎn)階段
客戶可以采用”先焊到板子上再燒code”的方式, 將燒code的動(dòng)作安排在生產(chǎn)線的某一站.
那么傳統(tǒng)的方式 (先將code燒好再焊到板子上)有什么缺點(diǎn)?
傳統(tǒng)的方式是這樣的: 拆封–>從tray盤取出chip–>燒錄–>把chip放回tray盤.
這樣的流程比起上面建議的方式: 增加了燒錄時(shí)間, 容易造成QFP包裝的chip彎腳, 或忘了燒code即放回tray盤.
3)在成品階段
已組裝好的成品若要改code, 可以透過預(yù)留的接口, 利用ISP或ICP, 更新MCU, 不需要拆機(jī)。
其實(shí)ISP是IAP的一個(gè)子集。它們兩個(gè)都可以實(shí)現(xiàn)更新應(yīng)用程序的功能。但是只有IAP才能實(shí)現(xiàn)程序放到任何地方都能執(zhí)行的功能:放到0x0,0x1000,0x4000, 0x100000(LDROM)。ISP只能放到地址0x0執(zhí)行,如果系統(tǒng)從APROM啟動(dòng),APROM就在地址0x0的地方;如果系統(tǒng)從LDROM啟動(dòng),LDROM就在地址0x0的地方。但是如果IAP使能,APROM的地址就固定在0x0,LDROM的地址就固定在0x100000.
APROM中的程序更新之后,ISP需要復(fù)位系統(tǒng),然系統(tǒng)重新啟動(dòng)
IAP則不需要,它只要修改棧寄存器r13,重新映射vector table,然后直接跳去新的應(yīng)用程序執(zhí)行就可以了。
N76E003使用NU—link仿真下載是常用簡單的方式,但是這樣的下載方式需要P0.2 P1.6 P2.0 P0.6 P0.7引腳作用,所以說事先這些引腳需要引出。而使用ISP的下載方式的話,雖然僅需P0.6與P0.7兩個(gè)IO,可是它事先需要對單片機(jī)刷入ISP_UART0.hex 為bootload代碼,這樣也需要用nulink鏈接刷入。
要提供一個(gè)引出來到接口插座。你可以參考官方的那個(gè)開發(fā)板,新唐原廠的那個(gè)板子是中間可以分開的,看看那個(gè)接口怎么定義的。
掃碼關(guān)注我們
傳真:0755-82591176
郵箱:vicky@yingtexin.net
地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08