2020年8月10日 星期一

nuvoTon(新唐)8bit 8051 微控制器開發環境建置 [2]-如何建立一個全新的 Keil 專案檔(以新唐 N76E003 晶片為例)

網頁最後修改時間:2020/08/10
上一篇,開始說明如何在 Keil µVision 5 建立 nuvoTon(新唐) 8-bit 8051 MCU(微控制器)的韌體開發環境,主要分為下面幾個部分:
  1. Keil C51 開發環境建置所需軟體安裝;
    主要說明建置開發環境時所需要的軟體的下載和安裝。
  2. 如何建立一個全新的 Keil 專案檔(以新唐 N76E003 晶片為例);
    包含樣本檔的建立、一鍵燒錄設定和除錯設置等...。
  3. 離線和 ISP(UART)燒錄;
    NuMicro ICP Programming Tool 燒錄 .hex 檔的說明,和使用 ISP(UART)燒錄韌體的方法。
這一篇是此系列的第二篇,主要的目的是要利用上一篇安裝好的新唐 8051 微控制器開發所需要的軟體後,在 Keil 創建專案的同時,順手設定好相對應的專案參數選項。如此,就能在  Keil C51 順利編譯、一鍵燒錄和硬體除錯。

N76E003AT20 晶片, source: direct.nuvoton.com

/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*
有購買商品的使用者,網頁中用到的相關資料已放置於雲端硬碟,請自行下載使用!
其餘的使用者,請自行依照提供之連結下載相關資料,程式碼複製貼上使用!

/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*


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

經過前一篇軟體的安裝,Keil C51 現在已支援新唐的 8051 系列微控制器,如今要建立一個專案並不困難。

要完成本篇的目的,有下面幾個工作需要被完成:
  • 下載 N76E003 開發板支援套件(BSP, Board Support Package)
  • 建立專案資料夾目錄結構;
  • 建立 Keil 專案(Create a new µVision project)
  • Keil 專案項目設定(Manage project items)
  • Keil 專案目標選項設定(Options for target)
  • Keil 專案編譯與程式燒錄;
    • 撰寫 LED Blink 程式碼;
    • 改寫 LED Blink 為低態觸發;
開始之前,先定義兩個縮寫字:
  • {BSP}:代表 N76E003_BSP_Keil_C51_V1.0.6 資料夾路徑;
  • {Template}:代表 N76E003_Template 資料夾路徑;

【下載 N76E003 開發板支援套件】

新唐有提供 N76E003 的 BSP(Board Support Package, 開發板支援套件)方便用戶程式開發使用,它類似於 Arduino 的函式庫,可加快開發和減少用戶開發時翻閱資料手冊的時間,讓用戶能更專注於的開發上。

下載的網頁和網址:
N76E003 軟體下載頁
下載(檔名為 N76E003_BSP_Keil_C51_V1.0.6.zip)後,解壓縮檔案到所要的目錄中。

資料夾目錄結構如下圖所示,其中:
  • Common\
    包含時間延遲和基本 UART 鮑率設定的常用子函式,大多是 .c 檔的格式。
  • Include\
    存放所有標頭檔和定義的地方。
  • Sample_Code\
    N76E003 晶片的官方參考範例程式。
    N76E003 ADC / PWM / SPI / I2C 等...各功能函數怎麼使用?程式碼怎麼撰寫?這裡有很多範例程式可參考。
  • Startup\
    放置啟動檔案(Startup file)的資料夾,也就是 STARTUP.A51
  • RM_N76E003 CMSIS BSP Guide v1.06.pdf
    BSP 資料夾各目錄和 Sample_Code 裡各範例程式的說明。
N76E003 開發板支援套件資料夾目錄結構
建立一個新專案的同時,我們會用到 BSP 提供的這些目錄和目錄中的檔案,來建立基本的專案資料夾,並根據此資料夾的目錄結構,設定 Keil 專案的檔案群組和選項。只有設定好這些與專案相關的路徑與檔案,專案才能正確地被編譯、燒錄和除錯。

【建立專案資料夾目錄結構】

建立一資料夾(命名為 N76E003_Template),裡面結構如下:

N76E003_Template 資料夾目錄樹狀結構
然後進行下面複製貼上的動作:
  1. 複製 {BSP} 的 Common 和 Include 兩個資料夾到 {Temprate}\Libraries\FWLib\ 資料夾下面;
  2. 複製 {BSP}\Startip 資料夾裡的檔案 STARTUP.A51 到 {Temprate}\Startup\ 資料夾中;
  3. {BSP}\User 資料夾中建立一個 main.c 檔案;
到這裡就算是已經完成基本的專案資料夾的建立。每次建立新專案的時候,都可以把上面的這個資料夾,整個複製後改名成想要的名稱後做使用;也就是說這是一個全新未經過任何設定的專案用資料夾,裡面的專案設定什麼的都是空的。

【建立 Keil 專案】

有了專案資料夾之後,開啟 Keil µVision5 準備建立一個新的 Keil 專案。

點選 "Project \ New µVision Project..."

立 Keil 專案 - 01
儲存專案檔在專案資料夾 {Template}\Project\ 下,並命名為 N76E003_Template

建立 Keil 專案 - 02
專案建立的同時,在 {Template}\Project 資料夾下會同時再產生兩個目錄:Listings 和 Objects,用於放置編譯時所產生的檔案。

燒錄所需要的 .hex 檔,編譯後會新增到 {Template}\Project\Objects 資料夾中,燒錄時要到這個地方找。

Listings 和 Objects 資料夾裡面的檔案,在需節省磁碟空間的時候,可以完全刪除掉這兩個資料夾裡的檔案,只留下 .hex 檔。

建立 Keil 專案 - 03
接著,由 "Device" 頁籤上面的下拉選單中,選擇 "Nuvoton 8051 Devices",下方的晶片型號選擇 N76E003

按 "OK" 進入到下一個畫面。

建立 Keil 專案 - 044 
由於 STARTUP.A51 是從 {BSP} 複製過來,所以不需要由 µVision 再做複製的動作。

按 "否(N)" 儲存專案並離開。
建立 Keil 專案 - 05
至此,專案基本上已經建立。接下來要做的就是,把專案資料夾中的標頭檔 *.h 和來源檔 *.c ,分別設定到專案目標選項和專案項目中,然後再把燒錄、模擬和除錯相關參數指定對,那麼就完成了整個專案的設定了。

【Keil 專案項目設定】

滑鼠左擊 Target 1 選擇 "Manage Project Items",開啟專案項目管理視窗。

Keil 專案項目設定 - 01
相關欄位值修改如下:
  • Project Targets: 欄位值修改為 N76E003_Template
  • Groups: 欄位下面新增 StartupUser Common 三個群組;
  • Files: 欄位下對應的是前面 Groups: 選擇之後對應包含的檔案,可由下面 "Add Files..." 加入檔案;
    •  Startup 選擇加入 {BSP}\Startup\STARTUP.A51
      檔案類型選擇 Asm Source file (*.s;*.src;*.a*)
    • User 選擇加入 {BSP}\User\main.c
    • Common 選擇加入 {BSP}\Common 下的 Common.cDealy.c
Keil 專案項目設定 - 02
Keil 專案項目設定 - 03
Keil 專案項目設定 - 04
Keil 專案項目設定 - 05


完成專案項目的設定後,整個專案項目目錄就如下圖所示。

Keil 專案項目設定 - 06

【Keil 專案目標選項設定】

滑鼠左擊 N76E003_Template,下拉選單選擇 "Options for Target 'N76E003_Template'..."

Keil 專案目標選項設定 - 01
點選 "C51" 頁籤,按下下方 Include Paths 欄位右邊的 "..." 按鈕,會出現一個添加路徑的對話框。

新增一個路徑欄位,再點選旁邊的按鈕加入 {Template}\Libraries\FWlib\Include 資料夾路徑。

要特別注意的是:Keil 只會在同一層的資料夾中搜尋,如果該資料夾下面還有子目錄的話,路徑一定要往下添加到最後一層子目錄中。

最後按 "OK" 回到上一個畫面。

Keil 專案目標選項設定 - 02
接著定義 CPU 的頻率。由於是使用內建的時脈產生,所以設定為 16 MHz(FOSC_160000)。

如果之後要使用除錯的話,則 Code Optimization 的 Level: 請改選 4: Register variables

** 如果要先儲存剛剛設定的參數的話,請按下 "OK" 再重新開啟專案目標選項設定的對話視窗,要不就直接切換到其他頁籤繼續做設定。

Keil 專案目標選項設定 - 03
點選 "Output" 頁籤,勾選  [✔]Create HEX File 或如下圖所示。

"Select Folder for Objects..." 預設使用的輸出目錄為 {Template}\Project\Objects,若沒有特別需求的話,維持預設值即可。

Keil 專案目標選項設定 - 04
點選 "Debug" 頁籤,點選右方的 Use 並選定 Nuvoton 8051 Keil C51 Driver 或如下圖所示。

Keil 專案目標選項設定 - 05
最後點選 "Utilities" 頁籤,點選右方的 Use Target Driver for Flash Programming 並選定 Nuvoton 8051 Keil C51 Driver 或如下圖所示。

按 "OK" 儲存所有設定後離開。

Keil 專案目標選項設定 - 06
有一點在設定時要特別注意,也就是在按下 "OK" 離開之前,所有的設定都是沒有儲存的!所以只要中間步驟有中斷掉,全部都要重來一遍。所以,除非有信心能把上面設定一次做好,否則建議每做好一個頁面的設定後,就按下 "OK" 儲存後離開再重新進入做設定。

/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*
關於燒錄器更詳細的使用方式,以及像是在 IAR 和 CooCox CoIDE 使用的設定,可參考新唐官網的 Nu-Link 的用戶手冊,它裡面有說明,這跟套件中所使用的燒錄模擬器是相容的。
nuvoTon Nu-Link 官方網頁
用戶手冊 V1.01 [中文] [英文]
/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*


【Keil 專案編譯與程式燒錄】

如果上面關於專案的設定都做得正確的話,接下來就只剩下撰寫 main.c 的程式碼了。

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* 撰寫 LED Blink 程式碼:

複製 / 貼上下面的程式到 main.c
N76E003_Template, main.c
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h"

const bit ON   = 1;
const bit OFF  = 0;

sbit Led = P1^2; // method 01
// sbit LED = P12; // method 02

void main() {
    Set_All_GPIO_Quasi_Mode; // Defined in Funciton_define.h
 
    while(1) {
 //** on 100, off 1000
 Led = ON;
        Timer0_Delay1ms(100);        
        Led = OFF;
        Timer3_Delay100ms(10);
    }
}

其中,
  • line  1 ~  5:基本上,這 5 個標頭檔,就是撰寫 N76E003 韌體基本需要的文件;
  • line  7 ~  8:這兩個常數是作為 LED亮滅指定用的;
  • line       10:定義板載 LED 的位址;
  • line       14:設定 N76E003 的接腳為近似雙向模式(Quasi-bidirectional);
  • line 18 ~ 21:ON 100ms, OFF 1000ms;
按下 Keil µVision 畫面左上角的按鈕(兩顆都可以按)開始編譯。

撰寫 LED Blink 程式碼 - 01
下方輸出欄中,除了警告(Warning)之外,沒有任何錯誤!所以還是會產生一個 HEX 檔案在 {Template}/Project/Objects 資料夾中(檔案名稱為 N76E003_Template.hex),這個檔案是可以燒錄到 N76E003 晶片中的。

撰寫 LED Blink 程式碼 - 02
這個 WARNING L16 的警告,是因為有函式沒有被呼叫到所導致,但是不影響 HEX 檔的生成,不過會佔掉一些空間,接下來就先來解決這個問題。

撰寫 LED Blink 程式碼 - 03

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* 解決 *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS:

下面是在網路上面找到的解決方法,可以去除 WARNING L16 的警告出現,並恢復被多佔據的空間。

滑鼠左擊 N76E003_Template,下拉選單選擇 "Options for Target 'N76E003_Template'..."

切換到 "Device" 頁籤,勾選 [✔] Use Ectended Linker (LX51) instrad of BL51

"OK" 可以先不按。

WARNING L16 解決方法 - 01
切換到 "LX51 Misc" 頁籤,在 Misc controls 欄位填入 REMOVEUNUSED,然後按 "OK" 儲存後離開。

WARNING L16 解決方法 - 02
"Rebuild" 重新進行編譯。

可以發現,編譯輸出中沒有再出現 WARNING L16 警告了,而且編譯後的大小也小了很多。

WARNING L16 解決方法 - 03
燒錄當然也不會有什麼問題!

不過燒錄之前請先接好燒錄模擬器和開發板(如下圖所示),否則除錯、模擬和燒錄都不會動作!

燒錄模擬器與 N76E003 系統板接線示意圖
WARNING L16 解決方法 - 04

/*--*//**---/*///**---*-*////***--*/*///***----*///--*/*///**--*/*//**--**/*//
* 改寫 LED Blink 為低態觸發:

由於一開始忘記板載的 LED 是採用低態觸發的,因此燒錄好韌體之後的 LED 亮滅是反向的。

下面的程式碼是改寫 LED 為低態觸發的程式碼,請複製貼上後重新編譯再燒錄
N76E003_Template, main.c
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h"

const bit OFF   = 1;
const bit ON    = 0;    // active low

sbit Led = P1^2; // method 01
// sbit LED = P12; // method 02

void main() {
    Set_All_GPIO_Quasi_Mode; // Defined in Funciton_define.h
 
    while(1) {
 //** on 100, off 1000
 Led = ON;
        Timer0_Delay1ms(100);        
        Led = OFF;
        Timer3_Delay100ms(10);
    }
}

紅色框是主要改寫的部分。

按 "Rebuild" 重新進行編譯。

改寫 LED Blink 為低態觸發 - 01
"Download" 重新下載。

改寫 LED Blink 為低態觸發 - 02
一但完成韌體的燒錄後,按一下開發板上的 RESET 按鈕,板子上面的 LED 就會重複循環的亮 100ms 滅 1000ms,恢復正常動作了。

【結論】

雖然這一篇沒有說到任何撰寫程式的技巧,但是已經把程式撰寫的環境佈置好了,只要之前有過 8051 單晶片的開發經驗,N76E003 只不過就是多了其他週邊功能的加強板的 8051 單晶片而已,語法上沒什麼太大不同,加上其 {BSP} 中有很多的程式範例可供學習參考,相信各位聰明的看倌,要學的話很快就能學會!


<< 部落格相關文章 >>
.
.

2 則留言:

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

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

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