Z80CPU エンジンは abZ80のまま
http://code.google.com/p/cp-mega88/
を見ながらSDCARD から cpmを起動してみた。
SDCARDの書き込みはまだダメ。
2011年9月8日木曜日
2011年9月2日金曜日
abZ80 on RX62N
RX62Nで Z80 を動作させている。
すごい面白い。
http://www.nextftp.com/abe/rx62n/index.html
20110518RX版では Z80 64KByte空間を RX62NのSRAMに56KByte,FCURAMに8KByte割り当てていますが
実際のところ、FRK-RX62Nに実装のRX62N7はカタログ値は
384KByte FlashROM, 64KByte SRAMですが
512Kbyte FlashROM, 96KByte SRAMが利用可能でした。
ので、FCURAMを使わずに、Z80メモリすべてをSRAMに割りつけます。
(あくまで、手持ちのボードでは使えましたというもの)
(E1 Debuggerでは RX62N8を選択するといいかも)
BZ80.c::
// z80 memory
#pragma section Z
uint8 Z80Memory[Z80_MEM_SIZE];
#pragma section
//uint8 *Z80Memory;
//uint8 *Z80Memory2;
(いや、そもそもFCURAMは名前と違い FLASHROMだよな~)
-----------
Z80サンプルプログラムを準備
sdcc cコンパイラをダウンロード
http://sdcc.sourceforge.net/
echo.c
/*
translate from z80tst.src
sdcc -mz80 echo.c
*/
__sfr __at 0x01 led_port;
__sfr __at 0x01 sio_status;
__sfr __at 0x00 sio_wdata;
__sfr __at 0x00 sio_rdata;
int main(){
char c;
char t;
led_port = 1;
t = 0;
while(1){
if(0 == sio_status){
c = sio_rdata;
sio_wdata = c;
t++;
led_port = t & 1;
}
}
}
sdcc -mz80 echo.c
できた echo.ihx を tereterm 画面にドロップしますと、コードを実行します。
すごい面白い。
http://www.nextftp.com/abe/rx62n/index.html
20110518RX版では Z80 64KByte空間を RX62NのSRAMに56KByte,FCURAMに8KByte割り当てていますが
実際のところ、FRK-RX62Nに実装のRX62N7はカタログ値は
384KByte FlashROM, 64KByte SRAMですが
512Kbyte FlashROM, 96KByte SRAMが利用可能でした。
ので、FCURAMを使わずに、Z80メモリすべてをSRAMに割りつけます。
(あくまで、手持ちのボードでは使えましたというもの)
(E1 Debuggerでは RX62N8を選択するといいかも)
BZ80.c::
// z80 memory
#pragma section Z
uint8 Z80Memory[Z80_MEM_SIZE];
#pragma section
//uint8 *Z80Memory;
//uint8 *Z80Memory2;
(いや、そもそもFCURAMは名前と違い FLASHROMだよな~)
-----------
Z80サンプルプログラムを準備
sdcc cコンパイラをダウンロード
http://sdcc.sourceforge.net/
echo.c
/*
translate from z80tst.src
sdcc -mz80 echo.c
*/
__sfr __at 0x01 led_port;
__sfr __at 0x01 sio_status;
__sfr __at 0x00 sio_wdata;
__sfr __at 0x00 sio_rdata;
int main(){
char c;
char t;
led_port = 1;
t = 0;
while(1){
if(0 == sio_status){
c = sio_rdata;
sio_wdata = c;
t++;
led_port = t & 1;
}
}
}
sdcc -mz80 echo.c
できた echo.ihx を tereterm 画面にドロップしますと、コードを実行します。
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と勘違いしてた。)
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 */
-----
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 */
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 */
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;
}
------
秋月電子の 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;
}
------
2011年1月11日火曜日
EvalBot 味見その2
EvalBot
とりあえず、 サンプルプログラムを入手
http://micrium.com/page/downloads/os-iii_files
動作確認します。
コンパイラコード制限版の入手
http://www.iar.com/website1/1.0.1.0/675/3/
マイコンのRevision を確認します。
LSIの表面に 2列目後半に B1,C1,C3の文字があれば
TARGET_IS_TEMPEST_RB1または
TARGET_IS_TEMPEST_RC1,TARGET_IS_TEMPEST_RC3
をプレデファインに入れます。
電源
電池がもったいないので、JTAG +ICDI_VBUS -- D6(未実装だった) -- IN1(TPS213) を接続します。
この場合、USB ポートを利用すると(+DVBUS)と(+ICDI_VBUS)でショートする可能性あるので
気をつけてください。
回路図では D7 ダイオードが実装のはずですが、私の実機では0オーム抵抗で
接続されています。
コンパイルは
1. libdriver.aの生成
2. uCOS-III-Ex1
3. uCOS-III-Ex2
4. uCOS-III-Ex3
5. uCOS-III-Ex4
の順に行い、動作確認します。
とりあえず、 サンプルプログラムを入手
http://micrium.com/page/downloads/os-iii_files
動作確認します。
コンパイラコード制限版の入手
http://www.iar.com/website1/1.0.1.0/675/3/
マイコンのRevision を確認します。
LSIの表面に 2列目後半に B1,C1,C3の文字があれば
TARGET_IS_TEMPEST_RB1または
TARGET_IS_TEMPEST_RC1,TARGET_IS_TEMPEST_RC3
をプレデファインに入れます。
電源
電池がもったいないので、JTAG +ICDI_VBUS -- D6(未実装だった) -- IN1(TPS213) を接続します。
この場合、USB ポートを利用すると(+DVBUS)と(+ICDI_VBUS)でショートする可能性あるので
気をつけてください。
回路図では D7 ダイオードが実装のはずですが、私の実機では0オーム抵抗で
接続されています。
コンパイルは
1. libdriver.aの生成
2. uCOS-III-Ex1
3. uCOS-III-Ex2
4. uCOS-III-Ex3
5. uCOS-III-Ex4
の順に行い、動作確認します。
EvalBot 味見その1
Stellaris Evalbotを購入してみた。
http://www.luminarymicro.com/products/stellaris_evalbot.html
DigiKey で EKB-UCOS3-BNDLを購入、約4日で届きました。
Stellaris Evalbotのマイコンは ARM Cortex-M3 LM3S9B92 80MHz
256KB FLASH, 96KB RAMで、Cortex-M3でEther/USBがあるのは嬉しい。
開発環境を調査すると
1. IAR ARM KickStart Edtion (32KB コード制限版)
2. Code Sourcey G++ Lite版 (Free)
3. LM Flash Programmer(Free)
Stellarisの特徴--ソフトウエアに自信があり。
http://www.luminarymicro.com/products/software_updates.html
すごいのは、ROMにDriverが書き込まれている
メモリマップを示すと
$0000.0000 FLASH (256KByte)
$0100.0000 ROM (Driver/Boot Loader支援)
$2000.0000 SRAM (96Kbyte)
$4000.0000 I/O REG
$E000.0000 SYS REG
といったかんじ。
ROM APIは、たとえば
#define TARGET_IS_TEMPEST_RB1
#include <drivelib/rom.h>
#include <drivelib/rom_map.h>
として
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
とすると、ROMのバージョンに応じて、libdriver.a[SysCtlPeripheralEnable] を呼び出すか、
ROM内API[ROM_SysCtlPeripheralEnable]を呼び出すかを半自動化している。
ROMにドライバーが格納されているので、 IAR 32KBコード制限版でも、なかなかのプログラムが
つくれます。サンプルプログラム4本がいい例となっています。
残念なところ
1. uC/OS 3がバンドルされていますが、IAR 用のHeader+Libraryのみです。
2. モーター軸のエンコーダはQEI入力ではなく、割り込み処理対応となります。
3. FLASH 書き換え回数 15000回はちょっと、不安。
http://www.luminarymicro.com/products/stellaris_evalbot.html
DigiKey で EKB-UCOS3-BNDLを購入、約4日で届きました。
Stellaris Evalbotのマイコンは ARM Cortex-M3 LM3S9B92 80MHz
256KB FLASH, 96KB RAMで、Cortex-M3でEther/USBがあるのは嬉しい。
開発環境を調査すると
1. IAR ARM KickStart Edtion (32KB コード制限版)
2. Code Sourcey G++ Lite版 (Free)
3. LM Flash Programmer(Free)
Stellarisの特徴--ソフトウエアに自信があり。
http://www.luminarymicro.com/products/software_updates.html
すごいのは、ROMにDriverが書き込まれている
メモリマップを示すと
$0000.0000 FLASH (256KByte)
$0100.0000 ROM (Driver/Boot Loader支援)
$2000.0000 SRAM (96Kbyte)
$4000.0000 I/O REG
$E000.0000 SYS REG
といったかんじ。
ROM APIは、たとえば
#define TARGET_IS_TEMPEST_RB1
#include <drivelib/rom.h>
#include <drivelib/rom_map.h>
として
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
とすると、ROMのバージョンに応じて、libdriver.a[SysCtlPeripheralEnable] を呼び出すか、
ROM内API[ROM_SysCtlPeripheralEnable]を呼び出すかを半自動化している。
ROMにドライバーが格納されているので、 IAR 32KBコード制限版でも、なかなかのプログラムが
つくれます。サンプルプログラム4本がいい例となっています。
残念なところ
1. uC/OS 3がバンドルされていますが、IAR 用のHeader+Libraryのみです。
2. モーター軸のエンコーダはQEI入力ではなく、割り込み処理対応となります。
3. FLASH 書き換え回数 15000回はちょっと、不安。
登録:
投稿 (Atom)