Silicon Labs EFM8 的 Hello World 程式

  MCU 市場近年風起雲湧,ARM 架構的 M 系列幾乎已經吞食了整個 32-bit MCU 的市場,而之前利用 DSP 創出一片天的 Microchip PIC 則力有不逮,其 PIC32MX 的 M4K 架構雖承繼自 MIPS 的 R4000,但在 32-bit 大混中算是一個慘敗的陣營。

  ARM 架構的 MCU 中,又以 STM32 系列最廣泛地被四十大盜所推廣,所以現時大部份在四十大盜那裏買得到的電子套件,都不難發現 STM32 的影踨,一顆 M0 架構的 STM32 在四十大盜處花不到十個銅板便可以買到,難怪一眾 8-bit MCU 都顯得無人問津。

  不過,在低耗電應用的環境下,8-bit MCU 仍有其可取之處,可是傳統幾家老牌 MCU 製造商如 Microchip,Atmel 等都顯得對 8-bit 市場有點無甚創意,價錢更是高據不下,幾乎與 32-bit MCU 看齊,令人卻步,近年 ST 的 STM8 系列推出了一系列廉價方案,但其耗電量甚為驚人,Shutdown mode 都要苛索 10uA 電流,用在電池驅動產品上幾乎不可能。

  Silicon Labs 在 2013 年收購了 Energy Micro 後,密鑼緊鼓地推廣其 EFM8 及 EFM32 系列,其中 EFM8 (Bee) 系列的價錢相當吸引,一顆 20 腳的基本配備 MCU 在 DigiKey 也只不過售 3 個銅板左右,而支援 USB 的 EFM8 在 DigiKey 中最平也只需 5 個銅板,性價比比起 PIC 或 AVR 高出幾倍,令人難以抗拒。

IMG_1237 (1)

圖一‧ 這片 Universal Bee Starter Kit 只需二百多港元,但設備齊全。

  言歸正傳,在 DigiKey 用二百多港元買了一套 EFM8 Universal Bee Starter Kit,Silicon Labs 聲稱只需在其網站上下載其配套軟件 Simplicity Studio 便有齊所有開發工具、文件及 Libraries,曾 Sir 試了一下,發覺在得到滿足前難以避免會有陣痛,而且痛得幾劇烈,為免曾 Sir 的老人癡呆令自己痛完又痛,所以一定要把步驟一一記下來。

  Simplicity Studio 選擇了 Keil 作為編譯器,可以選擇 Simplicity Studio 自家的 IDE 或選擇大家熟悉的 Keil IDE,曾 Sir 既然選擇了痛,當然就痛得徹底,選擇了 Simplicity Studio自家的 IDE。

  啓動了 Simplicity Studio 後,當然先試一下它的 Configurator,這個 Configurator 就像 Keil 那個一樣,能以圖像介面來設定 Startup code,把 Starter kit 接上電腦,Simplicity Studio 便會自動根據你的硬體來決定調用哪一些文件和 Libraries,當然如果接上自製的板子,便要手動地選擇 MCU 的型號了。

001

  雖然 Simplicity Studio 入面有不少 examples,但單單用 example programme 都要搞好一陣子才知道它的來龍去脈,倒不如索性由零開始,慢慢摸索這個 Simplicity Studio 的玩法。所以進入了 Configurator 之後,選對了型號按 next,再選擇 MCU 的規模,這個 Starter Kit 上面的 MCU 是 48-pin 的,選好了便進入一個全新、由零開始的 Project。

PIC002

  第一個程式的任務是向 UART0 接口輸出 “Hello World” 字元。這片 48 腳的 Universal Bee 內置了兩組 UART,其中 UART0 是固定了在 P0.4 及 P0.5 這兩個接腳,而 UART1 則可以經由 Crossbar 架構把接腳 Map 到不同的 Port 位腳,這個 Crossbar 真的很棒,令各接腳嘅定義可以自由設定,在線路板 Layout 時真是超方便呢!

PIC003

  不過由於 Simplicity Studio 只提供了 UART0 的 Libraries,所以便先試一下 UART0 罷,把電腦的 COM Port 連到 P0.4 及 P0.5 (如圖一) 便完成了硬件的連接。這時回到 Configurator,看到界面主要分開了三個部份,中間的是 Mode transition, DefaultMode Port I/O 及 DefaultMode Peripherals,經由下面的「分頁」來選擇,大家除了 DefaultMode 之外還可以自定義其他 Mode 例如 Sleep mode, Shutdown mode 等。畫面右邊則有 Peripheral Mapping, Properties, console 及 outline 等分頁,當中有一個小小的 bug,就是 outline 分頁經常點選不到,所以曾 Sir 把這個分頁拖了出來成一個獨立的窗戶。

PIC004

  值得一提的是 problem 這個分頁,它顯示了目前設定存在了甚麼 conflicts,這對程式的 debug 有很大作用。一開始軟件就把 P1.5 編配給了 VRef 用,但是在 Problem 分頁中則提示了 VRef 必需設定為 Analog I/O,於是便在 DefaultMode Port I/O 分頁內個 MCU 圖像上點選 P1.5 那只接腳,右邊的分頁便會自動輚到 Properties 窗戶,便可以輕易更改 P1.5 的設定。

PIC005

  請注意 outline 分頁亦同時顯示了錯誤的位置在那裏,方便了尋找問題所在,把所有紅色交叉及黃色感嘆號搞定,才可以開始編譯。但是怎樣開始寫碼呢?飛快地閱覽一下 Simplicity Studio 所提供的文件,簡直是充滿了意識流文學那種隔絕人脈關係的味道,對各個模組、Libraries 的用法,對編譯的要求只能憑主觀感覺與經驗行事,實在令人感到有點百丈金剛的滋味。

PIC006

  首先當然要在 Configurator 裏設定好 UART0,在 DefaultMode Peripherals 分頁內把 UART0 打剔便可,不過打剔後,UART0 便變了紅色,似乎設定失敗了!看看右邊的 Properties 分頁,發覺 BAUD Rate 是 0,把鼠標移到紅色交叉上面按一下,發下面 status bar 寫了一句提示 Timer 1 必需設為 8-bit 的 Auto Reload mode ,Timer switch 1 必需設成 start,才能令 UART0 正常操作。

PIC007

  於是便把 Timer 1 的模式更正,再看看 UART0 的情況,BAUD Rate 只得 244!怎麼辦?!比 80 年代常用的 300 BAUD 都不如!應該怎改變 BAUD Rate 呢?看看 Properties 分頁,見到 Timer 1 的 Overflow Frequency 是 488Hz,看來 UART0 的 BAUD Rate 是 Timer 1 的 Overflow Frequency / 2,所以又到 Timer 1 那裏看看。

PIC008PIC009

  在 Properties of Timers 裏又分成幾個分頁,其中在 Timer 0/1 分頁中,把 Target Overflow Frequency 設定成 19200 (9600 x 2),殊不知惡夢一個接一個,這次輪到 Timer 1 的 Reload Overflow Frequency 出現了黃色感嘆號,並提示需要把 System Clock 的頻率提高。需知道 Timer 的時脈來源是 System Clock,提高 System Clock 的頻率便自自然然地提高 Timer 1 的速度,於是便返回 DefaultMode Peripherals 那處,把 Clock control 及 HFOSC (High Frequency Oscillator) 打剔,這時 HFOSC 便會運行,而時脈的速度則會由 Oscillator Frequency Divider 來控制,想把 MCU 設定為最高速度,只要把其設成 Divide by 1 便行。再點選 Clock Control,MCU 的時脈模組仍內置有 Divider 把 HFOSC 所產生的時脈降頻,所以要把 MCU 設成以全速 48MHz 運行,就要把 System Clock Source 設成 High Frequency Oscillator。

PIC010

  把這些都設定好了後,便要設定 UART0 的腳位,雖然 UART0 的腳位被固定了在 P0.4 及 P0.5,但是仍是要設定好,而且不能疏忽,否則便會死得不明不白。在中間的窗戶返回 DefaultMode Port I/O,在右邊 Peropherals 內的 UART0 側邊的 DATA 上打剔,中間窗戶的 P0.4 及 P0.5 便會變成紫色,表示腳位已經被安排用作 UART0 之用,但是 P0.4 的字體是紅色的,表示設定有錯,到現在聰明的你應該知道怎樣解決吧。

PIC011

  說到這裏,腳位及模組設定都已經差不多完成了,但仔細看看右邊 Problems 分頁內仍然有一個警告,指 Crossbar 功能仍未開啓,這個很重要,不能忽略,因為若不啓動 Crossbar 功能 UART0 便不能接上 P0.4 及 P0.5,繼而令任務失敗收場。Double click 那個黃色感嘆號把它解決罷!

PIC012

  腳位及模組終於完成設定,便可以寫 code 了,Hello World 怎樣也難不到你的,不過又怎樣導入 Libraries 呢?值得注意的是,這個 UART0 的 Library 提供了 STDIO 導向功能,在左邊 myProject 點一下,再在主菜單按 Project –> Properties,展開 C/C++ Build 點選 Project Modules,選擇 Assert、bsp 裏的 efm8_bsp 及 PeripheralDrivers 入面的 uart_0 便大功告成。

PIC013

  由於 UART0 這個 Library 有 STDIO 導向的功能,可以簡單利用 printf 及 getchar 等簡單指令來控制 UART0,但需要在 efm8_config.h 內設定把 STDIO 導向到 UART0,但是比較麻煩的是 Simplicity Studio 並不會自動生成這個檔案,唯有自己自代碼自己 gen,把下圖兩句設定儲存成 efm8_config.h,然後覆製到 Project path 內的 inc 文件夾,Prject path 通常放在用戶文件夾的 SimplicityStudio 內。

PIC014

  寫這個 main 程序就像門前執漏,一腳破網一樣,最輕鬆,但係又立即成功。不過別忘了 #include “uart0.h”,#include “efm8_config.h” 及 #include <stdio.h> 這幾句。而且要把 STDIO 導向到 UART0 之前,必需先執行 UART0_initStdio();,最後當然就是 Hello World 出場啦!

PIC015

  按錘子按鈕便可以開始編譯,檢查編譯沒有錯誤後,可按下 Flash Programmer 按鈕,把程式燒錄到 MCU 內,最後當然就是開始測試啦!付上 Tera Term 的截圖一幅,9600 baud 的 COM 5 剛收到 EFM8 傳來的 Hello World,實驗成功,各位晚安!

 PIC016

PIC017

PIC018