不用燒錄器也能更新韌體 - In-System Programming (ISP)、NuMicro ISP Programming Tool

上週將003Clock做成隔空感應的引擎轉速表,引起不少討論,陸續接到一些讀者詢問:在GitHub上看見轉速表的原始碼,看了之前的文章也學會了編譯程式,但是沒有燒錄器要怎麼將韌體燒進003Clock?

這是003Clock系列的第三篇文章,前兩篇沒跟上的記得回追一下喔!

(一)製作新唐N76E003/N76S003白光LED電子時鐘套件
(二)以VS Code, SDCC, Git建立新唐8051編譯環境
(三)新唐N76E003/N76S003白光LED電子時鐘套件韌體技巧說明
Part 1:消除開關彈跳現象(de-bounce)、Timer delay、功能選單,以新唐N76S003為例
Part 2:Timer auto-reload產生中斷來精確計時,以函式指標(unction pointer)切換中斷服務程式的功能
Part 3:以N76S003的SPI控制PT6961白光LED七段顯示器
(四)不用燒錄器也能更新韌體 - In-System Programming (ISP)、NuMicro ISP Programming Tool

燒錄韌體的方式

  1. 買一個Nu-Link-PRO,建議有在用新唐MCU做專案的讀者可以備一支,真的很好用。在新唐的線上商店Nuvoton Direct購買,原廠直營,貨源有保障。(現在註冊NuForum論壇帳號還有9折的折扣)
  2. 將新唐開發板內建的Nu-Link-Me拿來用,手邊如果已經有新唐開發板,請參考看看這篇文章:用新唐開發板燒錄其它晶片
  3. 以上兩個都沒有,難道真的要花錢買嗎?別擔心,早就為你們想到了!筆者在包裝時已經在N76S003 / N76E003的LDROM中為大家燒錄好ISP程式了,只需隨手可得的USB to UART(USB to Serial或俗稱的USB to TTL、FTDI、PL2303之類的),搭配新唐原廠工具NuMicro ISP Programming Tool,就可以燒錄其它韌體。

什麼是ISP?

ISP的全名叫做” In-System Programming”,直接翻的話就是「在系統燒錄」。這邊的系統不外乎是指嵌入式系統,構成嵌入式系統的元素,包含硬體、周邊電路、韌體、通訊界面、軟體等。ISP可以在不將晶片從系統中移除的情況下,來執行韌體燒錄、更新。

ISP的好處以及實際應用情境 

當我們真正設計一個產品並銷售到市場,總會遇到需要更新韌體來改進一些功能,這時候總不能叫客戶自己買一個燒錄器,還要把產品外殼拆開來更新韌體吧!一定是用產品本身的通訊介面來更新。

ISP就可以很好地解決這件事,以電競鍵盤、滑鼠舉例,廠商通常會發布韌體更新來修正、新增一些功能。要更新時是在PC上執行更新程式,在鍵盤、滑鼠上用特殊的按鍵組合,或重新插拔USB,使其進入ISP模式,接收PC軟體從USB傳來的資料。這樣就可以讓客戶自己操作更新韌體,不用燒錄器亦不需拆解。

003Clock也一樣,設計的初衷就是一個可玩性高的新唐1T 8051 + 七段顯示器的開發平台,讓讀者可以發揮想像力。

以NuMicro ISP Programming Tool執行韌體更新

003Clock的晶片已經預燒了ISP_UART1,只要準備一條USB to UART連接在N76S003的UART1,就能更新韌體。UART1在哪裡?對照一下手冊的Pin Configuration可以得知UART1的TXD、RXD分別在P1.6、P0.2,並且與ICE_DAT、ICE_CLK共用。

再看一下003Clock電路板上的標示,右下角5-pin的燒錄介面,DAT、CLK分別就是UART1的TXD、RXD。將USB to UART的RXD接在N76S003的TXD、USB to UART的TXD接在N76S003的RXD,兩邊分別一發一收才能通訊。可以像這樣,用一個5-pin排針把USB to UART的順序排列好,但是接好以後先不要插上003Clock,因為ISP程式已經設計成在通電剛開始的一小段時間等待PC軟體的交握,沒在時限內完成交握就會跳出ISP,自動去執行APROM的程式了。

接著打開NuMicro ISP Programming Tool,選擇用UART來做ISP,並選擇USB to UART對應的COM port,然後按下Connect讓ISP Tool待命,隨時準備和003Clock交握。可以在這裡下載到NuMicro_ISP_Programming_Tool

把剛剛預先排好的排針插上後,就可以看到連線成功。選擇APROM的檔案,並在下方勾選要燒錄APROM以及燒錄完畢要Reset an Run,最後按右下角的Start就可以完成韌體燒錄。

ISP的實作機制

沒有意外的話,讀者應該已經成功燒錄韌體了,很開心吧!接下來要講解一下ISP的技術細節原理。要讓MCU有ISP功能,MCU本身就必須有一段ISP程式控制周邊通訊介面,對這些介面收送資料,還要控制快閃記憶體控制器(FMC, Flash Memory Controller),才能讀寫快閃記憶體所組成的程式記憶體(Code Memory),這宛如是一座搭起通訊介面與程式記憶體的橋樑。比如剛剛提到003Clock要在剛上電時才會執行ISP程式,或者鍵盤滑鼠的「特殊的按鍵組合」、「重新插拔USB」都是為了讓MCU去執行ISP程式。一般會將程式記憶體「分區」,分成正常執行模式和ISP模式,如果更新時出差錯(例如 更新到一半斷線),才不會連ISP程式都無法執行,減少變成「磚機」的風險。

新唐MCU幾乎全部都有內建「分區」的功能,可將正常執行模式的程式放在APROM (Application, 應用程式)、將ISP程式放在LDROM (Loader, 載入程式)。舉例來說,新唐N76S003的APROM區塊和LDROM區塊共享18 KB的程式記憶體,可以透過Config bits選擇兩者分配的大小。


這邊補充一下APROM及LDROM的名詞意義,APROM的AP,是Application的縮寫,通常空間比較大,拿來存放正常執行模式的「應用」程式,這應該是無庸置疑;而LDROM的LD,是Loader的縮寫,有著「載入、引導」的含義,因為通常放在裡面的程式可以決定要不要「引導」晶片去執行ISP或APROM中的內容,故稱LDROM。

為產品增加ISP功能

新唐大部分BSP中的SampleCode都有提供ISP範例程式,裡面也有編譯好的執行檔可以直接燒錄進LDROM,並且與原廠工具NuMicro ISP Programming Tool能夠搭配使用。要怎麼燒錄ISP程式?那還是得用Nu-Link燒錄除錯器搭配PC軟體NuMicro ICP Programming Tool,這部分003Clock已經預先燒錄好了,但還是要讓讀者知道當初是怎麼燒進去的。

  1. 燒錄時除了要在ICP Tool中選擇LDROM的ISP程式檔案,如果已經有APROM的程式,也可以在此選擇檔案
  2. 接著將Config bits設定從LDROM開機
  3. 最後還要記得勾選要燒錄APROM (如果有的話)、LDROM和Config bits。
  4. 按下右下角的Start開始燒錄


不過N76E003_BSP V2.0剛出來沒多久(V2.0將同一份BSP同時支援Keil C51 / IAR / SDCC),其中的ISP範例程式似乎還有些bug,我測試過沒辦法直接使用,之後會再回報給工程師。筆者推出003Clock時有順帶修正bug,並將其瘦身(原廠提供的為2172 Byte,我修改過的是1942 Byte),瘦身的目的是為了只分配2 KB給LDROM,留下16 KB給APROM;原廠提供的ISP執行檔為2172 Byte,因為LDSIZE的設定只允許1, 2, 3, 4 KB,雖然只差了一點,但晶片的限制也只能分配3 KB給LDROM才裝得下, APROM只能留下15 KB。修改過後的原始碼請見我的GitHub:https://github.com/danchouzhou/003Clock/tree/main/firmware/ISP_UART1

技術細節講了很多,最後歸納一下重點

  1. 全新空白的晶片,要用Nu-Link燒錄除錯器配合PC軟體NuMicro ICP Programming Tool來燒錄APROM和LDROM。
  2. 如果打算要使用ISP功能,要將ISP程式燒進LDROM,並設定Config bits選擇從LDROM開機。
  3. 以ISP執行燒錄時,PC軟體要用NuMicro ISP Programming Tool。
  4. ISP的機制可以透過位於LDROM中的ISP程式,收送通訊界面(例如 UART)的資料,並將通訊界面傳來的程式寫入APROM。


留言

這個網誌中的熱門文章

無法被取代的指針型三用電表(一):前言

關於新唐科技NuMicro ISP的介紹和使用方式

新唐火神板開箱實作(一):NuMaker-Volcano與NuEclipse IDE入門篇