2020年8月28日 星期五

Silicon Labs EFM8 微控制器開發環境建置 [2.1.2]-Simplicity Studio v4 全新專案建置範例

網頁最後修改時間:2020/08/28

[1.1]網頁,開始說明如何以 Silicon Labs 的 EFM8 系列晶片(EFM8BB21F16G-QFN20)為主角,撰寫如何建置 8-bit Microcontrollers 的開發環境、如何建立專案以及如何進行韌體燒錄一系列的網頁。

此系列包含:
  • Silicon Labs Simplicity Studio 8-bit Microcontrollers 開發環境建置;
    主要說明在 Simplicity Studio 建置 Silicon Labs 8-bit Microcontrollers 開發環境時所需要的軟體的下載和安裝。
  • Keil C51 的 Silicon Labs C8051 / EFM8 開發環境建置;
    主要說明在 Keil µVision 建置 Silicon Labs 8-bit Microcontrollers 開發環境時所需要的軟體的下載和安裝。

  • 如何建立一個 Simplicity Studio 專案檔;
    • 如何匯入、修改和編譯官方(或既有的)Simplicity Studio v4 專案範例;
      說明如何匯入已有的 Simplicity Studio 專案檔,進行編譯和修改。
    • Simplicity Studio v4 全新專案建置範例;
      說明如何從頭建置一個新的 Simplicity Studio v4 專案檔。
  • 如何匯入 Simplicity Studio v4 專案檔至 Keil C51;說明如何匯入 Simplicity Studio v4 專案檔至 Keil C51,進行編譯和修改。

  • 離線與 ISP(UART)燒錄;
    燒錄 .hex 檔的說明,和使用 ISP(UART)燒錄韌體的方法。

[2.1.1]開始,連續三篇的網頁,都會用來說明 EFM8BB21F16G-QFN20 這顆晶片韌體專案的建立步驟和方法。而這一篇,是針對 Simplicity Studio v4 全新專案建立的步驟做說明。

EFM8BB21F16G-QFN20 Package Marking(not included bee icon)

/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*
本篇的專案檔,請依照此篇的說明自行建置,所需要的程式碼已附在網頁中。
/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*


*********************************************************************************
網頁所用到的開發板與燒錄模擬器:
*********************************************************************************

經過 1.1 Silicon Labs Simplicity Studio 8-bit Microcontrollers 開發環境建置 裡軟體安裝的說明,想必 Simplicity Studio v4 已經完成安裝,現在開始準備要進行 EFM8BB21F16G-QFN20 韌體專案的建立。

我將 Simplicity Studio v4 專案檔的建立分為兩個單元做說明:第一個,是以如何匯入既有的 Simplicity Studio v4 專案為主題,來說明匯入的步驟;第二個,則是以如何建立一個全新的 Simplicity Studio v4 專案為主題,從頭開始來說明建立的步驟。這兩個部分的差異不多,只有前面幾個步驟不同而已,後面的步驟就都很雷同了。

每個單元為了解講的方便,再細分為下面幾個小部份:
  • 如何匯入、修改和編譯官方(或既有的)SSv4 專案範例;
    • 匯入專案檔;
    • 變更晶片型號;
    • 創建新的硬體組態檔(.hwconf);
    • 修改硬體組態檔;
    • 韌體一鍵燒錄;
    • EFB8BB2_ExternalInterrupts 韌體測試;
  • Simplicity Studio v4 全新專案建置範例;
    • 建立新專案;
    • 修改硬體組態檔;
    • 撰寫程式碼;
    • 韌體一鍵燒錄;
    • EFM8BB21F16G-C-QFN2-_Demo01 韌體測試;
做為參考的文件有:

開始之前,先建立幾個縮寫字:
  • SSv4:代表 Simplicity Studio v4 軟體;
  • {SilabsSSv4}:代表 Simplicity Studid v4 安裝的目錄;

【Simplicity Studio v4 全新專案建置範例】

如果有看過前一篇網頁,相信這一篇也會很容易就能了解。只有前面建置專案的幾個步驟不同而已,後面就都差不多的步驟了。

這個專案參考
{SilabsSSv4}\D:\SiliconLabs\SimplicityStudio\v4\developer\sdks\8051\v4.1.7\examples\EFM8BB2_SLSTK2021A\UART\STDIO 這個範例資料夾,都是提示用戶輸入一個字元,然後把這字元轉換為 16 進位後回應給用戶。

兩者之間所不同的是:前者使用了 retargetserial 函式庫;後者採用 stdio 函式庫的 printf() 函式。

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* Create a new SSv4 Project - 建立新專案 :

桌面點擊開啟 "Simplicity Studio",在其選單點選 "Project -> Silicon Labs MCU Project...",打開 "New Silicon Labs Project" 對話視窗。

Create a new SSv4 Project - 建立新專案 - 01
進行下面的選項設定:
  • 選擇 Part: 為 EFM8BB21F16G-C-QFN20
完成設定後,應該如下圖所示。

按 "Next >" 進入到下一個畫面。

Create a new SSv4 Project - 建立新專案 - 02
選擇新增的專案型式為何?

點選 🔘 Simplicity Configuration Program,再按 "Next >" 進入到下一個畫面。

Create a new SSv4 Project - 建立新專案 - 03
專案的名稱和專案儲存的位置,如下做設定:
  • Project name:請命名為 EFM8BB21F16G-C-QFN20_Demo01
  • Location:若要使用預設的位置儲存專案,請務必勾選 ☑ Use default location 選項;否則,按 "Browse..." 選擇要儲存的資料夾位置。

按 "Next >" 進入到下一個畫面。

Create a new SSv4 Project - 建立新專案 - 04
建立專案中...

Create a new SSv4 Project - 建立新專案 - 05
一但完成新建專案後,主畫面變化如下所示。

Create a new SSv4 Project - 建立新專案 - 06

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
Create a new SSv4 Project - 修改硬體組態檔 :

新建專案的同時,也會同時新增一個與專案同名但不同附檔名的硬體組態檔(EFM8BB21F16G-C-QFN2-_Demo01.hwconf)。打開它,切換至 "DefaultMode Peripherals" 頁籤,進行如下的群組設定:
  • Clocking
    • 勾選 ☑ Clock Control
  • Communications
    • 勾選 ☑ UART 0
  • Timers
    • 勾選 ☑ Timers
    • 勾選 ☑ Watchdog Timer
Create a new SSv4 Project - 修改硬體組態檔 - 01
各週邊群組的項目選定後,開始 "DefaultMode Port I/O" 的設定;不用切換中間的頁籤,只要使用右上角 "Outline" 頁籤,就可做下面需要的屬性設定。

點選左上角 "Outline" 頁籤中的 Port I/O,下方會出現它的屬性。

設定 Enable Crossbar 為 Enabled

Create a new SSv4 Project - 修改硬體組態檔 - 02
改點選左上角 "Outline" 頁籤中的 CROSSBAR0,下方會出現它的屬性。

設定 UART 0 的 Data 為 Enabled

Create a new SSv4 Project - 修改硬體組態檔 - 03
回到剛剛週邊群組的細項屬性設定。

在 Clocking 群組,點選 Clock Select 後,做如下的屬性設定:
  • Clock Source Divider 設定為 SYSCLK / 1

Create a new SSv4 Project - 修改硬體組態檔 - 04
在 Communications 群組,點選 UART 0 後,做如下的屬性設定:
  • Serial Port Control 的 Enable Receive 設定為 Enabled

Create a new SSv4 Project - 修改硬體組態檔 - 05
在 Timers 群組,點選 Watchdog Timer 後,做如下的屬性設定:
  • WatchDog Control 的 WDT Enable 設定為 Disable

Create a new SSv4 Project - 修改硬體組態檔 - 06
同樣在 Timers 群組,點選 TIMER Setup 後,做如下的屬性設定:
  • Timer 1
    • Mode 設定為 Mode 2, 8-bit Counter/Timer with Auto-Reload
    • Clock Source 設定為 Use SYSCLK
    • Timer Switch 1:Run Control 設定為 Start

Create a new SSv4 Project - 修改硬體組態檔 - 07
繼續在 Timers 群組,點選 TIMER 0/1 後,做如下的屬性設定:
  • Timer 1 Mode 2, 8-bit Counter/Timer with Auto-Reload
    • Target Overflow Frequency 設定為 230400 (0x38400)
Create a new SSv4 Project - 修改硬體組態檔 - 08
切換中間畫面視窗的頁籤到 "DefaultMode Port I/O",然後點選晶片圖示上的 <18/P0.4> 接腳。

<18/P0.4> 接腳是作為 UART 的 TX 用,因此接腳必須設定為輸出。

在主畫面右邊中間的屬性視窗,Settings 的 IOMode 設定為 Digital Push-Pull Output

Create a new SSv4 Project - 修改硬體組態檔 - 09
改點選晶片圖示上的 <17/P0.5> 接腳。

<17/P0.5> 接腳是作為 UART 的 RX 用,因此接腳必須設定為輸入。

在主畫面右邊中間的屬性視窗,預設 Settings 的 IOMode 已設定為 Digital OpenDrain I/O,所以不需要做任何修改。

Create a new SSv4 Project - 修改硬體組態檔 - 10
到此就完成專案的硬體組態檔的設定。



還記得這個專案所參考的,是原本使用 retargetserial 函式庫來處理 UART 通訊的程式,只不過新建專案時不想沿用,而改用其他的方式來實現。由於新專案使用 UART 0,所以可以直接使用 printf() 的方式來做 UART 的輸出,但若是改用其他的 UART 就可能不適用了。這時就需要自己去處理這些輸入和輸出的字元或字串。

retargetserial 函式庫封裝了這些處裡的細節,要做為學習參考或是直接使用都是不錯的選擇,因此順手介紹這個函式庫,說明要怎麼引入和要到哪裡找。

首先在軟體主畫面左邊,滑鼠右鍵點擊 "Project Explorer" 下專案名稱 EMB8BB21F16G-C-QFN20_Demo01,下拉選單選擇 "Properties"

開啟專案的屬性視窗後,左邊選擇 "C/C++ Build -> Project Modules",然後在 8051 -> EFM8 -> BSP 下勾選 ☑ Efm8 Retargetserial (v4.1.7.0_-2129476106)

"Apply" 應用變更(或按 "OK" 儲存設定並關閉視窗)。

Create a new SSv4 Project - 修改硬體組態檔 - 11
左邊切換選擇 "C/C++ Build -> Path and Symbols",選擇 Assembly 可以看到 retargetserial 函式庫的路徑已經加入。

Create a new SSv4 Project - 修改硬體組態檔 - 12
之後如果需要修改這些路徑的設定,只要按下 "Edit..." 就會開啟視窗讓用戶做修改。

Create a new SSv4 Project - 修改硬體組態檔 - 13
接著變更選擇 GNU C,同時可以看到 retargetserial 函式庫的路徑也被加入。

"OK" 儲存並離開專案屬性設定對話視窗。

Create a new SSv4 Project - 修改硬體組態檔 - 14
一但變更這些路徑,請重新編譯專案,否則就無法反映這些路徑的變更。

按 "Yes" 重新編譯專案。

Create a new SSv4 Project - 修改硬體組態檔 - 15
整個 SSv4 專案規劃就如下圖左邊所示。

Create a new SSv4 Project - 修改硬體組態檔 - 16

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
Create a new SSv4 Project - 撰寫程式碼:

請複製下面的程式碼,取代原來的 EFM8BB21F16G-C-QFN2-_Demo01.c 裡面的程式碼。

EFM8BB21F16G-C-QFN2-_Demo01.c
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// Program Description:
//
// This program demonstrates how to configure the EFM8BB2 to use routines
// in STDIO.h to write to and read from the UART0 interface.  The program
// reads a character using the STDIO routine getchar(), outputs that character
// to the screen, and then outputs the ASCII hex value of that character.
//
// Resources:
//   SYSCLK - 24.5 MHz HFOSC0 / 1
//   UART0  - 115200 baud, 8-N-1
//   Timer1 - UART0 clock source
//   P0.4   - UART0 TX
//   P0.5   - UART0 RX

//=========================================================
// src/EFM8BB21F16G-C-QFN20_Demo01_main.c: generated by Hardware Configurator
//
// This file will be updated when saving a document.
// leave the sections inside the "$[...]" comment tags alone
// or they will be overwritten!!
//=========================================================

//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <SI_EFM8BB2_Register_Enums.h>                  // SFR declarations
#include "InitDevice.h"
// $[Generated Includes]
#include <stdio.h>
// [Generated Includes]$

//-----------------------------------------------------------------------------
// SiLabs_Startup() Routine
// ----------------------------------------------------------------------------
// This function is called immediately after reset, before the initialization
// code is run in SILABS_STARTUP.A51 (which runs before main() ). This is a
// useful place to disable the watchdog timer, which is enable by default
// and may trigger before main() in some instances.
//-----------------------------------------------------------------------------
void SiLabs_Startup (void)
{
 // $[SiLabs Startup]
 // [SiLabs Startup]$
}

//-----------------------------------------------------------------------------
// main() Routine
// ----------------------------------------------------------------------------
int main (void)
{
 uint8_t inputCharacter;  // Used to store character from UART

 // Call hardware initialization routine
 enter_DefaultMode_from_RESET();

 SCON0_TI = 1;                   // This STDIO library requires TI to
                                       // be set for prints to occur
  
 while (1)
 {
  // $[Generated Run-time code]
  printf( "\nEnter character: " );
  inputCharacter = getchar();
  printf( "\nCharacter entered: %c", inputCharacter );
  printf( "\n     Value in Hex: %bx", inputCharacter );
  // [Generated Run-time code]$
 }
}

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
Create a new SSv4 Project - 韌體一鍵燒錄:

按下紅色框框處的鐵鎚圖示進行編譯。

鐵鎚旁邊的小按鈕裡面包含兩個選項:"... - debug"和 "... - release" 都可以用來編譯,只不過在不需要做除錯的情況之下,直接採用 "... - release" 選項進行編譯就可以。

如果一切正常,將會輸出類似下面的編譯訊息。

Create a new SSv4 Project - 韌體一鍵燒錄 - 01
** 請務必在進行燒錄之前將燒錄模擬器與開發板連接好,並插上電腦!

SSv4 軟體主畫面中,按 "Flash Programmer" 開始進行韌體燒錄。

Create a new SSv4 Project - 韌體一鍵燒錄 - 02
選擇編譯之後產生的 hex 檔(這裡指的就是 EFM8BB21F16G-C-QFN20_Demo01.hex),選定之後的 hex 檔會顯示在 "Flash Progrmmer" 的 File 欄位。

燒錄之前要先清除晶片裡面的韌體資料,所以 "Erase" 要先執行一次,之後如果 "Program" 按鈕不能用,那就關閉後再重啟 "Flash Programmer" 一遍,就能使用。

Create a new SSv4 Project - 韌體一鍵燒錄 - 03
完成晶片記憶體的擦除之後,按下 "Program" 進行燒錄。

Create a new SSv4 Project - 韌體一鍵燒錄 - 04
燒錄成功後,按下 Close 關閉視窗,現在可以開始準備硬體測試了!


/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
Create a new SSv4 Project - EFM8BB21F16G-C-QFN2_Demo01 韌體測試:

要進行韌體測試,請預先好準備 USB 轉 TTL 模組或 USB 轉 RS232 線。

根據 EFM8BB21F16G-C-QFN2_Demo01.c 裡面的說明,

// Program Description:
//
// This program demonstrates how to configure the EFM8BB2 to use routines
// in STDIO.h to write to and read from the UART0 interface.  The program
// reads a character using the STDIO routine getchar(), outputs that character
// to the screen, and then outputs the ASCII hex value of that character.
//
// Resources:
//   SYSCLK - 24.5 MHz HFOSC0 / 1
//   UART0  - 115200 baud, 8-N-1
//   Timer1 - UART0 clock source
//   P0.4   - UART0 TX
//   P0.5   - UART0 RX

第一種測試方式是使用 USB 轉 TTL 模組,直接將 USB 轉 TTL 模組的接腳,與 EFM8BB2 學習開發板兩邊的晶片接腳相連接即可,電源也使用 USB 轉 TTL 模組的不用外接;此方法不需要用到開發板上的 RS232 晶片。

兩者之間的接線,如下表所示:
EFM8BB21F16G-QFN20 接腳名稱USB 轉 TTL 模組
<P0.4>(UART0 TX)<Rx>
<P0.5>(UART0 RX)<Tx>
<+5V><+5V>
<GND><GND>

第二種測試方式是使用 USB 轉 RS232 線,不過這需要預先將 EFM8BB2 學習開發板上的 RS232 晶片的 <TxD> 和 <RxD> 接腳預先連接到 <P0.5><P0.4>,然後接上 USB 轉 RS232 線到開發板上的 DB9 接頭,才能進行測試。

兩者之間的接線,如下表所示:
EFM8BB21F16G-QFN20 接腳名稱週邊接腳名稱
<P0.4>(UART0 TX)<RxD>
<P0.5>(UART0 RX)<TxD>

開啟電腦的測試軟體,按下開發板上的 RESET 按鈕,然後輸入 A,輸入/輸出的情況就如下圖所示。

程式執行輸出結果

【結論】

本篇,說明了從頭建立一個 SSv4 專案檔的步驟和方法。對於初學者來說,建議使用上一篇匯入專案的方式,來學習與熟悉 EFM8BB21-C-QFN20 晶片韌體程式的開發,這會比從頭建立一個專案檔更容易上手。有任何不懂的地方,官方有提供論壇和豐富的資料文件與應用筆記可供交流、詢問、參考與查閱。

SSv4 支援多種軟體的專案檔匯入,除了 Simplicity Studio 和 Keil C51 專案檔外,其餘沒說到的專案檔匯入步驟和方法,請自行參考官方文件或網路上的教學。


<< 部落格相關文章 >>

.
.

沒有留言:

張貼留言

留言屬名為"Unknown"或"不明"的用戶,大多這樣的留言都會直接被刪除掉,不會得到任何回覆!

發問問題,請描述清楚你(妳)的問題,別人回答前不會想去 "猜" 問題是什麼?

不知道怎麼發問,請看 [公告] 部落格提問須知 - 如何問問題 !