2016年8月25日 星期四

在 ubuntu 上開發 nuvoton m051 實驗板

本實驗室導入新 MCU 作為實驗平台:

此為新唐科技 (4919) 的 ARM Cortex-M0 核心 MCU
因為一些因素接觸他們家的產品, 看起來相當有競爭力, 故嘗試導入
他們家的開發平台是 ARM 的 Keil, 那要在 Windows 上才能搞
在 ubuntu 上要使用, 就沒法用官方的工具, 需要用別的方案
經過一些搜尋和實驗, 已經有人做出來了, 我們只要拿來用
軟體完全沿用自前篇 在 ubuntu 上開發 STM32F469 Discovery 實驗板



M051-EVB

裡面大概就板子和光碟, 光碟裡面有 Keil 試用版, 燒錄工具
Keil 試用版在編譯指定容量以下的程式可永久免費使用, 印象中好像是 32K
要編譯超過這容量的程式就要付費, 聽說這平台報價約 2500 鎂
不同平台會有不同的收費, 某 M3 平台的 Keil 報價五千多鎂
足夠買台新款 Canon 5D 還配一顆紅圈定焦鏡XD
不過如果是公司還是乖乖買吧, 有 support 的遇到困難可以有解 (當然要加錢)
一般用戶就透過 "特殊管道" 取得吧XD 不然就是來 ubuntu 搞純文字開發


板子分兩區, 左邊是 M051, 右邊是 Nu-Link 燒錄器


背面, 折斷後可分開使用, Nu-Link 提供的軟體有工廠生產模式
對於跑過工廠的我來說真是非常親切 (啥鬼?)

看了一下電路圖, 我感覺到燒錄的界面有種熟悉感, 那就是 STM32 的!
都是 CLK, DIO 兩隻腳而已, 我的感覺是燒錄器可能只是一個通道, 但通道建立以後
操作的協議可能和 SoC 上 CPU 的除錯模組有關
以前唸書時印象中看過有人專門研究 SoC 除錯器的, 就功能面來說應該稱作追蹤器
可以追蹤暫存器狀態, 或是讓 CPU 進入單步執行, 讓外部工具可以撈出當前狀態
供開發人員尋找問題, 這種東西各家 CPU 通常都做自己的
不過如果都是 ARM 核心, 應該可以共用吧, 除非廠商有設些保護就例外
然後再看軟體, 廠商提供的軟體也有許多相似處, 都有 SystemInit()
中斷向量的順序也幾乎相同, 所以我開始尋找一個 ubuntu 上可用的通道硬體
前篇 在 ubuntu 上開發 STM32F469 Discovery 實驗板 的板上有個 STLink
既然已經驗過了就用它吧, Google 搜尋後也有發現有人拿 STLink 去操作 STM32 以外的 MCU

OpenOCD 操作 MCU 需要兩個設定, 一是燒錄器, 也就是通道硬體, 二是 MCU 腳本
要能透過通道初始化 MCU, 要有放資料上去的記憶體位址等情報才行
Google 找到日本高手寫的文章:OpenOCD小ネタ19 -Nuvotonドライバの統合-


●Undocumented Registerの存在
NuvotonのARMマイコンのフラッシュ領域はユーザプログラム用のAPROMとブート
ローダ専用のLDROMの二つがあり、書き換えをするためにはそれぞれ別のフラッシュ
ブートモードから再起動する必要があります。つまりAPROMを書き換えたい場合は
LDROMのブートモードに切り替えコアリセットを掛けるという手間がかかります。
これが公式のマニュアルに記載されている手順です。

しかし!このような煩雑な手順を踏まなくてもどのモードでもAPROM,LDROM,CONFIG
の書き換えそしてチップ全消去コマンドが実行できる方法が解析により見つかっています。
マニュアルに記載されていないレジスタ0x5000C01Cに1を書き込むとフラッシュに対する
全てのアクションが出来てしまうようです。Nu-Linkのツールではこれを自動で行っている
ことから気づき解析されたみたいですね。

そして上記の成果はOpenOCDに反映されましたがこのときはまだmini51シリーズのみ
だったため、私の手持ちの他のシリーズ(NUC120,NUC220,M051,NANOシリーズ等)でも
この技が効くかどうか確認し、OpenOCDの更新が落ち着いたタイミングを見計らって
今回の統合をおこない、無事マージされました。長かった…!


大致上是說新唐的 MCU 有隱藏的暫存器來操作 Flash
新唐的 MCU 有兩塊 Flash, 一個供 bootloader 用, 另一個是主程式用
一般的操作下, 要先修改開機設定, 然後 reset 以後設定才會生效
這樣才能寫不同的 Flash, 這在官方文件中有記載
但是!高手發現有方法可以在不 reset 的條件下清除並讀寫各個 Flash
方法是官方文件上沒寫的暫存器 0x5000C01C 對它寫 1 就可以全存取
這是高手在研究 Nu-Link 工具發現的, 不知道是攔截通訊還是反向工程找到的
成功後這位高手把成果貢獻到 OpenOCD 中, 並測試其他新唐的 MCU 確認能用
一年多前貢獻的, 現在檔案名稱有改, 檔名為 numicro.cfg 和 numicro.c
感謝日本高手貢獻!

另外, 那位高手提供的軟體正好也有 M0516LBN + ST-LINK/V2
所以我們只要跟著用一定是通的, 高手還有留資料讓用戶使用 OpenOCD
不過那是 Windows 上用的, 有需要的用戶如果懂些日文可以試試:
Project Examples and Misc Files


由於是相近的東西, 我還是用自己改的, 我改 STM32 時做的腳本來用
OpenOCD 的操作以及除錯策略請參考前篇 在 ubuntu 上開發 STM32F469 Discovery 實驗板
玩法都是一樣的, 編譯器也是一樣的, 編譯, 燒錄, 然後執行, 掛掉了就撈出 PC
然後反組譯 elf 檔來看死在哪裡即可, 這裡就不再重複敘述, 只記下流程並提供腳本
雖然是 M051-EVB 但我的有改過

由於我能買到的晶片只有 BN 版, 為了準確評估我把版上 DN 版晶片換成 BN 版
不過我認為這應該不影響 DN 的用戶使用, 因為它們幾乎相同, 只是 BN 少了些功能
以 i2c 部份來說 BN 無法休眠喚醒且只有一個 i2c, DN 則有兩個 i2c

腳本在此:m051-linux.zip

解開後有四個目錄, keil-inc 是安裝開發板提供的 Keil 以後從裡面挖出來的標頭檔
test, uart, i2c 則是三個測試程式, 一個閃 LED, 另一個從 Uart 丟資料
最後一個透過 i2c 從感測器讀出資料然後放到 uart

編譯後接著準備硬體, 把 ST-Link V2 這樣接上


然後執行 OpenOCD, 我前篇下載的源碼已經包含新唐 MCU, 完全不用修改直接執行:

sudo ./bin/openocd -f interface/stlink-v2.cfg -f target/numicro.cfg -s share/openocd/scripts

Open On-Chip Debugger 0.10.0-dev-00197-gafbad69 (2016-02-01-16:30)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 1000 kHz
none separate
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : clock speed 950 kHz
Info : STLINK v2 JTAG v21 API v2 SWIM v4 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.264636
Info : NuMicro.cpu: hardware has 4 breakpoints, 2 watchpoints

如果發現找不到腳本有可能是舊版, 新唐 MCU 用的腳本從日本人的紀錄看來是有改名過
接著編譯測試程式, 到 test 目錄下 make
得到 test.bin 以後複製到上面執行 OpenOCD 所在的目錄, 用 telnet 連進去寫入 Flash

$ telnet localhost 4444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> reset init                         
NuMicro.cpu: target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0xc1000000 pc: 0x00000140 msp: 0x20001000
> flash write_image erase test.bin 0x0
auto erase enabled
Nuvoton NuMicro: Sector Erase ... (0 to 1)
Nuvoton NuMicro: Flash Write ...
NuMicro.cpu: target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000002e msp: 0x20001000
wrote 1024 bytes from file test.bin in 0.085692s (11.670 KiB/s)
> reset 

完成後就可以看到板上紅色 LED 閃爍

接著把這編譯出來的 bin 檔拿到 windows 主機用 Nu-Link 燒錄

它也是能用的, 這也不難理解, 因為就都是把資料塞到 flash 位址 0 的地方, 沒什麼不同


uart 的範例只發資料, 設定為 115200 8N1

執行後會約每 400ms 發一串 abcde 字串, ubuntu 上用 minicom 即可收
左邊黃色板子上面是 SP3232, 和 MAX3232 是相容品, 3-5V 轉 RS232 的界面 IC
這張黃色板是原型版, 後來有送廠生產, 不過手邊一下子找不到閒置的
只好把這老屁股(?)拖出來使, 看起來還活的好好的, 讓我感到十分欣慰

i2c 的範例從感測器讀出資料然後放到 uart


感測板是 GY-88, 我只讀 e-compass, 其他先不管, 也不校正, 就只是讀出
新唐的 i2c IP 感覺像是和 AVR 系列相近的, 一看暫存器說明就有親切感
結果實驗發現只要把定義換過去

#define TWINT I2C_I2CON_SI_Pos
#define TWEA I2C_I2CON_AA_Pos
#define TWSTA I2C_I2CON_STA_Pos
#define TWSTO I2C_I2CON_STO_Pos
//#define TWWC 3
#define TWEN I2C_I2CON_ENS1_Pos
#define TWIE I2C_I2CON_EI_Pos

上面 TWXXX 的原先是 AVR 上在用的, 把它換成新唐的 I2C_I2CON_XXX
然後讀取 data 和 control 的暫存器換一下, 操作方式幾乎不改就能直接用
差別只在初始化, 新唐的 ARM 多了 NVIC 以及 pin function 切換
初始化完後就幾乎相同, 我在 AVR 上的軟體都可以直接搬過來, 挺好的
不過新唐的使用手冊關於 i2c 暫存器部份描述我看不太懂
如果搞不懂其行為, 建議可以去看 AVR 的, AVR 寫的我個人比較容易理解
我的編譯腳本中附的 Keil 的標頭檔在 i2c 部份有做些修改
在 DN 版本 M051 有兩個 i2c, 但是標頭檔裡卻只有一個 i2c, 不知道為什麼
我就把它改成 I2C0 和 I2C1, 不過沒有測過就是了, 只照著 datasheet 填上位址

M051 是相當有競爭力的 MCU, 2.5~5.5V 的寬工作電壓, 核心速度達 50MHz
是一般 8051 以及 AVR 的兩倍, 如果外接晶振就有三組 clock 源可用
不會因為 clock 速度限制一些通訊功能, 像是以前如果要用 uart
就一定要 11.0592MHz 之類的晶振, 此時 SPI, I2C 的 clock 就會被除的很怪
而通訊方面如果是 M051 DE/DN 型號, uart, spi, i2c 都有兩組!
和蛋蛋一樣都有兩個!雖然我不知道能幹麻但看了就是爽XD
除此之外, 它的單價就和 8051 差不多, 如果是更低階的 Mini51 會更便宜
且因為有開機用 Flash 可以支援韌體更新, 非常具有競爭力!

不過價錢雖然便宜, 一般用戶要買卻不容易, 我定開發板等了兩週才到
買的人少都沒庫存, 要另外訂, MCU 單獨買在露天上不多而且價差大
我弄了幾顆 BN 的, 之後若要做板子大概會以 BN 為主, 能輕易弄到料的先用






以下塞垃圾, 和本文無關, 請忽略XD


大圖 300dpi 版按此

blog 搬到這裡後, 在上週瀏覽人數突破 10 萬, 做張圖感謝鄉親力挺(?)
不過如果加上前站的人數應該是 18 萬, 這是前站關閉前最後的畫面:

以前看一些日本網站, 尤其提供繪圖的, 會在點閱數突破某些整數時作圖感謝
本實驗室雖然是電控為主, 但以前還是有搞過一些繪畫相關, 所以還是有辦法畫
只是畫美少女就沒辦法了, 只能畫大叔XD

這圖是用沾水筆和鋼筆畫的, 先嘗試用沾水筆, 結果三兩下就沒水很不習慣
然後就買隻鋼筆, 說鋼筆也只是頭一樣, 筆身是全塑膠的, 一隻 299
不過蒐集資料後發現沾水筆可以用線圈或鋁箔掛在筆尖做儲墨器
依照本實驗室精神應該這樣做才恰當...算了, 都買了就用吧

鋼筆繪製線稿, 掃描器掃入電腦, 設臨界值轉成黑白, 然後修線條, 這是傳統工法
以前我的作法是鉛筆塗輪廓, 掃進電腦但不處理, 把它放底圖, 用向量繪圖在上面描線
這樣可以獲得比較平滑的線條, 但是如果遇到需要改變粗細線條的情況就會很麻煩
不是做不到, 只是很麻煩 ! 要改用圍成多邊形填充的方式, 才能實現沾水筆一劃就能表現的效果
各有優缺點, 如果混合進行應該可以有不錯的表現
另外還有繪圖板的策略, 這我就不試了, 那需要花時間適應, 而且我每天看一整天電腦
改用紙本的讓眼睛變焦一下比較好

距離上次繪圖不知道是幾年前的事了, 一邊塗就一邊想起以前設計系的日子
以前每天都在塗, 塗紙上, 塗電腦上, 塗完還要印出來交作業, 然後有些會被退貨(?)
這週要加做上週退的作業, 多退幾次就要做好幾週的作業, 動不動就做到看日出
以前 LCD 顏色比較差, 所以都建議要用 CRT 的螢幕

這是以前宿舍照, 很久很久以前的...
那時候系上流行的是 Mozo 全平面 17" CRT 螢幕, 可能是 Mozo S710
我沒錢買新的, 就把家裡舊的搬來用, 結果後來要交作業要輸出大圖, 忘記是全開還是 A3
出一張收費一張小朋友, 結果我拿去出的時候被念怎麼搞成這樣, 顏色就是一團屎
我也想知道為什麼會變一團屎啊, 在螢幕上看就好好的, 誰知道會變一團屎
不過除非我被退件不然我是不會重做的, 開什麼玩笑, 一張小朋友耶 !

當時室友說, 我們學這個什麼都只學一點, 這樣出去什麼也贏不了別人
還是轉學另謀出路吧, 所以我就跑來做軟體, 然後過了幾年又改軟硬整合
如果我當時沒轉學不知道我會在哪裡? 不知道現在那些同學都在做些什麼?
不過我在玩的東西很多教科書上也沒寫, 現在做的也是教科書上找不到的
如果對於一項領域有很高的興趣, 或許學校有沒有學就不是那麼重要了
唯一比較重要的大概是要有個大家興趣接近的 "環境" 吧
想起當時學設計時一位同學說的話, 那時候我有在玩一點電子, 就只是會兜套件的程度
然後拿了個電阻忘記要做什麼, 那同學說:誰會去算那阻值啊? 隨便弄啦
當時我也懂不多, 只是覺得怪怪的, 如果隨便都可以那幹麻這麼多種阻值?
所以當時也沒回他, 就隨便抓一個接上去, 若是現在再聽到這句
我大概會說:這些都是可以計算的, 還可以分析頻率特性, 只要搭配電容電感來出題
就可以成為工科學生的惡夢, 而且這惡夢只要幾十塊台幣就能實現XD
如果在設計科系去搞這些工程的東西, 通常應該會孤立無援, 這樣的環境就是阻礙

扯遠了XD 總之, 上面那張感謝圖的內容算是本實驗室的 roadmap, 期望以後實驗室會長那樣
裡面包含一些未來計畫, 但不一定會成功, 有的看起來難度很高XD
所以細節就不描述了, 做不出來我就自己吞下去, 反正沒說過我要做, 圖片只是參考XD

7 則留言:

  1. 上次忘記看哪家的ic(大概是飛利浦),i2c的暫存器也是各種眼熟,後來想想會不會控制i2c基本功能的暫存器也已經某種程度上標準化了
    之前在看nordic的mcu,也想到可能可以拿stlink來寫xd 有標準化的東西就是比較省事

    回覆刪除
    回覆
    1. 嗯, STM32 的好像也類似, 大致上就是有事件時會中斷提醒
      事件則像是一筆資料傳完, ACK 回來, 沒等到 ACK, 停止時之類的
      不過 STM32 的事件用別的數字替代, 新唐的完全和 AVR 一樣的倒是第一次看到
      nordic 的是 nRF51822 那顆嗎? 我印象中是可以, 有老外測過
      板子買了還沒空測, 它那包軟體東西很多短時間沒法弄
      有標準化有好有壞, 好的是要支援多廠硬體的開發人員可以不用作苦工
      壞的則是身為供應商的開發人員, 幫客戶除錯完, 他就跑去找別家買便宜的
      簡稱替人作嫁XD 標準化了嘛, 搬過去也會動是很正常der~

      刪除
  2. 版主,您好。
    請問使用ST-Link V2連接Nuvoton MCU的時候,對應的腳位是?
    參可這一篇,似乎只有三根即可。https://github.com/rogerclarkmelbourne/Arduino_STM32/wiki/Programming-an-STM32F103XXX-with-a-generic-%22ST-Link-V2%22-programmer-from-Linux

    分別是SWDIO接到ICE_DAT、SWCLK接到ICE_CLK。GND對GND。那麼/RESET這一跟要接到哪邊?
    感謝版主。

    回覆刪除
    回覆
    1. 上面回覆看錯更正XD
      Reset 免接! 就接三根即可, 我文中接四根的是 power, 那是偷懶XD
      懶的另外拿 power 所以借用燒錄器的, 實際上只需接三根
      對 openocd 一樣可以下 reset, 至於那根 reset 用途是啥我就不清楚了...

      刪除
  3. 超級感謝版主啊。
    趕快來實驗看看。

    如果可以使用openocd + st-linkv2開發。
    那不管是windows / linux都可以暢行無阻了

    XDDDDDD

    回覆刪除
    回覆
    1. https://loserembedded.blogspot.tw/2016/08/stm32.html

      這一篇應該可以徹底的完成這個願望才是 XD

      刪除
    2. 這家的也是雙平台支援, 有興趣可以比較看看:
      TrueSTUDIO
      https://atollic.com/truestudio/
      不過目前沒有支援新唐的...

      STM32 的 StdPeriph_Lib 是舊版了, 新的用這個:STM32Cube
      包含 RTOS, 自動程式產生器, 只要用 GUI 設定好接腳及要用的功能
      即可產生程式碼模板, 可供 IDE 或純 makefile 用
      用戶只要照著填入程式就可以產出, 這是目前我看過的 MCU 方案中服務最好的
      不過如果是學術研究或是初次使用最好從沒有任何 lib 支援開始寫, 看 datasheet 填暫存器
      因為如果不這樣, 遇到一些奇怪的現象時會無法解決...
      這官方 lib 會假設用戶只用幾種情境操作硬體, 同時繞過自家硬體的 bug
      挖的越深就會發現這家方案的雷不少XD 如果不照著 "預設立場" 操作會遇到奇怪的現象
      不過各家都有各家的弱項, 不是只有 STM32 才這樣就是了

      刪除