在Arduino IDE使用Nuvoton NUC131 Series BSP

既然新唐科技所推出的NuMaker Uno能夠在Arduino IDE開發,並且能夠使用Arduino的語法來撰寫程式,這表示我們在Board Manager安裝開發板時已經把compiler、BSP一併安裝好了。所以在Arduino IDE除了Arduino的語法及函式,我們還可以使用新唐所提供之BSP,就如同我們使用Arduino UNO(ATmega328P)時,可以直接在程式碼當中直接變更暫存器當中的資料一樣。
還沒設定過的可以參考前篇: https://danchouzhou.blogspot.tw/2017/08/nuvoton-numaker-unoarduino-ide.html
那麼直接使用BSP有甚麼好處呢?
舉例來說在使用Arduino UNO時可能會遇到"Arduino預先幫我們設定好的東西不是我們所預期的",好比說ADC的取樣率不夠快、PWM的頻率需要調整、希望整個PORT可以同一時間輸出一筆資料等等,這些都可以直接修改暫存器去達成。同樣地我們在使用NuMaker Uno時原先設定好的值不見得是我們所預期的,或者與原先一些library、code沒有百分百相容,此時我們就需要修改或新增一些程式碼去達成、去做修正。

Nuvoton的BSP有提供哪些東西?
在這邊我們可以先到官網的支援中下載NUC131_Series_BSP_CMSIS_V3.00.002.zip
http://www.nuvoton.com/hq/support/tool-and-software/software/

解壓縮之後會看到三個資料夾分別是Document、Library、SampleCode及一個Readme文件。
Document中有一個NUC131 BSP的參考資料。
Library裡面包含ARM的CMSIS(Cortex Microcontroller Software Interface Standard)、Memory Map(Device)及StdDriver。
而SampleCode主要包含用修改暫存器來撰寫的程式範例(RegBased)、使用StdDriver所撰寫的程式範例(StdDriver)。

其Memory Map就是定義周邊裝置(指ADC、Timer、PWM、UART等)暫存器的記憶體位址,而StdDriver則是把修改暫存器的程式碼包成副程式讓使用者可以從字面上的意思或閱讀參考文件得知執行哪些副程式完成暫存器的變更後會得到甚麼樣的功能,減少閱讀datasheet、技術文件的時間。

我們來實做看看,首先準備一張NuMaker Uno然後連接上電腦
我們一般要讓LED每一秒鐘明滅一次通常會這麼做
#define LED 13

void setup()
{
  pinMode(LED, OUTPUT);
}

void loop()
{
  digitalWrite(LED, HIGH);
  delay(1000);
  digitalWrite(LED, LOW);
  delay(1000);
}

我們也可以使用BSP當中的Driver直接寫成
#define LED PB13

void setup()
{
  GPIO_SetMode(PB, BIT13, GPIO_PMD_OUTPUT);
}

void loop()
{
  LED=1;
  delay(1000);
  LED=0;
  delay(1000);
}

用Driver當中提供的函式來簡化程式碼
void setup()
{
  GPIO_SetMode(PB, BIT13, GPIO_PMD_OUTPUT);
}

void loop()
{
  GPIO_TOGGLE(PB13);
  delay(1000);
}

甚至Serial的功能也可以用BSP來達成
uint8_t text[] = "NuMaker test!\n\r";

void setup()
{
  SYS_UnlockReg();
  CLK_EnableModuleClock(UART0_MODULE);
  CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));
  SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk);
  SYS->GPB_MFP |= (SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD); //將多功能腳PB0及PB1設置為UART RX及TX
  SYS_LockReg();

  SYS_ResetModule(UART0_RST);
  UART_Open(UART0, 115200); //初始化UART0

  GPIO_SetMode(PB, BIT13, GPIO_PMD_OUTPUT); //將PB13設為輸出腳位
}

void loop()
{
  UART_Write(UART0, &text[0], 15);
  GPIO_TOGGLE(PB13);
  delay(1000);
}

留言

這個網誌中的熱門文章

無法被取代的指針型三用電表(一):前言

關於新唐科技NuMicro ISP的介紹和使用方式

新唐火神板開箱實作(一):NuMaker-Volcano與NuEclipse IDE入門篇