2011年8月18日木曜日

HOS for RX62N

今更ながら、HOS for RX62N を見つけた
http://sourceforge.jp/forum/message.php?msg_id=57491
から RX62N 該当部をダウンロード

HOS本体を
http://sourceforge.jp/cvs/view/hos/hos/hos-v4/
から Download GNU tarballでダウンロード

rx-elf-gcc は nahitafuさんのコンパイル版を利用
http://www.tokudenkairo.co.jp/rxmega/download.html

USB CDCソースを確認
hos-v4/app/RX62N/usbcdc/CDC/usbdescriptors.c
#define VID 0x1234
#define PID 0x5678
をゴニョゴニョする

ここに Windows7(Vista)でのUSB CDCのinfの話題あり
http://www.renesasrulz.com/message/13581

で Windows7 64bitで USB Serial接続できました。

開発環境:
cygwin+gcc 4.6.1+ FDT 4.07 Basic




(でも、実は HOS-V4ではなく HOS-V4aと勘違いしてた。)


2011年8月17日水曜日

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

NUC120 SDK で HOS-V4a -2011-0405を眺めています。
-----
HOS では Idle 時_kernel_wai_int()が呼ばれるようです。

kernel/source/arch/proc/arm/arm_v6m/gcc/kwai_int.S
_kernel_wai_int: /* WaitForInterrupt */
+ wfi
b _kernel_wai_int
.size _kernel_wai_int, .-_kernel_wai_int
で wfi命令(sleep)を追加してみました。

効果は CPU48MHz SysTick 1ms周期で wfi命令なし130mA, wfi命令あり100mA と消費電力が低減しました。
----
I2C0(PA8.SDC,PA9.SCL)に 温度センサーLM73を接続してみました。
LM73は http://www.digikey.jp/ で購入しました。

sample/arm/nuc120/i2c0_lm73.c
/**
* Sample program for Hyper Operating System V4 Advance
*
* @file sample.c
* @brief %jp{サンプルプログラム}%en{Sample program}
*
* Copyright (C) 1998-2011 by Project HOS
* http://sourceforge.jp/projects/hos/
*/

#include
#include
#include "kernel.h"
#include "kernel_id.h"
#include "uart.h"
#include "nuc120_reg.h"

extern volatile long OSTick;

struct i2c_lm73_t {
unsigned short temperature;
char valid;
unsigned char ad;
unsigned char rd[2];
} lm73;

#define LM73_AD (0x49)

/** %jp{サンプルタスク} */
void Lm73_Task(VP_INT exinf)
{

lm73.ad = (LM73_AD<<1);
lm73.temperature=0;
/* I2C0 pin function */
*REG_GPA_MFP |= (3<<8);/* I2C0 */

/* I2C0 engine clock enable */
*REG_APBCLK |= (1 << 8); /* I2C0 CLK Enable */

/* I2C0 初期化 */
*REG_I2C0_I2CON = 0x08; /* clearing all flags */
*REG_I2C0_I2CON = 0xc0; /* Enable EI + ENS1 */
*REG_I2C0_I2CLK = 119;/* 100KHz */

ena_int(18);

for(;;)
{
lm73.valid=0;

*REG_I2C0_I2CON |= 0x20;/* STA */

dly_tsk (1000);

if(lm73.valid) { /* */
/** %jp{状態表示} */
wai_sem(SEMID_UART);

/* %jp{文字列生成} */
lm73.temperature=lm73.rd[0]<<8|lm73.rd[1];
printk("LM73: %3d.%02d\n",lm73.temperature>>7,100*(lm73.temperature>>5 & 3)/4);

sig_sem(SEMID_UART);
}
}
}


void
I20_ISR_8 ()
{
// printk("<08>");
/* Clear SI and Start flag */
*REG_I2C0_I2CON &= ~0x34; /* */
*REG_I2C0_I2CON |= 0x08; /* SIC */
/* Slave address + write */
*REG_I2C0_I2CDAT = lm73.ad;
}
void
I20_ISR_10 ()
{
// printk("<10>");
/* clear SI */
*REG_I2C0_I2CON |= 0x08;
*REG_I2C0_I2CON &= ~0x34;
/* Slave address + read */
*REG_I2C0_I2CDAT = lm73.ad|1;
}
void
I20_ISR_18 ()
{
// printk("<18>");
/* Data to be transmitted */
*REG_I2C0_I2CDAT = 0x00;/* Reg 0 */
/* clear SI */
*REG_I2C0_I2CON |= 0x0c;
*REG_I2C0_I2CON &= ~0x20;
}

void
I20_ISR_20 ()
{
// printk("<20>");
/* Data to be transmitted */
*REG_I2C0_I2CDAT = 0x00;/* LM73 Reg 0 */
/* clear SI */
*REG_I2C0_I2CON |= 0x08;
*REG_I2C0_I2CON &= ~0x34;
}
void
I20_ISR_28 ()
{
// printk("<28>");
/* Transmit stop condition */
*REG_I2C0_I2CON &= ~0x34;
/* clear SI */
*REG_I2C0_I2CON |= 0x28;
}

void
I20_ISR_30 ()
{
// printk("<30>");
/* clear SI */
*REG_I2C0_I2CON |= 0x18;
}

void
I20_ISR_38 ()
{
// printk("<38>");
/* clear SI */
*REG_I2C0_I2CON |= 0x8;
}

void
I20_ISR_40 ()
{
// printk("<40>");
/* clear SI */
*REG_I2C0_I2CON &= ~0x34;
*REG_I2C0_I2CON |= 0x08;
/* Transmit AA condition */
*REG_I2C0_I2CON |= 0x04;
}
void
I20_ISR_48 ()
{
// printk("<48>");
/* clear SI */
*REG_I2C0_I2CON |= 0x08;
}
void
I20_ISR_50 ()
{
// printk("<50>");
lm73.rd[0]=*REG_I2C0_I2CDAT;
/* clear SI */
*REG_I2C0_I2CON |= 0x08;
/* Transmit AA condition */
*REG_I2C0_I2CON &= ~0x24;
}
void
I20_ISR_58 ()
{
// printk("<58>");
lm73.rd[1]=*REG_I2C0_I2CDAT;
lm73.valid++;
/* clear SI */
*REG_I2C0_I2CON &= ~0x24;
*REG_I2C0_I2CON |= 0x18;
}


void I2C0_Isr(VP_INT exinf)
{
int status;

status = *REG_I2C0_I2CSTATUS & 255;

switch (status)
{
case 0x08:
I20_ISR_8 ();
break;
case 0x10:
I20_ISR_10 ();
break;
case 0x18:
I20_ISR_18 ();
break;
case 0x20:
I20_ISR_20 ();
break;
case 0x28:
I20_ISR_28 ();
break;
case 0x30:
I20_ISR_30 ();
break;
case 0x38:
I20_ISR_38 ();
break;
case 0x40:
I20_ISR_40 ();
break;
case 0x48:
I20_ISR_48 ();
break;
case 0x50:
I20_ISR_50 ();
break;
case 0x58:
I20_ISR_58 ();
break;
default:
*REG_I2C0_I2CON |= 0x08;/* Clear SI */
break;
}
return;
}

/* end of file */
sample/arm/nuc120/nuc120_reg.h
#ifndef _NUC120_DEF_
#define _NUC120_DEF_

#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_SYS_RSTSRC ((volatile UW *)(GCR_BA+0x004)) /* GPIO Register */
#define REG_SYS_IPRSTC1 ((volatile UW *)(GCR_BA+0x008)) /* GPIO Register */
#define REG_SYS_IPRSTC2 ((volatile UW *)(GCR_BA+0x00c)) /* GPIO 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 GP_BA (0x50004000) /* System Manager Control Register */
#define REG_GPIOA_PMD ((volatile UW *)(GP_BA+0x000)) /* GPIOB Register */
#define REG_GPIOA_DOUT ((volatile UW *)(GP_BA+0x008)) /* GPIOB Register */
#define REG_GPIOB_PMD ((volatile UW *)(GP_BA+0x040)) /* GPIOB Register */
#define REG_GPIOB_DOUT ((volatile UW *)(GP_BA+0x048)) /* GPIOB Register */
#define REG_GPIOC_PMD ((volatile UW *)(GP_BA+0x080)) /* GPIOB Register */
#define REG_GPIOC_DOUT ((volatile UW *)(GP_BA+0x088)) /* GPIOB Register */

#define ADC_BA (0x400e0000) /* ADC Registers */
#define REG_ADC_ADDR0 ((volatile UW *)(ADC_BA+0x000)) /* ADC0 Register */
#define REG_ADC_ADDR1 ((volatile UW *)(ADC_BA+0x004)) /* ADC1 Register */
#define REG_ADC_ADDR2 ((volatile UW *)(ADC_BA+0x008)) /* ADC2 Register */
#define REG_ADC_ADDR3 ((volatile UW *)(ADC_BA+0x00c)) /* ADC3 Register */
#define REG_ADC_ADDR4 ((volatile UW *)(ADC_BA+0x010)) /* ADC4 Register */
#define REG_ADC_ADDR5 ((volatile UW *)(ADC_BA+0x014)) /* ADC5 Register */
#define REG_ADC_ADDR6 ((volatile UW *)(ADC_BA+0x018)) /* ADC6 Register */
#define REG_ADC_ADDR7 ((volatile UW *)(ADC_BA+0x01c)) /* ADC7 Register */
#define REG_ADC_ADCR ((volatile UW *)(ADC_BA+0x020)) /* ADCR Register */
#define REG_ADC_ADCHER ((volatile UW *)(ADC_BA+0x024)) /* ADCHER Register */
#define REG_ADC_ADSR ((volatile UW *)(ADC_BA+0x030)) /* ADSR Register */

#define TMR_BA01 (0x40010000) /* TMR01 */
#define REG_TMR_TCSR0 ((volatile UW *)(TMR_BA01+0x00)) /* UART Receiver Buffer Register */
#define REG_TMR_TCMPR0 ((volatile UW *)(TMR_BA01+0x04)) /* UART Transmitter Holding Register */
#define REG_TMR_TISR0 ((volatile UW *)(TMR_BA01+0x08)) /* UART Divisor Latch LSB and MSB Registers */
#define REG_TMR_TDR0 ((volatile UW *)(TMR_BA01+0x0c)) /* UART Divisor Latch LSB and MSB Registers */
#define REG_TMR_TCSR1 ((volatile UW *)(TMR_BA01+0x20)) /* UART Receiver Buffer Register */
#define REG_TMR_TCMPR1 ((volatile UW *)(TMR_BA01+0x24)) /* UART Transmitter Holding Register */
#define REG_TMR_TISR1 ((volatile UW *)(TMR_BA01+0x28)) /* UART Divisor Latch LSB and MSB Registers */
#define REG_TMR_TDR1 ((volatile UW *)(TMR_BA01+0x2c)) /* UART Divisor Latch LSB and MSB Registers */

#define I2C0_BA (0x40020000) /* I2C */
#define REG_I2C0_I2CON ((volatile UW *)(I2C0_BA+0x00)) /* I2C ControlRegister */
#define REG_I2C0_I2CADDR0 ((volatile UW *)(I2C0_BA+0x04)) /* I2C Slave Address Register0 */
#define REG_I2C0_I2CDAT ((volatile UW *)(I2C0_BA+0x08)) /* I2C DATA Registers */
#define REG_I2C0_I2CSTATUS ((volatile UW *)(I2C0_BA+0x0c)) /* I2C Status Registers */
#define REG_I2C0_I2CLK ((volatile UW *)(I2C0_BA+0x10)) /* I2C Clock Registers */
#define REG_I2C0_I2CTOC ((volatile UW *)(I2C0_BA+0x14)) /* I2C Time Out Control Registers */
#define REG_I2C0_I2CADDR1 ((volatile UW *)(I2C0_BA+0x18)) /* I2C Slave Address Register1 */
#define REG_I2C0_I2CADDR2 ((volatile UW *)(I2C0_BA+0x1c)) /* I2C DATA Slave Address Register2 */
#define REG_I2C0_I2CADDR3 ((volatile UW *)(I2C0_BA+0x20)) /* I2C DATA Slave Address Register3 */

#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 */

#endif
/* end of file */

sample/arm/nuc120/system.cfg
/**
* Sample program for Hyper Operating System V4 Advance
*
* @file system.cfg
* @brief %jp{サンプルのコンフィギュレーション}
*
* Copyright (C) 1998-2006 by Project HOS
* http://sourceforge.jp/projects/hos/
*/


/* %jp{カーネル独自の設定}%en{kernel} */
KERNEL_HEP_MEM(256, NULL);
KERNEL_SYS_STK(256, NULL);
KERNEL_INT_STK(512, NULL);
KERNEL_RSV_TSKID(0);
KERNEL_RSV_SEMID(0);
KERNEL_RSV_FLGID(0);
KERNEL_RSV_DTQID(0);
KERNEL_RSV_MBXID(0);
KERNEL_RSV_MPFID(0);
KERNEL_RSV_MTXID(0);
KERNEL_RSV_CYCID(0);


/* %jp{OSタイマの設定}%en{OS timer} */
INCLUDE("\"ostimer.h\"");
ATT_INI({TA_HLNG, 0, OsTimer_Initialize});
DEF_INH(15, {TA_HLNG, OsTimer_Isr}); /* 15:SysTick */
DEF_INH(24, {TA_HLNG, TMR0_Isr}); /* 24:TMR0 */
ATT_INI({TA_HLNG, 0, UART0_Initialize});
DEF_INH(28, {TA_HLNG, UART0_Isr}); /* 28:UART0 */
DEF_INH(34, {TA_HLNG, I2C0_Isr}); /* 34:I2C0 */
DEF_INH(45, {TA_HLNG, ADC_Isr}); /* 45:ADC */

/* %jp{サンプル}%en{Sample program} */
INCLUDE("\"sample.h\"");
ATT_INI({TA_HLNG, 0, Sample_Initialize});

CRE_TSK(TSKID_SAMPLE1, {TA_HLNG | TA_ACT, 1, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_SAMPLE2, {TA_HLNG | TA_ACT, 2, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_SAMPLE3, {TA_HLNG | TA_ACT, 3, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_SAMPLE4, {TA_HLNG | TA_ACT, 4, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_SAMPLE5, {TA_HLNG | TA_ACT, 5, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_ADC, {TA_HLNG | TA_ACT, 5, Adc_Task, 3, 512, NULL});
CRE_TSK(TSKID_LM73, {TA_HLNG | TA_ACT, 5, Lm73_Task, 3, 512, NULL});
CRE_TSK(TSKID_LED, {TA_HLNG | TA_ACT, 0, Led_PC2, 7, 512, NULL});

CRE_CYC(CYCID_LED, {TA_HLNG , 0, Led_PC3, 250, 0});

CRE_SEM(1, {TA_TFIFO, 1, 1});
CRE_SEM(2, {TA_TFIFO, 1, 1});
CRE_SEM(3, {TA_TFIFO, 1, 1});
CRE_SEM(4, {TA_TFIFO, 1, 1});
CRE_SEM(5, {TA_TFIFO, 1, 1});
CRE_SEM(SEMID_RAND, {TA_TFIFO, 1, 1});
CRE_SEM(SEMID_UART, {TA_TFIFO, 1, 1});
CRE_FLG(FLGID_UART, {TA_TFIFO | TA_WSGL, 0});

/* end of file */



2011年8月15日月曜日

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

HOS-V4a-20110405のつづき
NUC120-SDK でADC0, ADC1を使用してみる。
ADCを周期的に起動するには
1)周期タスク
2)通常タスクでdly_tsk(wait)
3)通常タスクでタイマー割り込みでADC起動
などの方法があるが
今回はTMR0周期割り込みでADC起動、ADC終了割り込みでAdc_Task()起床とした。
ADC1 はフォトリフレクタ接続で PB12で赤外LEDを点灯制御しています。
http://akizukidenshi.com/catalog/g/gI-00276/

---------
sample/arm/nuc120/adc.c
/**
* Sample program for Hyper Operating System V4 Advance
*
* @file sample.c
* @brief %jp{サンプルプログラム}%en{Sample program}
*
* Copyright (C) 1998-2011 by Project HOS
* http://sourceforge.jp/projects/hos/
*/

#include <stdlib.h>
#include <string.h>
#include "kernel.h"
#include "kernel_id.h"
#include "uart.h"
#include "nuc120_reg.h"

extern volatile long OSTick;

/* サンプルタスク dly_tsk() */
void Led_PC2(VP_INT exinf)
{
for(;;){
*REG_GPIOC_DOUT ^= 0x04;/* PC2 */
dly_tsk(500);
}
}

/* 周期タスク */
void Led_PC3(VP_INT exinf)
{
*REG_GPIOC_DOUT ^= 0x08;/* PC3 */
}


/** %jp{サンプルタスク} */
void Adc_Task(VP_INT exinf)
{
int value;
/* ADC */
*REG_GPA_MFP |= 3;/* ADC0,ADC1 */
/* reset ADC */
*REG_SYS_IPRSTC2 |= (1<<28);/* ADC_RST */
*REG_SYS_IPRSTC2 &= ~(1<<28);

/* ADC clock source */
*REG_CLKSEL1 &= ~(3<<2);

/* Set ADC divisor */
*REG_CLKDIV &= (255<<16);
*REG_CLKDIV |= (11<<16);
/* ADC engine clock enable */
*REG_APBCLK |= (1 << 28); /* ADC CLK Enable */

/* ADC enable */
*REG_ADC_ADCR &= ~(1<<10);
*REG_ADC_ADCR &=~(3<<2);
*REG_ADC_ADCR |= 3;/* ADIE+ADEN */
*REG_ADC_ADCHER = 2;/* ADC1 */

ena_int(29);

/* TMR0 */
*REG_CLKSEL1 &= ~(7<<8); /* use ExClk:12MHz */
*REG_APBCLK |= (1 << 2); /* TMR0 CLK Enable */

*REG_TMR_TCMPR0 = 1000000/100;/* 100Hz */
*REG_TMR_TDR0 = 0x00;

*REG_TMR_TCSR0=0x00;
*REG_TMR_TCSR0 =(1<<27) | (1<<16) | (11); /* MODE=01 TDR_EN=1 Prescale=12 */
*REG_TMR_TCSR0 |= (1<<30);/* CEN */
*REG_TMR_TCSR0 |= (1<<29);/* IE */

ena_int(8);

for(;;)
{
*REG_GPIOB_DOUT &= ~(1<<12);/* PB12 LED on */

slp_tsk();

*REG_GPIOB_DOUT |= (1<<12);/* PB12 LED off */

if (*REG_ADC_ADSR & (1<<9)) { /* VALID */
value = *REG_ADC_ADDR1 & 0xffff;
/** %jp{状態表示} */
if(value>10){
wai_sem(SEMID_UART);
/* %jp{文字列生成} */
printk("%d %d\n",OSTick,value);

sig_sem(SEMID_UART);
}
}
}
}


void ADC_Isr(VP_INT exinf)
{
*REG_ADC_ADSR |= 7;/* Clear Flags CMP/ADF */
/* slp_tsk() 起床 */
iwup_tsk(TSKID_ADC);
}


void TMR0_Isr(VP_INT exinf)
{
/* ADC 起動 */
*REG_ADC_ADSR |= 7;/* Clear Flags CMP/ADF */
*REG_ADC_ADCR |= (1<<11);/* ADST */

*REG_TMR_TISR0 = 0x01; /* clear TIF */
}

/* end of file */

sample/arm/nuc120/system.cfg

/**
* Sample program for Hyper Operating System V4 Advance
*
* @file system.cfg
* @brief %jp{サンプルのコンフィギュレーション}
*
* Copyright (C) 1998-2006 by Project HOS
* http://sourceforge.jp/projects/hos/
*/


/* %jp{カーネル独自の設定}%en{kernel} */
KERNEL_HEP_MEM(256, NULL);
KERNEL_SYS_STK(256, NULL);
KERNEL_INT_STK(512, NULL);
KERNEL_RSV_TSKID(0);
KERNEL_RSV_SEMID(0);
KERNEL_RSV_FLGID(0);
KERNEL_RSV_DTQID(0);
KERNEL_RSV_MBXID(0);
KERNEL_RSV_MPFID(0);
KERNEL_RSV_MTXID(0);
KERNEL_RSV_CYCID(0);


/* %jp{OSタイマの設定}%en{OS timer} */
INCLUDE("\"ostimer.h\"");
ATT_INI({TA_HLNG, 0, OsTimer_Initialize});
DEF_INH(15, {TA_HLNG, OsTimer_Isr}); /* 15:SysTick */

ATT_INI({TA_HLNG, 0, UART0_Initialize});
DEF_INH(28, {TA_HLNG, UART0_Isr}); /* 28:UART0 */

DEF_INH(24, {TA_HLNG, TMR0_Isr}); /* 24:TMR0 */
DEF_INH(45, {TA_HLNG, ADC_Isr}); /* 45:ADC */

/* %jp{サンプル}%en{Sample program} */
INCLUDE("\"sample.h\"");
ATT_INI({TA_HLNG, 0, Sample_Initialize});
CRE_TSK(TSKID_SAMPLE1, {TA_HLNG | TA_ACT, 1, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_SAMPLE2, {TA_HLNG | TA_ACT, 2, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_SAMPLE3, {TA_HLNG | TA_ACT, 3, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_SAMPLE4, {TA_HLNG | TA_ACT, 4, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_SAMPLE5, {TA_HLNG | TA_ACT, 5, Sample_Task, 2, 512, NULL});
CRE_TSK(TSKID_ADC, {TA_HLNG | TA_ACT, 5, Adc_Task, 3, 512, NULL});
CRE_TSK(TSKID_LED, {TA_HLNG | TA_ACT, 0, Led_PC2, 7, 512, NULL});
CRE_CYC(CYCID_LED, {TA_HLNG , 0, Led_PC3, 250, 0});
CRE_SEM(1, {TA_TFIFO, 1, 1});
CRE_SEM(2, {TA_TFIFO, 1, 1});
CRE_SEM(3, {TA_TFIFO, 1, 1});
CRE_SEM(4, {TA_TFIFO, 1, 1});
CRE_SEM(5, {TA_TFIFO, 1, 1});
CRE_SEM(SEMID_RAND, {TA_TFIFO, 1, 1});
CRE_SEM(SEMID_UART, {TA_TFIFO, 1, 1});
CRE_FLG(FLGID_UART, {TA_TFIFO | TA_WSGL, 0});


/* end of file */

sample/arm/nuc120/nuc120_reg.h
#ifndef _NUC120_DEF_
#define _NUC120_DEF_

#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_SYS_RSTSRC ((volatile UW *)(GCR_BA+0x004)) /* GPIO Register */
#define REG_SYS_IPRSTC1 ((volatile UW *)(GCR_BA+0x008)) /* GPIO Register */
#define REG_SYS_IPRSTC2 ((volatile UW *)(GCR_BA+0x00c)) /* GPIO 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 GP_BA (0x50004000) /* System Manager Control Register */
#define REG_GPIOA_PMD ((volatile UW *)(GP_BA+0x000)) /* GPIOB Register */
#define REG_GPIOA_DOUT ((volatile UW *)(GP_BA+0x008)) /* GPIOB Register */
#define REG_GPIOB_PMD ((volatile UW *)(GP_BA+0x040)) /* GPIOB Register */
#define REG_GPIOB_DOUT ((volatile UW *)(GP_BA+0x048)) /* GPIOB Register */
#define REG_GPIOC_PMD ((volatile UW *)(GP_BA+0x080)) /* GPIOB Register */
#define REG_GPIOC_DOUT ((volatile UW *)(GP_BA+0x088)) /* GPIOB Register */

#define ADC_BA (0x400e0000) /* ADC Registers */
#define REG_ADC_ADDR0 ((volatile UW *)(ADC_BA+0x000)) /* ADC0 Register */
#define REG_ADC_ADDR1 ((volatile UW *)(ADC_BA+0x004)) /* ADC1 Register */
#define REG_ADC_ADDR2 ((volatile UW *)(ADC_BA+0x008)) /* ADC2 Register */
#define REG_ADC_ADDR3 ((volatile UW *)(ADC_BA+0x00c)) /* ADC3 Register */
#define REG_ADC_ADDR4 ((volatile UW *)(ADC_BA+0x010)) /* ADC4 Register */
#define REG_ADC_ADDR5 ((volatile UW *)(ADC_BA+0x014)) /* ADC5 Register */
#define REG_ADC_ADDR6 ((volatile UW *)(ADC_BA+0x018)) /* ADC6 Register */
#define REG_ADC_ADDR7 ((volatile UW *)(ADC_BA+0x01c)) /* ADC7 Register */
#define REG_ADC_ADCR ((volatile UW *)(ADC_BA+0x020)) /* ADCR Register */
#define REG_ADC_ADCHER ((volatile UW *)(ADC_BA+0x024)) /* ADCHER Register */
#define REG_ADC_ADSR ((volatile UW *)(ADC_BA+0x030)) /* ADSR Register */

#define TMR_BA01 (0x40010000) /* TMR01 */
#define REG_TMR_TCSR0 ((volatile UW *)(TMR_BA01+0x00)) /* UART Receiver Buffer Register */
#define REG_TMR_TCMPR0 ((volatile UW *)(TMR_BA01+0x04)) /* UART Transmitter Holding Register */
#define REG_TMR_TISR0 ((volatile UW *)(TMR_BA01+0x08)) /* UART Divisor Latch LSB and MSB Registers */
#define REG_TMR_TDR0 ((volatile UW *)(TMR_BA01+0x0c)) /* UART Divisor Latch LSB and MSB Registers */
#define REG_TMR_TCSR1 ((volatile UW *)(TMR_BA01+0x20)) /* UART Receiver Buffer Register */
#define REG_TMR_TCMPR1 ((volatile UW *)(TMR_BA01+0x24)) /* UART Transmitter Holding Register */
#define REG_TMR_TISR1 ((volatile UW *)(TMR_BA01+0x28)) /* UART Divisor Latch LSB and MSB Registers */
#define REG_TMR_TDR1 ((volatile UW *)(TMR_BA01+0x2c)) /* UART Divisor Latch LSB and MSB Registers */

#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 */

#endif
/* end of file */

2011年8月12日金曜日

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

この評価ボードは電源が使い辛い。
ICE,TARGETともにUSB電源であるが、μプロセッサに入るのはD1,D2,D4のダイオードが入り4.67Vとなっている。
1) ICE接続時USBVBUS->D4->VCC5->D2->NUC120となる2) TARGETのみ接続では USBVUS->D1->NUC120
3) ICE,TARGET接続ではUSBVBUS->D4->VCC5->D2->NUC120<-D1<-USBVBUS

3.3V系のSDカードや、I2Cデバイスを接続するにはD1,D4を取り外して 3.3Vのレギュレターをいれるしかないか?
(モードカットできる場所をさがしたが、無理そう)
------------------------------------------
HOS-V4a-20110405の続き
UART0を割り込みで使用すべくソースをいじってみた。
UART0 は NVIC(割り込みコントローラ)ではベクタ番号が28で、割り込み番号が12と、2つの数値があります。
system.cfg で使うのはベクタ番号の28、割り込み許可等で使うのは12となる。
UART用にバッファをもうけるが、そのバッファ管理ようにEvent Flagを使う(FLGID_UART)
ostimer.cも修正 ena_int(); はいらないようだ。

また、USB接続時にリセット後の動作が安定しないので、main.c のDelay(1000->10000)にしてみた。

sample/arm/nuc120/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"
#include "kernel_id.h"
#include "nuc120_reg.h"


#define next(a,b) ((a + 1) & (b - 1))    /* b = 2^n */
#define UART_BUF_SIZE (64)
struct FIFO
{
  volatile short push;
  volatile short pull;
  unsigned char array[UART_BUF_SIZE];

};

static struct FIFO uart_rx;
static struct FIFO uart_tx;


/* %jp{UARTの初期化} */
void
UART0_Initialize (VP_INT exinf)
{
  uart_tx.push = uart_rx.push = 0;
  uart_tx.pull = uart_rx.pull = 0;
  /* 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 */
  *REG_U0IER = 0x01;        /* RDA_INT */
  *REG_GPIOB_DOUT &= ~0x04;    /* PB2 */

  ena_int (12);

}


/* %jp{1文字出力} */
void
Uart_PutChar (int c)
{
  FLGPTN flg;

  if (next (uart_tx.push, UART_BUF_SIZE) == uart_tx.pull)
    {
      clr_flg (FLGID_UART, 0x0000);
      *REG_U0IER |= 2;        /*  */
      wai_flg (FLGID_UART, 0x0001, TWF_ORW, &flg);
      *REG_GPIOB_DOUT ^= 0x04;    /* PB2送信バッファ枯渇表示 */
    }

  *REG_U0IER &= ~2;        /*  */

//  if (next (uart_tx.push, UART_BUF_SIZE) != uart_tx.pull) {
      uart_tx.array[uart_tx.push] = (unsigned char) c;
      uart_tx.push = next (uart_tx.push, UART_BUF_SIZE);
//    }
  *REG_U0IER |= 2;        /*  */
}

void
UART0_Isr (VP_INT exinf)
{
  unsigned char c;
  unsigned int status;

  status = *REG_U0ISR;

  while ((*REG_U0FSR & (1 << 14)) == 0)    /* RX_EMPTY */
    {
      if (next (uart_rx.push, UART_BUF_SIZE) != uart_rx.pull)
    {
      uart_rx.array[uart_rx.push] = (unsigned char) *REG_U0RBR;
      uart_rx.push = next (uart_rx.push, UART_BUF_SIZE);
    }
      else
    {
      c = (unsigned char) *REG_U0RBR;
    }            // 読み捨て
    }

  while ((*REG_U0FSR & (1 << 23)) == 0)    /* TX_FULL */
    {
      if (uart_tx.pull != uart_tx.push)
    {
      *REG_U0THR = uart_tx.array[uart_tx.pull];
      uart_tx.pull = next (uart_tx.pull, UART_BUF_SIZE);
    }
      else
    {
      *REG_U0IER &= ~2;    /*  */
      break;
    }
    }
  if (status & 2)    /* THRE */
    iset_flg (FLGID_UART, 0x0001);
}
/* end of file */

kernel/source/arch/proc/arm/arm_v6m/dis_int.c
//    *(_KERNEL_REG_INT_CLRENA_BASE + (intno >> 2)) = (1 << (intno & 3));
    *(_KERNEL_REG_INT_CLRENA_BASE) = (1 << (intno));

kernel/source/arch/proc/arm/arm_v6m/ena_int.c
//    *(_KERNEL_REG_INT_SETENA_BASE + (intno >> 2)) = (1 << (intno & 3));
    *(_KERNEL_REG_INT_SETENA_BASE) = (1 << (intno));
   
kernel/source/arch/proc/arm/arm_v6m/vclr_int.c

//    *(_KERNEL_REG_INT_CLRPEND_BASE + (intno >> 2)) = (1 << (intno & 3));
    *(_KERNEL_REG_INT_CLRPEND_BASE) = (1 << (intno));

sample/arm/nuc120/system.cfg
ATT_INI({TA_HLNG, 0, UART0_Initialize});
DEF_INH(28, {TA_HLNG, UART0_Isr});                    /* 28:UART0 */
CRE_FLG(FLGID_UART, {TA_TFIFO | TA_WSGL, 0});

sample/arm/nuc120/ostimer.c

/**
 *  Sample program for Hyper Operating System V4 Advance
 *
 * @file  ostimer.c
 * @brief %jp{OSタイマ}%en{OS timer}
 *
 * Copyright (C) 1998-2006 by Project HOS
 * http://sourceforge.jp/projects/hos/
 */


#include "kernel.h"
#include "ostimer.h"
#include "nuc120_reg.h"
volatile long OSTick;

#define REG_SCSR        ((volatile UW *)0xE000E010)        /* SysTick Control and Status Register */
#define REG_SRVR        ((volatile UW *)0xE000E014)        /* SysTick Reload Value Register */
#define REG_SCUVR        ((volatile UW *)0xE000E018)        /* SysTick Current Value Register */
#define REG_SCAVR        ((volatile UW *)0xE000E01c)        /* SysTick Calibration Value Register */

/** %jp{OS用タイマ初期化ルーチン} */
void OsTimer_Initialize(VP_INT exinf)
{
    /* %jp{タイマ動作開始} */
    *REG_SRVR  = 12000;
    *REG_SCUVR = 0;
    *REG_SCSR  = 0x00000003;
}


/** %jp{タイマ割込みハンドラ} */
void OsTimer_Isr(void)
{
    /* %jp{割込み要因クリア} */

    OSTick++;

    if(OSTick & 0x40)
    {
        *REG_GPIOB_DOUT &= ~8;/* PB3 */
    } else
    {
        *REG_GPIOB_DOUT |= 8;/* PB3 */
    }
    /* %jp{タイムティック供給} */
    isig_tim();
}


/* end of file */
sample/arm/nuc120/nuc120_reg.h
#ifndef _NUC120_DEF_
#define _NUC120_DEF_

#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_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 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 */
#define REG_GPIOC_PMD            ((volatile UW *)(GP_BA+0x080))        /* GPIOB Register */
#define REG_GPIOC_DOUT            ((volatile UW *)(GP_BA+0x088))        /* GPIOB Register */

#define ADC_BA                    (0x400e0000)        /* ADC Registers */
#define REG_ADC_ADDR0            ((volatile UW *)(ADC_BA+0x000))        /* ADC0 Register */
#define REG_ADC_ADDR1            ((volatile UW *)(ADC_BA+0x004))        /* ADC1 Register */
#define REG_ADC_ADDR2            ((volatile UW *)(ADC_BA+0x008))        /* ADC2 Register */
#define REG_ADC_ADDR3            ((volatile UW *)(ADC_BA+0x00c))        /* ADC3 Register */
#define REG_ADC_ADDR4            ((volatile UW *)(ADC_BA+0x010))        /* ADC4 Register */
#define REG_ADC_ADDR5            ((volatile UW *)(ADC_BA+0x014))        /* ADC5 Register */
#define REG_ADC_ADDR6            ((volatile UW *)(ADC_BA+0x018))        /* ADC6 Register */
#define REG_ADC_ADDR7            ((volatile UW *)(ADC_BA+0x01c))        /* ADC7 Register */
#define REG_ADC_ADCR            ((volatile UW *)(ADC_BA+0x020))        /* ADCR Register */
#define REG_ADC_ADCHER            ((volatile UW *)(ADC_BA+0x024))        /* ADCHER Register */
#define REG_ADC_ADSR            ((volatile UW *)(ADC_BA+0x030))        /* ADSR 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 */

#endif
/* end of file */

sample/arm/nuc120/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"
#include "nuc120_reg.h"

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 (10000);
    *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_GPIOC_PMD = 0x55;/* PC3..0 */
    *REG_GPIOB_PMD = 0x50;/* PB3..2 */
    *REG_GPIOB_DOUT = 0x08;/* PB3 */
    /* %jp{カーネルの動作開始} */
    vsta_knl();
   
    return 0;
}

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


/* end of file */

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;
}

------