Upload
ardhiyan-akhsa
View
226
Download
20
Embed Size (px)
Citation preview
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
Modul 1: Konsep I/O pada NUC1XX series
Tujuan Memahami konsep Luaran/Masukan (I/O) pada mikrokontroler ARM Cortex M0 NuMicro
1XX Series (NUC140VE3CN)
Pendahuluan NUC1XX series adalah ARM Cortex -mikrokontroler dengan M0 core didalamnya yang
cocok digunakan untuk kontrol industri dan aplikasi yang membutuhkan fungsi komunikasi
khusus. Cortex -M0 adalah prosesor ARM terbaru dengan kinerja 32-bit dengan biaya yang
setara dengan mikrokontroler 8-bit.
NuMicro Seri NUC100 memiliki inti ARM Cortex M0 yang tertanam dengan kecepatan
hingga 50 MHz, dilengkapi dengan memori flash untuk program 32K/64K/128Kbyte.,
SRAM sebesar 4K/8K/16K-byte dan memori flash loader untuk ISP (In System
Programming) sebesar 4K-byte. Selain itu juga dilengkapi dengan berbagai macam periferal,
seperti GPIO, Timer, Watchdog Timer, RTC, PDMA, UART, SPI/MICROWIRE, I2C, I2S,
PWM, LIN, CAN, PS2, USB 2.0 FS Device, ADC 12-bit, komparator analog, Low Voltage
Reset dan Brown-out Detector. Gambar 1 menunjukkan diagram blok dari NuMicro
NUC130/140 Series.
Gambar 1. Diagram Blok NuMicro NUC130/140 Series
NUC140 Learning Board Board ini menggunakan catudaya 5V, yang dapat diperoleh dari konektor USB ataupun
melalui konektor catudaya adaptor. Tegangan ini langsung menjadi VDD untuk chip
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
NUC140VE3CN, sehingga perlu diperhatikan tegangan input ini maksimal adalah 5.5V
(menurut datasheet NUC140).
Pada board terdapat juga catudaya teregulasi 3.3V menggunakan chip LM1117. Tipe chip
regulator ini tidak dinyatakan dalam skematik. Tegangan dari Powerjack 3 pin dan konektor
USB dilewatkan melalui dioda sehingga aman dari kesalahan polaritas pemasangan, namun
tidak melindungi dari kerusakan jika tegangan masuk melebihi 5.5V. Gambar 1 menunjukkan
layout NUC140 Learning Board. Sedangkan Tabel 1 menunjukkan penggunaan pin pada
Learning Board tsb.
Gambar 1. Layout NUC140 Learning Board dari Nuvoton
Tabel 1. Konfigurasi Sistem pada NuMicro 1XX series Development Board
Blok Pin Fungsi
ICE Bridge Nu-Link ICE_CLK
ICE_DATA
Antarmuka SWD
UART GPB0
GPB1
Rx UART0
Tx UART0
Pushbutton GPB15 GPB15 INT0
CAN GPD6
GPD7
Rx CAN0
Tx CAN0
GPB12-13 CAN transceiver speed
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
Blok Pin Fungsi
WAU8822 Codec GPC0
GPC1
GPC2
GPC3
GPA15
I2SLRCLK
I2SBCLK
I2SDI
I2SDO
I2SMCLK
GPA8
GPA9
I2C0 SDA
I2C0 SCL
GPE14 Line out Enable/Disable
GPE15 Line in Enable/Disable
LIN GPB4
GPB5
Rx UART1
Tx UART1
GPB6 LIN transceiver wakeup
GPB7 LIN transc. Enable/Disable
7-Seg LED GPE0-7 Baris
GPC4-7 Kolom
LCD Panel Dot Matrix GPD8
GPD9
GPD10
GPD11
SPI3 SS30
SPI3 SPCLK
SPI3 MISO0
SPI3 MOSI0
GPD14 Lampu latar LCD
Potensiometer GPA7 Antarmuka ADC
Buzzer GPB11 PWM4
Keypad matrix GPA0-5 GPIO
Reset RESET Reset
EEPROM GPA10
GPA11
I2C1 SDA
I2C1 SCL
Slot SD card GPD12 Catudaya SD card
GPD13 Deteksi SD card
GPC8-11 Antarmuka SD card
Flash GPD0
GPD1
GPD2
GPD3
GPD4
GPD5
SPI2 SS20
SPI2 SPCLK
SPI2 MISO0
SPI2 MOSI0
SPI2 MISO1
SPI2 MOSI1
LED GPA12
GPA13
GPA14
PWM0
PWM1
PWM2
GPC12-15 GPIO
Perangkat Lunak Kompilasi
Untuk membuat sebuah proyek aplikasi menggunakan ARM Cortex-M0 dari NuMicro
Nuvoton NUC1XX series, dapat digunakan CooCox IDE.
Berikut langkah yang digunakan dalam membuat sebuah project baru dengan menggunakan
CooCox IDE:
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
1. Klik menu Project New Project lalu tulis nama proyek aplikasi yang akan dibuat dan tentukan lokasi penyimpanan project tersebut. Setelah itu klik finish;
2. Lalu klik Nuvoton dan pilih jenis mikrokontroler NUC140VE3CN;
3. Kemudian akan muncul jendela repository. Pada bagian ini dapat dipilih pustaka components yang akan digunakan;
4. Kemudian buka file main.c pada bagian jendela project. Pada main.c inilah dapat ditulis kode program yang akan digunakan pada mikrokontroler Nuvoton;
5. Untuk mengkompile program klik menu Project build atau tekan F7;
6. Untuk mendownload program yang telah ditulis, klik Flash Program Download.
Latihan 1. Menyalakan LED
Pada NuMicro Development Board tersedia LED yang terhubung pada GPCC12 sampai
GPC15. Pada program untuk menyalakan LED digunakan fungsi DrvGPIO_SetPortBits
untuk membuat port GPIO bernilai HIGH dan LOW tertentu pada bit-bitnya.
Untuk membuat program, klik panel repository lalu pilih M0 Cmsis Core, Cmsis Boot,
System definition, SYS, dan GPIO.
Lalu ketik listing program berikut:
#include "DrvSYS.h"
#include "DrvGPIO.h"
void delay_loop(void)
{
uint32_t i,j;
for(i=0;i
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
/* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */
for(i=12;i
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
Gambar 2. Konfigurasi RGB LED pada NuMicro 1XX series Development Board
Buatlah program untuk menyalakan LED RGB tersebut dengan menuliskan listing program
berikut pada program utama yang telah anda buat pada latihan 1.
DrvGPIO_SetPortBits(E_GPA, 0x0000);
delay_loop();
DrvGPIO_SetPortBits(E_GPA, 0x1000);
delay_loop();
DrvGPIO_SetPortBits(E_GPA, 0x2000);
delay_loop();
DrvGPIO_SetPortBits(E_GPA, 0x3000);
delay_loop();
DrvGPIO_SetPortBits(E_GPA, 0x4000);
delay_loop();
DrvGPIO_SetPortBits(E_GPA, 0x5000);
delay_loop();
DrvGPIO_SetPortBits(E_GPA, 0x6000);
delay_loop();
DrvGPIO_SetPortBits(E_GPA, 0x7000);
delay_loop();
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
Modul 2: Seven Segment
Tujuan Memahami konsep Input Output yang digunakan pada Seven Segment yang terdapat di
NuMicro 1XX Series Development Board
Pendahuluan Pada NuMicro 1XX series development board terdapat 4 buah Seven Segment yang terdapat
pada PORT GPE.0-7 sebagai Row dan GPC.4-7 sebagai column. Untuk menggunakan Seven
Segment ini, pengguna perlu memasukkan Seven_Segment.h dan Seven_Segment.c kedalam
program.
Pada program, pengguna dapat menggunakan syntax show_seven_segment(column,row)
untuk menampilkan karakter pada Seven Segment. Karena Seven Segment tersebut
terhubung dengan Multiplexer terlebih dahulu sebelum masuk ke mikrokontroler, maka
pengguna harus mematikan Multiplexer terlebih dahulu sebelum memulai perintah
selanjutnya dengan syntax close_seven_segment()
Gambar 3 berikut ini menunjukkan konfigurasi Seven Segment pada NuMicro 1XX series:
Latihan-1: Lengkapi listing program dibawah ini
void delay_loop(void)
{
uint32_t i,j;
for(i=0;i
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
while(1)
{
for(i=0;i
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
Modul 3. Penggunaan LCD
Tujuan - Praktikan memahami penggunaan LCD pada mikrokontroler ARM Cortex M0
NuMicro 1XX Series
Pada development board NUC 1XX series terdapat sebuah DOT MATRIX LCD Pannel
Gambar 3 berikut konfigurasi dari LCD tersebut:
Gambar 3. Konfigurasi Dot Matrix LCD NuMicro 1XX series Development Board
Latihan-1: Contoh program antarmuka LCD
Untuk menggunakan LCD tersebut, pengguna perlu memanggil sebuah library, yaitu:
LCD_Driver.h.
Untuk menambahkan library tersebut, klik menu Project>>Configuration. Lalu
pada bagian include path tambahkan library LCD_Driver.h dengan cara mengarahkannya ke
folder tempat library tersebut disimpan.
Kemudian tambahkan file LCD_Driver.c dan Ascii_Table.c pada bagian project
dengan cara klik kanan folder nama project anda lalu add linked file. Kemudian masukkan
file-file tersebut.
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
Setelah semua file dan library tersebut dimasukkan, tuliskan listing program berikut
pada main.c
#include "NUC1xx.h"
#include "DrvSYS.h"
#include "DrvGPIO.h"
#include "LCD_Driver.h"
void delay_loop(void)
{
uint32_t i,j;
for(i=0;i
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
while(1)
{
if (DrvGPIO_GetBit(E_GPB, 15)==0)
{
clr_all_pannal();
print_lcd(0, "Button Test.. ");
print_lcd(1, "OK.....");
print_lcd(2, "ELINS * 2012 Yes");
}
else
{
clr_all_pannal();
print_lcd(1, "Tekan Button...");
}
}
}
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
Modul 4: Penggunaan Keypad Matrix 3x3
Tujuan - Praktikan memahami penggunaan keypad matrix 3x3 pada NuMicro 1XX Series
Development Board
Pada development board NUC 1XX series, terdapat keypad matrix 3x3.
Gambar 4 berikut skematik rangkaian dari keypad matrix tersebut:
Gambar 4. Konfigurasi Keypad Matrix 3x3 NuMicro 1XX series Development Board
Untuk menggunakannya, pertama-tama masukkan library ScanKey.h dan file ScanKey.c.
Pengguna dapat memanggil fungsi scankey() saat akan menggunakan keypad matrix tersebut
Contoh program: temp=scan_key();
if(temp==1)
{
print_lcd(0,"Key1 had pressed ");
}
Pada program diatas, akan ditampilkan tombol yang telah ditekan pada LCD.
Latihan-1: Lengkapi listing program dibawah ini
1. Lengkapi program diatas untuk keypad 1-9 kemudian downloadkan pada
mikrokontroler
2. Buatlah program yang menampilkan di LCD setiap keypad yang ditekan tanpa
menghapus hasil penekanan sebelumnya
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
MODUL 5: ADC
Tujuan - Praktikan memahami penggunaan ADC pada NuMicro 1XX Series Development
Board dengan menggunakan CoCoox IDE
Pada NuMicro 1XX series terdapat variable resistor yang terhubung dengan port ADC
dengan resolusi 12bit pada GPA.7
Gambar 5 berikut ini merupakan konfigurasi ADC pada NuMicro 1XX series Development
Board
Gambar 5. Konfigurasi ADC pada NuMicro 1XX series Development Board
Berikut program yang digunakan untuk menginisialisasi fungsi ADC pada NuMicro 1XX
series:
void InitADC(void)
{
/* Step 1. GPIO initial */
GPIOA->OFFD|=0x00800000; //Disable digital input path
SYS->GPAMFP.ADC7_SS21_AD6=1; //Set ADC function
/* Step 2. Enable and Select ADC clock source, and then enable ADC module
*/
SYSCLK->CLKSEL1.ADC_S = 2; //Select 22Mhz for ADC
SYSCLK->CLKDIV.ADC_N = 1; //ADC clock source = 22Mhz/2 =11Mhz;
SYSCLK->APBCLK.ADC_EN = 1; //Enable clock source
ADC->ADCR.ADEN = 1; //Enable ADC module
/* Step 3. Select Operation mode */
ADC->ADCR.DIFFEN = 0; //single end input
ADC->ADCR.ADMD = 0; //single mode
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
/* Step 4. Select ADC channel */
ADC->ADCHER.CHEN = 0x80;
/* Step 5. Enable ADC interrupt */
ADC->ADSR.ADF =1; //clear the A/D interrupt flags for safe
ADC->ADCR.ADIE = 1; // NVIC_EnableIRQ(ADC_IRQn);
/* Step 6. Enable WDT module */
ADC->ADCR.ADST=1;
}
Untuk mendapatkan nilai ADC pada port tertentu, bias digunakan instruksi
ADDR[namaport].RSLT
Misal untuk mendapatkan nilai ADC pada Port GPA7, digunakan instruksi:
ADC->ADDR[7].RSLT
Latihan:
Tulis program utama berikut pada program utama yang telah anda buat:
int main (void)
{
//Enable 12Mhz and set HCLK->12Mhz
char adc_value1[15]="ADC Value:";
char adc_value2[15]="ADC Volt :";
UNLOCKREG();
SYSCLK->PWRCON.XTL12M_EN = 1;
SYSCLK->CLKSEL0.HCLK_S = 0;
LOCKREG();
InitADC();
Initial_pannel(); //call initial pannel function
clr_all_pannal();
/* Synch field transmission & Request Identifier Field transmission*/
double volt;
while(1)
{
while(ADC->ADSR.ADF==0);
ADC->ADSR.ADF=1;
Show_Word(0,11,' ');
Show_Word(0,12,' ');
Show_Word(0,13,' ');
volt = ((ADC->ADDR[7].RSLT)/4095);
// 12bit ADC resolution, Vref=5volt
sprintf(adc_value1+10,"%d",ADC->ADDR[7].RSLT);
sprintf(adc_value2+10,"%3.2f",volt);
print_lcd(0, adc_value1);
print_lcd(1, adc_value2);
Delay(20000);
ADC->ADCR.ADST=1;
}
}
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
MODUL 6: I2C
Tujuan - Praktikan memahami penggunaan I2C pada NuMicro 1XX Series Development
Board dengan menggunakan CoCoox IDE
Pendahuluan I2C (Inter-Integrated Circuit) bus merupakan antarmuka 2 wire serial yang dikembangkan
oleh Philips. Dikembangkan untuk aplikasi 8 bit dan banyak digunakan pada consumer
electronics, automotive dan indistri. I2C bus ini berfungsi sebagai antarmuka jaringan multi-
master, multi-slave dengan deteksi tabrakan data. Jaringan dapat dipasangkan hingga 128
titik dalam jarak 10 meter. Setiap titik dalam jaringan dapat mengirim dan menerima data.
Setiap titik dalam jaringan harus memiliki alamat yang unik. Seiring berkembangnya waktu,
I2C menjadi sebuah standar komunikasi yang banyak digunakan dalam aplikasi embedded
system.
Pada NuMicro 1XX series ini memiliki fitur I2C sebagai berikut:
Up to two I2C controllers.
Compatible with Philips I2C standard.
Support Master/Slave mode
Support 7 bit addressing mode
Built-in a 14-bit time-out counter to avoid the
I2C bus hang-up.5
Features (2/2)
Multiple address recognition
Pada praktikum kali ini akan dicoba menuliskan flash memori pada 24LC64 EEPROM
dengan menggunakan I2C pada NuMicro. 24AA64/24LC64 (24XX64 *) adalah 64 Kbit
Electrically Erasable PROM. Perangkat ini disusun sebagai delapan blok dari 1K x 8-bit
memori dengan antarmuka 2-wire serial. Berikut diagram blok dari 24LC64 EEPROM:
Gambar 3. Diagram blok 24LC64 EEPROM
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
Untuk menggunakan fungsi I2C pada EEPROM 24LC64 yang tersedia pada NuMicro
development Board, dapat digunakan library EEPROM_24LC64.h dan Driver\DrvI2C.h.
Tuliskan listing program berikut:
#include
#include "NUC1xx.h"
#include "Driver\DrvSYS.h"
void delay_loop(void)
{
uint32_t i,j;
for(i=0;i
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
else
DrvGPIO_ClrBit(E_GPA,pin);
temp=temp>>1;
}
delay();
if(DrvGPIO_GetBit(E_GPA,4)==0)
return (i+4);
}
for(i=0;i1;
}
delay();
if(DrvGPIO_GetBit(E_GPA,5)==0)
return (i+7);
}
return 0;
}
int main(void)
{
uint32_t i2cdata=0,i;
unsigned char temp;
char addr[16]="Address:";
char Write[16]="Write:";
char read[16]="Read:";
/* Unlock the protected registers */
UNLOCKREG();
/* Enable the 12MHz oscillator oscillation */
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
/* Waiting for 12M Xtal stalble */
SysTimerDelay(5000);
/* HCLK clock source. 0: external 12MHz; 4:internal 22MHz RC oscillator */
DrvSYS_SelectHCLKSource(0);
/*lock the protected registers */
LOCKREG();
DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0);
/* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */
Initial_pannel(); //call initial pannel function
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
clr_all_pannal();
print_lcd(0, "I2C with 24LC64");
print_lcd(1, "test read and ");
print_lcd(2, "write function ");
print_lcd(3, "press keypad");
//initial key board
for(i=0;i
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
Write_24LC64(0x00000000+temp,temp+33);
i2cdata= Read_24LC64(0x00000000+temp);
sprintf(addr+8,"%x",temp);
sprintf(Write+6,"%x",temp+33);
sprintf(read+5,"%x",i2cdata);
print_lcd(1,addr);
print_lcd(2,Write);
print_lcd(3,read);
}
}
}
Program diatas digunakan untuk menulis data melalui I2C ke EEPROM 24LC64 kemudian
membaca data yang ditulis tersebut.
Latihan-1: Buat program Lanjutkan listing program diatas untuk tombol keypad matrix 4-9
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
MODUL 7: Timer (pewaktu mikrokontroler)
Tujuan - Praktikan memahami penggunaan Timer pada NuMicro 1XX Series Development
Board dengan menggunakan CoCoox IDE
Pada NuMicro 1XX series tersedia Timer, dengan fitur sebagai berikut:
Four sets of 24-bit up-counting timer
Five selections of clock source and a
prescale for every timer
Time out period = (Period of timer clock input)
(8-bit Prescale + 1) * (24-bit TCMP)
Four operation modes: one shot, periodic, toggle mode and auto-reload, counting
mode
Berikut diagram alur dari Timer operation:
Berikut NuMicro Family Timer Block Diagram:
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
Gambar. NuMicro Family Timer Block Diagram
Cara menghitung periode timer dari Timer 0 ialah:
Time out period = (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)
TMAX = (1 / 12 MHz) * (28) * (224-1) 341.3 sec.
TMIN = (1 / 12 MHz) * (1+1) * (2) 0.318usec.
8-bit Prescale: 1~255, Setting 0 will disable prescale clock
24bit TCMP: 2~(224-1)
Timer clock input: 12Mhz
Berikut ini contoh fungsi yang digunakan untuk menginisialisasi Timer 0 Periodic Mode
Interupt
void Timer_initial(void)
{
/* Step 1. Enable and Select Timer clock source */
SYSCLK->CLKSEL1.TMR0_S = 0; //Select 12Mhz for Timer0 clock source
SYSCLK->APBCLK.TMR0_EN =1; //Enable Timer0 clock source
/* Step 2. Select Operation mode */
TIMER0->TCSR.MODE=1; //Select periodic mode for operation mode
/* Step 3. Select Time out period = (Period of timer clock input) *
(8-bit Prescale + 1) * (24-bit TCMP)*/
TIMER0->TCSR.PRESCALE=0; // Set Prescale [0~255]
TIMER0->TCMPR = 1000000; // Set TICR(TCMP) [0~16777215]
//(1/22118400)*(0+1)*(2765)= 125.01usec or 7999.42Hz
/* Step 4. Enable interrupt */
TIMER0->TCSR.IE = 1;
TIMER0->TISR.TIF = 1; //Write 1 to clear for safty
NVIC_EnableIRQ(TMR0_IRQn); //Enable Timer0 Interrupt
/* Step 5. Enable Timer module */
TIMER0->TCSR.CRST = 1; //Reset up counter
TIMER0->TCSR.CEN = 1; //Enable Timer0
TIMER0->TCSR.TDR_EN=1; // Enable TDR function
}
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
Saat terjadi overflow, maka mikrokontroler akan mengeksekusi program yang terdapat pada
fungsi
void TMR0_IRQHandler(void) // Timer0 interrupt subroutine
{
-masukkan program interupsi-
}
Berikut contoh program saat terjadi interupsi: /*-------------------------------------------------------------------------
---
Interrupt subroutine
-------------------------------------------------------------------------
---*/
static unsigned char count=0;
static unsigned char loop=12;
void TMR0_IRQHandler(void) // Timer0 interrupt subroutine
{
unsigned char i=0;
TIMER0->TISR.TIF =1;
count++;
if(count==5)
{
DrvGPIO_ClrBit(E_GPC,loop);
loop++;
count=0;
if(loop==17)
{
for(i=12;i
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
unsigned char i=0;
TIMER0->TISR.TIF =1;
count++;
if(count==5)
{
DrvGPIO_ClrBit(E_GPC,loop);
loop++;
count=0;
if(loop==17)
{
for(i=12;iCLKSEL1.TMR0_S = 0; //Select 12Mhz for Timer0 clock source
SYSCLK->APBCLK.TMR0_EN =1; //Enable Timer0 clock source
/* Step 2. Select Operation mode */
TIMER0->TCSR.MODE=1; //Select periodic mode for operation mode
/* Step 3. Select Time out period = (Period of timer clock input) *
(8-bit Prescale + 1) * (24-bit TCMP)*/
TIMER0->TCSR.PRESCALE=0; // Set Prescale [0~255]
TIMER0->TCMPR = 1000000; // Set TICR(TCMP) [0~16777215]
// (1/22118400)*(0+1)*(2765)= 125.01usec or 7999.42Hz
/* Step 4. Enable interrupt */
TIMER0->TCSR.IE = 1;
TIMER0->TISR.TIF = 1; //Write 1 to clear for safty
NVIC_EnableIRQ(TMR0_IRQn); //Enable Timer0 Interrupt
/* Step 5. Enable Timer module */
TIMER0->TCSR.CRST = 1; //Reset up counter
TIMER0->TCSR.CEN = 1; //Enable Timer0
TIMER0->TCSR.TDR_EN=1; // Enable TDR function
}
int main(void)
{
int i=0,j=0;
/* Unlock the protected registers */
UNLOCKREG();
/* Enable the 12MHz oscillator oscillation */
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
/* Waiting for 12M Xtal stalble */
SysTimerDelay(5000);
/* HCLK clock source. 0: external 12MHz; 4:internal 22MHz RC oscillator */
DrvSYS_SelectHCLKSource(0);
/*lock the protected registers */
LOCKREG();
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0);
/* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */
for(i=12;i
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
Modul 8: PWM Pulse Width Modulation
Tujuan - Praktikan memahami penggunaan Pulse Width Modulation pada NuMicro 1XX
Series Development Board dengan menggunakan CoCoox IDE
Pada NuMicro 1xx series, terdapat PORT yang memiliki fungsi khusus sebagai port
penghasil Pulse Width Modulation atau biasa disebut PWM.
Berikut fitur-fitur yang terdapat didalamnya:
Four PWM Generators, each generator supports
One 8-bit prescaler
One clock divider
Two PWM-timers for two outputs, each timer includes
A 16-bit PWM down-counter
A 16-bit PWM reload value register (CNR)
A 16-bit PWM compare register (CMR)
One dead-zone generator
Two PWM outputs.
8 PWM channels or 4 PWM paired channels.
16 bits resolution.
PWM Interrupt synchronized with PWM period.
Single-shot or Continuous mode PWM.5
Berikut konfigurasi PWM/Capture Clock Source
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
Konfigurasi PWM Generator:
Untuk memanggil fungsi PWM pada NuMicro 1xx series ini, pengguna diwajibkan
menginisialisasi fungsi PWM terlebih dahulu. Contoh inisialisasi fungsi PWM dapat dilihat
pada program berikut:
void InitPWM(void)
{
/* Step 1. GPIO initial */
SYS->GPAMFP.PWM0_AD13=1;
/* Step 2. Enable and Select PWM clock source*/
SYSCLK->APBCLK.PWM01_EN = 1;//Enable PWM clock
SYSCLK->CLKSEL1.PWM01_S = 3;//Select 22.1184Mhz for PWM clock source
PWMA->PPR.CP01=1; //Prescaler 0~255, Setting 0 to stop output clock
PWMA->CSR.CSR0=0; // PWM clock = clock source/(Prescaler + 1)/divider
/* Step 3. Select PWM Operation mode */
//PWM0
PWMA->PCR.CH0MOD=1; //0:One-shot mode, 1:Auto-load mode
//CNR and CMR will be auto-cleared after setting CH0MOD form 0 to 1.
PWMA->CNR0=0xFFFF;
PWMA->CMR0=0xFFFF;
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
PWMA->PCR.CH0INV=0; //Inverter->0:off, 1:on
PWMA->PCR.CH0EN=1; //PWM function->0:Disable, 1:Enable
PWMA->POE.PWM0=1; //Output to pin->0:Diasble, 1:Enable
}
Fungsi diatas digunakan untuk melakukan setting PORT PWM0 dengan mode operasi auto-
load mode.
Berikut ini contoh program penggunaan PWM.
while(ADC->ADSR.ADF==0);
ADC->ADSR.ADF=1;
PWMA->CMR0=ADC->ADDR[7].RSLTADCR.ADST=1;
Pada program diatas, akan digunakan pengontrolan lebar pulsa PWM dengan memanfaatkan
nilai ADC pada address 7 yang masuk pada input variabel resistor
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
MODUL 9: SPI Serial Peripheral Interface
Tujuan - Praktikan memahami penggunaan Serial Peripheral Interface (SPI) pada NuMicro
1XX Series Development Board dengan menggunakan CoCoox IDE
SPI (serial peripheral interface) merupakan port komunikasi serial sinkron. Pada development
board NuMicro 1XX series terdapat fitur SPI sebagai berikut:
Up to four SPI controllers
Each SPI controller can drive up to two
slave devices in master mode
Support master/slave mode operation
Support 1-channel or 2-channel serial data
IN/OUT
Configurable data length
Provide burst mode operation
Berikut blok diagram kerja SPI pada NuMicro Development Board 1XX
1bit SPI+SPI Flash+PDMA Connection
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
Condition:
Master mode
One channel data in/out
SPI clock rate 1MHz
Transmit data at negative edge
Receive data at positive edge
Disable the auto slave select
Slave select is active low
SPICLK2 SPI-Flash0_CLK
MISO20 SPI-Flash0_DO
MOSI20 SPI-Flash0_DI
SPISS20 SPI-Flash0_/CS
Pada NuMicro 1XX series Development board, terdapat flash memory eksternal W25Q16BV
yang memiliki konfigurasi sebagai berikut:
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
Berikut contoh pemrograman flash memory eksternal W25Q16BV dengan menggunakan SPI
#define TEST_NUMBER 1 /* page numbers */
//void SPI0_Callback(uint32_t u32UserData);
//volatile uint32_t SPI0_INT_Flag;
void SpiFlashx2_ReadMidDid(void);
void SpiFlashx2_ChipErase(void);
uint32_t SpiFlash2_ReadStatusReg1(void);
uint32_t SpiFlash2_ReadStatusReg2(void);
void SpiFlashx2_WaitReady(void);
void SpiFlashx2_PageProgram(uint8_t *, uint32_t, uint32_t);
void SpiFlashx2_ReadData(uint8_t *, uint8_t *, uint32_t, uint32_t);
void Initial_pannel(void);
void clr_all_pannal(void);
void print_lcd(unsigned char, char *);
void SysTimerDelay(uint32_t);
void delay(void)
{
int j;
for(j=0; j
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
uint8_t scan_key(void)
{
uint8_t act[4]={0x3b, 0x3d, 0x3e};
uint8_t i,temp,pin;
for(i=0;i1;
}
delay();
if(DrvGPIO_GetBit(E_GPA,3)==0)
return (i+1);
}
for(i=0;i1;
}
delay();
if(DrvGPIO_GetBit(E_GPA,4)==0)
return (i+4);
}
for(i=0;i1;
}
delay();
if(DrvGPIO_GetBit(E_GPA,5)==0)
return (i+7);
}
return 0;
}
int main(void)
{
uint32_t u32ByteCount, u32FlashAddress, u32PageNumber;
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
uint8_t DataBuffer0[256];
uint8_t DataBuffer1[256];
/* Unlock the protected registers */
UNLOCKREG();
/* Enable the 12MHz oscillator oscillation */
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
/* HCLK clock source. 0: external 12MHz; 4:internal 22MHz RC oscillator */
DrvSYS_SelectHCLKSource(0);
LOCKREG();
DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0);
/* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */
Initial_pannel();
clr_all_pannal();
/* GPIO init for SPI2 */
DrvGPIO_InitFunction(E_FUNC_SPI2);
/* GPIO init for SPI2 2-bit mode */
DrvGPIO_InitFunction(E_FUNC_SPI2_2BIT_MODE);
/* Configure SPI2 as a master, Type1 waveform, 32-bit transaction */
DrvSPI_Open(eDRVSPI_PORT2, eDRVSPI_MASTER, eDRVSPI_TYPE1, 32);
/* MSB first */
DrvSPI_SetEndian(eDRVSPI_PORT2, eDRVSPI_MSB_FIRST);
/* Disable the automatic slave select function of SS0. */
DrvSPI_DisableAutoSS(eDRVSPI_PORT2);
/* Set the active level of slave select. */
DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_PORT2,
eDRVSPI_ACTIVE_LOW_FALLING);
/* Configure SPI2 as 2 bits transfer mode */
DrvSPI_Set2BitTransferMode(eDRVSPI_PORT2, TRUE);
/* Enable the SPI2 interrupt and install the callback function. */
//DrvSPI_EnableInt(eDRVSPI_PORT2, SPI2_Callback, 0);
/* SPI clock rate 1MHz */
DrvSPI_SetClockFreq(eDRVSPI_PORT2, 1000000, 0);
print_lcd(0,"SPI Sample Code ");
print_lcd(1," for Flash x 2 ");
print_lcd(3,"Press key 1 ....");
while(1) {
if (scan_key() == 1) break;
}
/* read MID & DID */
SpiFlashx2_ReadMidDid();
SysTimerDelay(1000000);
/* Erase SPI flash */
print_lcd(2,"Erase Flash.....");
print_lcd(3," ");
SpiFlashx2_ChipErase();
/* Wait ready */
SpiFlashx2_WaitReady();
/* Get the status of SPI flash */
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
print_lcd(3,"Erase done !!! ");
SysTimerDelay(1000000);
/* source data */
for(u32ByteCount=0; u32ByteCount
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
}
print_lcd(3,"Verify done !!! ");
DrvSPI_Close(eDRVSPI_PORT2);
return 1;
}
/*
void SPI2_Callback(uint32_t u32UserData)
{
SPI2_INT_Flag = 1;
}
*/
// **************************************
// For W25Q16BV, Manufacturer ID: 0xEF; Device ID: 0x14
// For W26X16, Manufacturer ID: 0xEF; Device ID: 0x14
void SpiFlashx2_ReadMidDid(void)
{
uint32_t au32SourceData[2];
uint32_t au32DestinationData[2];
// configure transaction length as 8 bits
DrvSPI_SetBitLength(eDRVSPI_PORT2, 8);
// /CS: active
DrvSPI_SetSS(eDRVSPI_PORT2, eDRVSPI_SS0);
// send Command: 0x90, Read Manufacturer/Device ID
au32SourceData[0] = 0x90;
au32SourceData[1] = 0x90;
DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);
// wait
while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}
// configure transaction length as 24 bits
DrvSPI_SetBitLength(eDRVSPI_PORT2, 24);
// send 24-bit '0', dummy
au32SourceData[0] = 0x0;
au32SourceData[1] = 0x0;
DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);
// wait
while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}
// configure transaction length as 16 bits
DrvSPI_SetBitLength(eDRVSPI_PORT2, 16);
// receive
au32SourceData[0] = 0x0;
au32SourceData[1] = 0x0;
DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);
// wait
while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}
// /CS: de-active
DrvSPI_ClrSS(eDRVSPI_PORT2, eDRVSPI_SS0);
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
DrvSPI_DumpRxRegister(eDRVSPI_PORT2, &au32DestinationData[0], 2);
if ((au32DestinationData[0] & au32DestinationData[1] & 0xffff) ==
0xEF14)
print_lcd(3,"MID & DID=0xEF14");
else
print_lcd(3,"MID & DID Error!");
}
// **************************************
void SpiFlashx2_ChipErase(void)
{
uint32_t au32SourceData[2];
// configure transaction length as 8 bits
DrvSPI_SetBitLength(eDRVSPI_PORT2, 8);
// /CS: active
DrvSPI_SetSS(eDRVSPI_PORT2, eDRVSPI_SS0);
// send Command: 0x06, Write enable
au32SourceData[0] = 0x06;
au32SourceData[1] = 0x06;
DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);
// wait
while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}
// /CS: de-active
DrvSPI_ClrSS(eDRVSPI_PORT2, eDRVSPI_SS0);
// /CS: active
DrvSPI_SetSS(eDRVSPI_PORT2, eDRVSPI_SS0);
// send Command: 0xC7, Chip Erase
au32SourceData[0] = 0xc7;
au32SourceData[1] = 0xc7;
DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);
// wait
while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}
// /CS: de-active
DrvSPI_ClrSS(eDRVSPI_PORT2, eDRVSPI_SS0);
}
// **************************************
uint32_t SpiFlash2_ReadStatusReg1(void)
{
uint32_t au32SourceData[2];
uint32_t au32DestinationData[2];
// configure transaction length as 16 bits
DrvSPI_SetBitLength(eDRVSPI_PORT2, 16);
// /CS: active
DrvSPI_SetSS(eDRVSPI_PORT2, eDRVSPI_SS0);
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
// send Command: 0x05, Read status register 1
au32SourceData[0] = 0x0500;
au32SourceData[1] = 0x0500;
DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);
// wait
while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}
// /CS: de-active
DrvSPI_ClrSS(eDRVSPI_PORT2, eDRVSPI_SS0);
// dump Rx register
DrvSPI_DumpRxRegister(eDRVSPI_PORT2, &au32DestinationData[0], 2);
return ((au32DestinationData[0] | au32DestinationData[1]) & 0xFF);
}
// **************************************
uint32_t SpiFlash2_ReadStatusReg2(void)
{
uint32_t au32SourceData[2];
uint32_t au32DestinationData[2];
// configure transaction length as 16 bits
DrvSPI_SetBitLength(eDRVSPI_PORT2, 16);
// /CS: active
DrvSPI_SetSS(eDRVSPI_PORT2, eDRVSPI_SS0);
// send Command: 0x35, Read status register 2
au32SourceData[0] = 0x3500;
au32SourceData[1] = 0x3500;
DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);
// wait
while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}
// /CS: de-active
DrvSPI_ClrSS(eDRVSPI_PORT2, eDRVSPI_SS0);
// dump Rx register
DrvSPI_DumpRxRegister(eDRVSPI_PORT2, &au32DestinationData[0], 2);
return ((au32DestinationData[0] | au32DestinationData[1]) & 0xFF);
}
// **************************************
void SpiFlashx2_WaitReady(void)
{
uint32_t ReturnValue;
do{
ReturnValue = SpiFlash2_ReadStatusReg1();
ReturnValue = ReturnValue & 1;
}while(ReturnValue!=0); // check the BUSY bit
}
// **************************************
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
void SpiFlashx2_PageProgram(uint8_t *DataBuffer, uint32_t StartAddress,
uint32_t ByteCount)
{
uint32_t au32SourceData[2];
uint32_t Counter;
// configure transaction length as 8 bits
DrvSPI_SetBitLength(eDRVSPI_PORT2, 8);
// /CS: active
DrvSPI_SetSS(eDRVSPI_PORT2, eDRVSPI_SS0);
// send Command: 0x06, Write enable
au32SourceData[0] = 0x06;
au32SourceData[1] = 0x06;
DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);
// wait
while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}
// /CS: de-active
DrvSPI_ClrSS(eDRVSPI_PORT2, eDRVSPI_SS0);
// /CS: active
DrvSPI_SetSS(eDRVSPI_PORT2, eDRVSPI_SS0);
// send Command: 0x02, Page program
au32SourceData[0] = 0x02;
au32SourceData[1] = 0x02;
DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);
// wait
while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}
// configure transaction length as 24 bits
DrvSPI_SetBitLength(eDRVSPI_PORT2, 24);
// send 24-bit start address
au32SourceData[0] = StartAddress;
au32SourceData[1] = StartAddress;
DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);
// wait
while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}
// configure transaction length as 8 bits
DrvSPI_SetBitLength(eDRVSPI_PORT2, 8);
for(Counter=0; Counter
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG ELINS, UGM
}
// **************************************
void SpiFlashx2_ReadData(uint8_t *DataBuffer0, uint8_t *DataBuffer1,
uint32_t StartAddress, uint32_t ByteCount)
{
uint32_t au32SourceData[2];
uint32_t au32DestinationData[2];
uint32_t Counter;
// configure transaction length as 8 bits
DrvSPI_SetBitLength(eDRVSPI_PORT2, 8);
// /CS: active
DrvSPI_SetSS(eDRVSPI_PORT2, eDRVSPI_SS0);
// send Command: 0x03, Read data
au32SourceData[0] = 0x03;
au32SourceData[1] = 0x03;
DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);
// wait
while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}
// configure transaction length as 24 bits
DrvSPI_SetBitLength(eDRVSPI_PORT2, 24);
// send 24-bit start address
au32SourceData[0] = StartAddress;
au32SourceData[1] = StartAddress;
DrvSPI_BurstWrite(eDRVSPI_PORT2, &au32SourceData[0]);
// wait
while (DrvSPI_IsBusy(eDRVSPI_PORT2)) {}
// configure transaction length as 8 bits
DrvSPI_SetBitLength(eDRVSPI_PORT2, 8);
for(Counter=0; Counter