/****************************************************************************/ /* */ /* AP-SH2F-1A サンプルプログラム */ /* メイン処理 */ /* */ /* Copyright :: ㈱アルファプロジェクト */ /* Cpu :: SH7051 */ /* Language :: GCC */ /* File Name :: main.c */ /* */ 上記のソースプログラムに、#include "myfunc.h" を追記した。RIKIYA 2001/08 /****************************************************************************/ #include "sh7050s.h" #include "myfunc.h" void sci1_init( unsigned short, unsigned char, unsigned char, unsigned char ); short sci1_putc( unsigned char ); short sci1_getc( void ); void boot(void); void __main(void); int main(void); void sectionInit(void); void cmt0_init(void); void int_cmi0(void); void atu0_init(void); void int_atu0(void); void set_imask( int ); /************************************/ /* 割り込みマスクレベル設定 */ /************************************/ void set_imask( int imask ) { int srreg; imask <<= 4; imask &= 0x00f0; asm(" stc sr,%0 ":"=r"(srreg):); srreg &= 0xffffff0f; srreg = srreg | imask; asm(" ldc %0,sr "::"r"(srreg)); } /************************************/ /* __main(ダミー) */ /************************************/ void __main(void) { } /************************************/ /* CPU初期化 */ /************************************/ void boot(void) { /* バス設定 */ BSC.BCR1.WORD = 0x000f; /* CS0 16bit */ /* CS1 16bit */ /* CS2 16bit */ /* CS3 16bit */ BSC.BCR2.WORD = 0x0000; /* CS0 アイドルサイクル 0 */ /* CS1 アイドルサイクル 0 */ /* CS2 アイドルサイクル 0 */ /* CS3 アイドルサイクル 0 */ /* CS0 連続アクセスアイドルサイクル 0 */ /* CS1 連続アクセスアイドルサイクル 0 */ /* CS2 連続アクセスアイドルサイクル 0 */ /* CS3 連続アクセスアイドルサイクル 0 */ /* CS0 アサート拡張 なし */ /* CS1 アサート拡張 なし */ /* CS2 アサート拡張 なし */ /* CS3 アサート拡張 なし */ BSC.WCR1.WORD = 0x0001; /* CS0 Wait 1 */ /* CS1 Wait 0 */ /* CS2 Wait 0 */ /* CS3 Wait 0 */ /* IOポート設定 */ PFC.PACR.WORD = 0xffff; /* PA アドレスバス */ PFC.PBCR.WORD = 0xbfc0; /* PB アドレスバス */ PFC.PCCR.WORD.H = 0xC000; /* PC15~8 汎用入出力 */ PFC.PCCR.WORD.L = 0x1fff; /* PC バス制御端子 */ PFC.PDCR.WORD = 0xffff; /* PD データバス */ PFC.PECR.WORD = 0x0000; /* PE15~0 汎用入出力 */ PFC.PFCR.WORD.H = 0x0055; /* PF バス制御端子 */ PFC.PFCR.WORD.L = 0x00aa; /* PF バス制御端子 */ PFC.PGCR.WORD.H = 0x0aaa; /* PG */ PFC.PGCR.WORD.L = 0xbf80; /* PG */ PFC.PAIOR.WORD = 0xffff; /*[OUT]PA15~PA0 */ PFC.PBIOR.WORD = 0xffff; /*[OUT]PB11~PB0 */ PFC.PCIOR.WORD = 0xffff; /*[OUT]PC14~PC0 */ PFC.PDIOR.WORD = 0xffff; /*[OUT]PD15~PD0 */ PFC.PEIOR.WORD = 0xffff; /*[OUT]PE14~PE0 */ PFC.PFIOR.WORD = 0xffff; /*[OUT]PF7~PF0 */ PFC.PGIOR.WORD = 0x0000; /*[IN]PG15~0 */ sectionInit(); /* メモリ初期化 */ main(); } /************************************/ /* MAIN関数 */ /************************************/ int main() { char data; cmt0_init(); /* CMT0初期化 */ atu0_init(); /* ATU0初期化 */ sci1_init(38400, 8, 0, 1); /* SCI1初期化 */ set_imask(0); /* 割り込みマスク解除 */ for(;;) { data = sci1_getc(); /* 1文字受信 */ if ( 0 <= data ){ sci1_putc(data); /* 1文字送信 */ } } return 0; } /************************************/ /* セクション初期化 */ /************************************/ extern char etext, sdata, edata, bss_start, end; void sectionInit() { char *src; char *dst; /* 初期化データ領域 */ src = &etext; dst = &sdata; while (dst < &edata) { *dst++ = *src++; } /* 未初期化データ領域 */ for ( dst = &bss_start; dst < &end; dst++ ) { *dst = 0; } } /************************************/ /* CMT0初期化 */ /************************************/ void cmt0_init(void) { INTC.IPRG.WORD |= 0x0070; /* CMT0 InterruptLevel = 7 */ CMT.CMSTR.WORD &= ~0x0001; /* CMCNTカウント停止 */ CMT0.CMCSR.WORD = 0x0040; /* クロックφ/8, 割込み許可 */ CMT0.CMCOR = 0x6000-1; /* (19.6608MHz/8)/24576 = 10msec */ CMT.CMSTR.WORD |= 0x0001; /* CMCNTカウント開始 */ } /************************************/ /* CMT0割り込み */ /************************************/ #pragma interrupt void int_cmi0(void) { static char flag; CMT0.CMCSR.WORD &= ~0x0080; /*CMFクリア */ /* ポートのON/OFF */ if( 0 != flag ) { PC.DR.WORD |= 0x7f80; flag = 0; } else { PC.DR.WORD &= ~0x7f80; flag = 1; } } /************************************/ /* ATU タイマーイニシャル */ /************************************/ void atu0_init(void) { unsigned char dummy; INTC.IPRD.WORD |= 0x0007; /*ATU13(CH1)優先レベルを7に設定 */ /*ATU1を5msフリーランニングタイマに設定*/ ATU.PSCR1.BYTE = 0; /*分周比率 1:1 */ ATU.TSTR.WORD = 0x0000; /*カウント動作停止 */ ATU1.TCR.BYTE = 0x05; /*立ち上がりエッジカウント */ /*Φ/32でカウント */ ATU1.TIERB.BYTE = 0x40; /*オーバーフローインターラプト許可*/ dummy = ATU1.TSRB.BYTE; /*ダミーリード */ ATU1.TSRB.BYTE = 0 ; /*ステータスクリア */ ATU1.TCNT = 0xf400; /*5ms/((1s/19.6608MHz)×32)) */ /*アップカウントのため0x10000から引く*/ ATU.TSTR.WORD = 0x0002 ; /*カウンタ1スタート */ } /********************************************/ /* ATU0タイマー割り込み */ /********************************************/ #pragma interrupt void int_atu0(void) { static char flag; unsigned char wk; wk = ATU1.TSRB.BYTE; /*ダミーリード*/ ATU1.TSRB.BYTE = 0x00; /*OVIクリア*/ ATU1.TCNT = 0xf400; /*5ms/((1s/19.6608MHz)×32)) */ /*アップカウントのため0x10000から引く*/ if( flag == 0 ) { PE.DR.WORD = 0xffff; flag = 1; } else { PE.DR.WORD = 0x8000; flag = 0; } }