2011年8月7日日曜日

Cortex-M0 NUC120-SDKボード味見(1)

http://akizukidenshi.com/catalog/g/gM-05028/
秋月電子の NUC120-SDK Cortex-m0ボードを購入してみた。
通販では、開発用DVDが梱包されてなかったが、メールで問い合わせしたところ、DVDが届いた。

秋月には、Cortex-m0として、LPC1114 http://akizukidenshi.com/catalog/g/gM-03597/ があるが
このNUC120-SDKはUSBとADC(12bit)機能が嬉しい。 また、FLASH128Kbyte,SRAM 16Kbyteと広大であります。

開発ツールは IAR とKeil がDVDに付属するがいずれも、機能またはサイズ制限版なので、動作確認できたら
CodeSourceryLiteGccに移行しましょう。

サンプルソースが付属するので使い勝手がよいです。USB VCOMも問題なく動作しました。
ところで、CodeSourceryLiteGccでは当然header fileがないので、辛いです。
IAR ツールをインストールすると nuc1xx.hが手に入るので、流用すると捗ります。

------HOS V4a 20110405版での動作確認例
http://ryuz.txt-nifty.com/blog/2011/04/cortex-m0hos-f8.html
を参考して、動作確認します。
PIN17 PB0 RXD0
PIN18 PB1 TXD0
PIN19 PB2 GPIO LED
PIN20 PB3 GPIO LED
以下はsample/arm/lpc1114 を修正したもの
1) gcc/link.lds 修正箇所のみ
    ro     : o = 0x000000c0, l = 0x0001ff40
    rw     : o = 0x20000000, l = 0x00004000
2) main.c
 *  Sample program for Hyper Operating System V4 Advance
 *
 * @file  main.c
 * @brief %jp{メイン関数}%en{main}
 *
 * Copyright (C) 1998-2006 by Project HOS
 * http://sourceforge.jp/projects/hos/
 */

#include "kernel.h"


#define GCR_BA                    (0x50000000)        /* System Manager Control Register */
#define REG_GPA_MFP                ((volatile UW *)(GCR_BA+0x030))        /* GPIO Register */
#define REG_GPB_MFP                ((volatile UW *)(GCR_BA+0x034))        /* GPIO Register */
#define REG_GPC_MFP                ((volatile UW *)(GCR_BA+0x038))        /* GPIO Register */
#define REG_GPD_MFP                ((volatile UW *)(GCR_BA+0x03c))        /* GPIO Register */
#define REG_GPE_MFP                ((volatile UW *)(GCR_BA+0x040))        /* GPIO Register */

#define REG_WRPROT                ((volatile UW *)(GCR_BA+0x100))        /* REGWRPROT Register */

#define CLK_BA                    (0x50000200)        /* System Clock Control Register */
#define REG_PWRCON                ((volatile UW *)(CLK_BA+0x00))        /* PWRCON Register */
#define REG_AHBCLK                ((volatile UW *)(CLK_BA+0x04))        /* AHBCLK Register */
#define REG_APBCLK                ((volatile UW *)(CLK_BA+0x08))        /* APBCLK Register */
#define REG_CLKSEL0                ((volatile UW *)(CLK_BA+0x10))        /* CLKSEL0 Register */
#define REG_CLKSEL1                ((volatile UW *)(CLK_BA+0x14))        /* CLKSEL1 Register */
#define REG_CLKDIV                ((volatile UW *)(CLK_BA+0x18))        /* CLKDIV Register */
#define REG_CLKSEL2                ((volatile UW *)(CLK_BA+0x1c))        /* CLKSEL2 Register */
#define REG_PLLCON                ((volatile UW *)(CLK_BA+0x20))        /* PLLCON Register */

#define GP_BA                    (0x50004000)        /* System Manager Control Register */
#define REG_GPIOB_PMD            ((volatile UW *)(GP_BA+0x040))        /* GPIOB Register */
#define REG_GPIOB_DOUT            ((volatile UW *)(GP_BA+0x048))        /* GPIOB Register */


static void UNLOCK(){
    *REG_WRPROT=0x59;
    *REG_WRPROT=0x16;
    *REG_WRPROT=0x88;
}
static void ENLOCK(){
    *REG_WRPROT=0x00;
}
static void
Delay (unsigned int delayCnt)
{
  while (delayCnt--)
    {
     asm  ("nop");
     asm  ("nop");
    }
}
/** %jp{メイン関数} */
int main()
{

    /* %jp{ハードウェアの初期化} */
    UNLOCK ();
    *REG_PWRCON |= 1;/* ExClk 12MHz */
    *REG_PLLCON = 0;
    Delay (1000);
    *REG_CLKSEL0 = 2;
    Delay (100);
    *REG_PLLCON = 0xc22e;/* 48MHz */
    ENLOCK();
    /* LEDをつけてみる */
    *REG_GPA_MFP = 0x00;
    *REG_GPB_MFP = 0x00;
    *REG_GPC_MFP = 0x00;
    *REG_GPD_MFP = 0x00;
    *REG_GPE_MFP = 0x00;
    *REG_GPIOB_PMD = 0x50;/* PB2,PB3 */
    *REG_GPIOB_DOUT = 0x04;/* PB2 */
    /* %jp{カーネルの動作開始} */
    vsta_knl();
   
    return 0;
}

/* dummy */
void _sbrk(void)
{
}


/* end of file */
3) uart.c  修正箇所のみ

 *  Sample program for Hyper Operating System V4 Advance
 *
 * @file  uart.c
 * @brief %jp{UARTへの出力}%en{UART device driver}
 *
 * Copyright (C) 1998-2011 by Project HOS
 * http://sourceforge.jp/projects/hos/
 */


#include "kernel.h"

#define CLK_BA                    (0x50000200)        /* System Clock Control Register */
#define REG_PWRCON                ((volatile UW *)(CLK_BA+0x00))        /* PWRCON Register */
#define REG_AHBCLK                ((volatile UW *)(CLK_BA+0x04))        /* AHBCLK Register */
#define REG_APBCLK                ((volatile UW *)(CLK_BA+0x08))        /* APBCLK Register */
#define REG_CLKSEL0                ((volatile UW *)(CLK_BA+0x10))        /* CLKSEL0 Register */
#define REG_CLKSEL1                ((volatile UW *)(CLK_BA+0x14))        /* CLKSEL1 Register */
#define REG_CLKDIV                ((volatile UW *)(CLK_BA+0x18))        /* CLKDIV Register */
#define REG_CLKSEL2                ((volatile UW *)(CLK_BA+0x1c))        /* CLKSEL2 Register */
#define REG_PLLCON                ((volatile UW *)(CLK_BA+0x20))        /* PLLCON Register */

#define GCR_BA                    (0x50000000)        /* System Manager Control Register */
#define REG_GPB_MFP                ((volatile UW *)(GCR_BA+0x034))        /* GPIOB Register */

#define UART0_BA                (0x40050000)        /* UART0 */
#define REG_U0RBR                ((volatile UW *)(UART0_BA+0x00))    /* UART Receiver Buffer Register */
#define REG_U0THR                ((volatile UW *)(UART0_BA+0x00))    /* UART Transmitter Holding Register */
#define REG_U0BAUD                ((volatile UW *)(UART0_BA+0x24))    /* UART Divisor Latch LSB and MSB Registers  */
#define REG_U0IER                ((volatile UW *)(UART0_BA+0x04))    /* UART Interrupt Enable Register  */
#define REG_U0ISR                ((volatile UW *)(UART0_BA+0x1c))    /* UART Interrupt Identification Register  */
#define REG_U0FCR                ((volatile UW *)(UART0_BA+0x08))    /* UART FIFO Control Register */
#define REG_U0LCR                ((volatile UW *)(UART0_BA+0x0c))    /* UART Line Control Register */
#define REG_U0MCR                ((volatile UW *)(UART0_BA+0x10))    /* UART0 Modem Control Register */
#define REG_U0FSR                ((volatile UW *)(UART0_BA+0x18))    /* UART FSR Register */
#define REG_U0ALTCON            ((volatile UW *)(UART0_BA+0x2c))    /* UART */
#define REG_U0FUNSEL            ((volatile UW *)(UART0_BA+0x30))    /* UART */

/* %jp{UARTの初期化} */
void Uart_Initialize(void)
{
    /* CLK */
    *REG_CLKDIV &= ~(15<<8);/* UART_N = 0 */
    *REG_CLKSEL1 &= ~(3<<24);/* ExClk Source = ExClk 12MHz */
    *REG_APBCLK |= (1<<16);/* UART CLK Enable */
    /* (GPB_MFP).BIT0,1=1 */
    *REG_GPB_MFP |=  0x03;
    /* UART */
    *REG_U0ALTCON = 0x00;
    *REG_U0FUNSEL= 0x00;
    *REG_U0BAUD = (3<<28)|(15<<24)|((12000000/115200) -2);
    *REG_U0LCR = 0x03;        /* 8bit nonparity */
    *REG_U0FCR = 0x06;        /* FIFO reset & enable */
}


/* %jp{1文字出力} */
void Uart_PutChar(int c)
{
    while ( !(*REG_U0FSR & (1<<22)) ) /* TX_EMPTY != 0 */
        ;

    *REG_U0THR = c;
}

------

0 件のコメント:

コメントを投稿