燒錄程序一般是指把代碼燒錄到flash中。那如何把代碼燒錄到flash中呢?配置flash介面寄存器。

每一塊flash都有flash配置寄存器,通過操作這些flash配置寄存器就可以對flash進行解鎖,擦除,編程等操作。

flash演算法或者編程演算法,就是實現定義好的函數,包括:初始化,編程,擦除等。來供程序使用

不同的FLASH的介面寄存器的操作方式不同,具體表現在:寄存器的地址不同,寄存器的關鍵位置的含義不同,所以實現定義好的函數也就會不一樣。以上應該能給你解釋為什麼不同型號的單片機需要完全不同的燒錄程序。

單片機的燒錄原理:單片機都有外設:比如GPIO,SPI,UART。每個外設都有對應的操作外設的寄存器。姑且稱之為外設寄存器。CPU也有寄存器:R1-R15等。這些叫CPU寄存器。同時單片機還有一類寄存器 叫調試寄存器。一般來說初學者只會去操作外設寄存器。

燒錄的原理基本都是這樣的:首先配置調試寄存器使得CPU的停止運行。然後去修改內存的值,然後去修改PC寄存器的值,然後再次修改調試寄存器的值使得CPU運行,這樣單片機就會從PC寄存器的值處開始運行。這樣我們修改了的內存就會被執行了。

所以重點就是修改的內存的值:應該修改成什麼樣?首先先把flash演算法傳到內存中,然後在把待燒錄的代碼傳到內存中(如果內存足夠大的話可以一次性全傳,否則可以分次傳)

最後:配置調試寄存器和CPU寄存器都是通過DAP實現的,也就是JTAG或者SWD。通過控制DP和AP寄存器可以讀寫所有的:CPU寄存器;調試寄存器;內存;

控制DP和AP寄存器的方法:參考官方文檔arm-debug-interface-V5


燒錄的最終目的是把程序寫入flash中,以方便mcu可以將其讀出來運行。

程序編譯後生成的文件,可以理解為二進位文件。

所以,

單片機為了達到將二進位文件放入flash中,可以用多種方式完成。

在單片機剛買來的時候,雖然沒有用戶程序,但其本身已有一個程序,這個程序可以是固定的電路,也可以是存放在某個區,可以用來執行程序下載的指令。

大部分看起來平常的東西,內部都有程序的。比如U盤,其內部對於程序的執行效率很高。

單片機會根據實際情況判斷是下載程序,還是運行用戶程序。

根據情況不同,下載的方式可以是SPI,UART,JTAG等。

有的晶元除了內部的FLASH外,也支持外部flash,這時程序需要分散載入。通過演算法將程序寫入外部的flash中。

可以跑linux的mcu基本都掛外部,一般使用norflash和nandflash。這類晶元可能會使用sdio介面下載bootloader,有了bootloader後,可以直接使用網路,通過ftp,tftp等方式,把用戶程序在外到flash中。

終上,不同下載方式、下載工具和下載演算法,只是將二進位寫入flash中的不同實現途徑。

以上是個人理解,如有錯誤,歡迎指正。


其他單片機不熟悉,聊聊cortex-m吧,如有錯誤,歡迎討論和指正。

用jtag燒錄時的核心在於燒寫演算法的實現,實際上也就是對晶元的flash控制寄存器進行讀寫操作,由於不同家的flash設計不盡相同,所以導致燒寫演算法各不相同(除此之外還有匯流排地址分配之類也不同),不過本質都是通過內核運行指令對flash進行操作,具體而言就是下載時燒錄器會先將燒寫演算法拷貝到sram中進行運行,然後燒寫演算法會將從燒錄器那接收到的代碼通過操作flash控制寄存器放入到flash存儲區塊里,當然這其中肯定會有和晶元調試相關的外設參與工具,具體是怎樣的我也不清楚。

至於isp,那就是一個固化在晶元內的燒寫演算法代碼,比如如果是串口isp的話,下載程序的時候進入到isp後就通過串口和上位機進行通信來接收校驗代碼數據。另外還有iap(或者說bootloader),這個和isp是類似的,不過並不是固化在晶元中的,並且iap的實現方法很多,比如串口,iic,乙太網,can等等都可以實現,而isp則多為串口。無論是isp和iap,本質也是運行代碼指令進行flash操作,所以空片是無法進行下載的。

jtag燒錄和isp下載的最大區別在於,jtag需要藉助專門的晶元內硬體資源,相當於是晶元層級的實現,而無需代碼實現,只需要在下載的時候燒錄程序的時候導入一個小的下載演算法到ram中運行。而isp和iap下載則需要程序代碼的支持,isp是原廠固化的代碼,而iap是用戶實現的代碼。


一般是單片機生產商有自己的燒錄工具

別的沒使用過,以STC宏晶為例

用USB-TTL線燒錄時,單片機斷電重啟,會先執行bootloader,此時就會檢測串口是否存在下載數據流,如果有,則進入燒錄模式,如果沒有則開始執行用戶程序

STC的手冊附錄中還有如何使用第三方軟體燒錄的方法,及如何實現不斷電更新程序的方法(使用IAP功能,未開放bootloader)


不同的晶元主要兩點差異:Flash中存儲空間劃分不同,燒錄協議不同。其實只要你對自己常用的晶元足夠了解,完全可以自己寫一個統一的燒錄工具。


謝邀,現在單片機燒錄主要分為兩種形式:JTAG和串口。

首先單片機內部支持相關的flash的寫操作,其次,jtag原理是注入一段程序,然後通過jtag介面向該程序注入要寫入的程序,由該程序負責flash的寫操作。

串口下載則是在單片機啟動時,利用串口和計算機的燒寫程序通信,接收程序數據並寫入flash。

因為各家的燒錄規範都不同,一部分原因是單片機本身的硬體架構不同,另一部分原因是各家的單片機支持通過燒錄的方式進行一些啟動選項的定製,所以燒錄工具也不同。


推薦閱讀:
相关文章