LinkIt Smart 7688 Duo 之 Arduino COM埠閃退篇

本文將說明LinkIt Smart 7688 Duo 的 Arduino COM port 常見的問題與處理方式

文:Ted Lee李俊德  個人CC授權發布於CAVEDU blog [1]

延伸閱讀:LinkIt Smart 7688 Duo-Wi-Fi 掛點急救篇

 

Q:我的7688 Duo(以下簡稱7688D)在Arduino IDE上時常行蹤飄忽不定,有時會在燒錄Arduino草稿碼(sketch(以下簡稱Arduino程式)之前找不著指定的COM埠(port,有時程式燒到一半它就不見了。更糟的是,還會有程式順利燒好了,原本配置的埠卻也不見,再也找不到?

A:

問題思考 在探究問題的根源之前,我們需要先了解Arduino程式如何在7688D上執行的整個過程,將之整理為圖1。

以Arduino IDE寫好的程式對作業系統來說皆屬於應用程式的性質,此類應用程式會呼叫作業系統的系統服務(system services,並透過驅動程式將此程式傳到Arduino晶片上。Arduino晶片上的啟動程式(bootloader,以啟動程式簡稱)會將之載入內部的記憶體後不斷地重覆執行(Arduino程式會循環地執行loop()副程式區塊(block內的程式碼)。

因此,先排除硬體故障和作業系統錯誤的可能性(可用另一片正常的Arduino交叉測試)與Arduino程式的撰寫錯誤(可找另一可執行無誤的程式替換),我們可以合理懷疑都是驅動程式或啟動程式「惹的禍」!

image002

圖1:Arduino程式在7688D上從燒入到執行的一連串過程[2]

 

本問題的解法有三[3]

一. 重置MCU 如開發手冊(Developer’s Guide的3.1節所述,按下MCU重置鈕(MCU Reset Button 後讓ATmega32U晶片重新啟動(reboot

image004

圖2:重置MCU

二. 重灌驅動程式 在Windows作業系統的裝置管理員(device manager內確認7688D的驅動程式是否運作正常。如果異常,請参考本文的「複習」一節重新再安裝一次適合您電腦作業系統版本的驅動程式。

image005

圖3:可從裝置管理員中確認7688D驅動程式是否正確被作業系統識別(recognize[4]

補充說明:在您玩7688D時是否曾注意到這個COM埠,有時名稱是B(啟動程式COM埠)、有時卻出現G(一般COM埠)呢?原因是這樣的:

  1. 啟動程式COM:這個COM埠是由ATmega32U4上的啟動程式提供。它出現的時機有二:
    1. 當使用者剛重新燒錄ATmega32U4的啟動程式但還未燒錄Arduino程式時,這個COM埠會出現。
    2. 當使用者快速按兩下MCU重置鈕時,此COM埠會短暫出現後才切換到Arduino程式提供的COM埠。
  2. 一般COM:這個COM埠Arduino程式提供(使用者本身沒有寫它,但Arduino函式庫(library一定會連結)。如果Arduino程式錯誤或寫壞記憶體時,這個COM埠就可能會消失。

 

三:重裝啟動程式:使用AVRDUDE(AVR Downloader/UploaDEr)套件這個命令列工具(command line tool將啟動程式重新到ATmega32U的快閃記憶(flash momory[5]

  1. 將Caterina-smart7688.hex(通常放在C:\Users\使用者名稱\AppData\Local\Arduino15\packages\LinkIt\hardware\avr\0.1.6\bootloaders\caterina\之下)複製到USB隨身碟(handy drive
  2. 將此隨身碟(以USB-A1稱之)插到7688D上。
  3. 使用Putty工具以SSHSecure Shell方式連入7688D後(注意:使用SSH連線時你的電腦和7688D需在同一網段下),下達:

avrdude -p m32u4 -c linuxgpio -v -e -U flash:w:Caterina-smart7688.hex -U lock:w:0x0f:m

其中各參數[6] 說明如下:

-c:程式代號(programmer-id)。linuxgpio:Linux GPIO(General Purpose Input/Output,通用輸出/入)組態(configuration

-p:零件編號(part no)。m32u4 表示 ATmega32U4

-U:執行記憶體操作

-e:清除(erase)

-v:詳列的輸出訊息(verbose)

  1. 成功重燒妥啟動程式的畫面如圖4所示:

image006

圖4:以AVRDUDE指令重燒啟動程式的成功畫面。

複習(review開發環境(development environment)設定(setup

根据MTKMediaTek,聯發科)線上版開發手冊之第2小節預先準備好後續的開發環境:

  1. 韌體(firmware的版本更新(update到最新版(筆者撰稿時為9.3)。
  2. 安裝6.4版的Arduino IDE。
  3. 開發板管理程式(board manager內指定JSON格式的擴充套件(package下載網址(http://download.labs.mediatek.com/package_mtk_linkit_smart_7688_index.json),以安裝7688D识別資訊。
  4. 驅動程式安裝:
  5. 將滑鼠移到桌面右上角,選擇設定齒輪。
  6. 在設定選單中點撃變更電腦設定。
  7. 在電腦設定選單中點撃:一般®進階設定®立即重新啟動。
  8. 在選擇選項選單中點撃疑難排解。
  9. 在疑難排解選單中點撃進階選項。
  10. 在進階選項選單中點撃啟動設定。
  11. 在啟動設定選單中點撃重新啟動。
  12. 重新開機後,在啟動設定選單中點撃7) 停用驅動程式強制簽章。然後電腦會自動重新開機。
    • Windows 10:7688D驅動程式已內建,但需額外設定(第一次將7688D接到電腦時設定妥即可)。
  13. 連接7688D與電腦。
  14. 在700毫秒(ms)[8]內快速按压MCUMicro Controller Unit,微控制單元)[9]重置鈕二次。
    • Ubuntu:和Windows 10同,驅動程式已自動被掛載到(mount在/dev目錄下的ttyUSBx(UNIXUNIX-like檔案系統(file system規定所有週邊的硬體裝置(peripheral devices皆以檔案(file的方式存放在/dev(device)內)。其中,數字x在不同機器上會顯示不同的值。
    • OS X:Apple Mac上的作業系統OS X也是從UNIX某個版本修訂而來的。因此,同上述的Ubuntu,7688D的驅動程式會被掛載到/dev/tty.usbmodemxxxx。其中,數字xxxx在不同機器上出現不一樣的數值。

 

[1] 六種授權條款

[2] MT7688AN的韌體(firmware會在開機時期將OpebnWrt載入到7688D的記憶體內執行。因本問題發生在ATmega32U的使用,為了清晰起見,在圖1中並未繪出。

[3] 就筆者在晶片廠工作的實務經驗,當晶片在準備量產(mass production階段如遇有臭蟲(bug,通常會尋求軟體補丁(software patch,例如:驅動程式改版(revision、韌體升級(upgrade、…等等。如有軟體無法避免的瑕疵(defect,才會排入最新一期的硬體更新(update)時程(schedule考量之中。

[4] 圖片來源:http://www.slideshare.net/NissinAllelujahnissin/linkit-smart-7688-duo-and-mcs-basics

[5] http://labs.mediatek.com/site/global/developer_tools/mediatek_linkit_smart_7688/training_docs/arduino/duo_update_arduino_bootloader/index.gspGitbook知識庫的11.2節。

[6] http://www.nongnu.org/avrdude/user-manual/avrdude_4.html

[7] 此連結連到MTK原廠的英文版開發手冊。因筆者手邊無安裝Win 8的電腦,故無法擷取實際系統的中文操作畫面,讀者亦可参考Hello著作中圖文並茂的解說:win8.1 停止強制數位簽章

[8] 即700×10-3=0.7秒。

[9] 即為7688D內封裝的編号為ATmega32U4之Arduino控制晶片。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *