Go to the Home Page

micro computer


Renesas RX210
hwsetup.c

#include "iodefine.h"

/*-------------------------------------------------------------------------------
	関数名		: set_main_clk
	内容	 	: CPU CLOCK の初期化
	引数		: 無し
	戻値		: 無し
	更新日		: 2017/08/16
-------------------------------------------------------------------------------*/
void set_main_clk(void){

	unsigned int i; 		
	// クロック発生 ( HOCO 50MHz発振 )
	SYSTEM.PRCR.WORD = 0xA507;	    //①プロテクト解除
	SYSTEM.VRCR = 0x00;		        //②VRCRレジスタに0x00を書き込む
	SYSTEM.HOCOCR2.BYTE   = 0x03;	//③50MHzを選択
	SYSTEM.HOCOWTCR2.BYTE = 0x03;	//④発振安定待機時間の設定(9216cyc)
	SYSTEM.HOCOCR.BYTE    = 0x00;	//⑤HOCOを動作
	for( i = 0 ; i<1750 ; i++ );	//⑥発振安定待機時間(350μs)
	// 動作電力制御モード/クロック分周比/システムクロック切換え
	SYSTEM.OPCCR.BYTE  = 0x00;		//⑦動作電力制御モード設定(高速動作モード)	
	while( SYSTEM.OPCCR.BIT.OPCMTSF );//⑧動作電力制御モード遷移完了待ち													
	SYSTEM.SCKCR.LONG  = 0x10821115;  //⑨内部クロック分周比を設定
	while( SYSTEM.SCKCR.LONG!=0x10821115);//⑩内部クロック分周比の書き換え完了待ち			
	SYSTEM.SCKCR3.WORD = 0x0100;	  //⑪システムクロックを切り替え(HOCO)
	SYSTEM.PRCR.WORD   = 0xA500;	  //⑫プロテクト設定		
}

/*-------------------------------------------------------------------------------
	関数名		: set_IRQ1
	内容	 	: IRQ1 の初期化
	引数		: 無し
	戻値		: 無し
	更新日		: 2025/02/13
-------------------------------------------------------------------------------*/
void set_IRQ1(void){
	IEN(ICU,IRQ1)=0;
	//ICU.IER[0x08].BIT.IEN1=1
	IPR(ICU,IRQ1)=15;
	//ICU.IPR[65].BIT.IPR=15;
	ICU.IRQFLTE0.BIT.FLTEN1=0;
	ICU.IRQFLTC0.BIT.FCLKSEL1=3;
	PORT3.PDR.BIT.B1=0;
	MPC.PWPR.BIT.B0WI=0;
	MPC.PWPR.BIT.PFSWE=1;
	MPC.P31PFS.BIT.ISEL=1;
	MPC.PWPR.BIT.PFSWE=0;
	MPC.PWPR.BIT.B0WI=1;
	PORT3.PMR.BIT.B1=1;
	ICU.IRQCR[1].BIT.IRQMD=1;
	IR(ICU,IRQ1)=0;
	//ICU.IR[65].BIT.IR=0;
	ICU.IRQFLTE0.BIT.FLTEN1=1;
	IEN(ICU,IRQ1)=1;
	//ICU.IER[0x08].BIT.IEN1=1;
}
/*-------------------------------------------------------------------------------
	関数名		: set_IRQ3
	内容	 	: IRQ3 の初期化
	引数		: 無し
	戻値		: 無し
	更新日		: 2025/02/14
-------------------------------------------------------------------------------*/
void set_IRQ3(void){
	IEN(ICU,IRQ3)=0;
	//ICU.IER[0x08].BIT.IEN1=1
	IPR(ICU,IRQ3)=15;
	//ICU.IPR[65].BIT.IPR=15;
	ICU.IRQFLTE0.BIT.FLTEN3=0;
	ICU.IRQFLTC0.BIT.FCLKSEL3=3;
	PORT3.PDR.BIT.B3=0;
	MPC.PWPR.BIT.B0WI=0;
	MPC.PWPR.BIT.PFSWE=1;
	MPC.P33PFS.BIT.ISEL=1;
	MPC.PWPR.BIT.PFSWE=0;
	MPC.PWPR.BIT.B0WI=1;
	PORT3.PMR.BIT.B3=1;
	ICU.IRQCR[3].BIT.IRQMD=1;
	IR(ICU,IRQ3)=0;
	//ICU.IR[65].BIT.IR=0;
	ICU.IRQFLTE0.BIT.FLTEN3=1;
	IEN(ICU,IRQ3)=1;
	//ICU.IER[0x08].BIT.IEN1=1;
}
void set_CMT0(void){
	SYSTEM.PRCR.WORD=0xA502;
	SYSTEM.MSTPCRA.BIT.MSTPA15=0;
	SYSTEM.PRCR.WORD=0xA500;
	ICU.IER[3].BIT.IEN4=0;
	ICU.IPR[4].BIT.IPR=1;
	CMT0.CMCR.BIT.CKS=3;
	CMT0.CMCNT=0;
	CMT0.CMCOR=48827;
	CMT0.CMCR.BIT.CMIE=1;
	ICU.IER[3].BIT.IEN4=1;
}
void set_DA(void){
	SYSTEM.PRCR.WORD=0xA502;
	SYSTEM.MSTPCRA.BIT.MSTPA19=0;
	SYSTEM.PRCR.WORD=0xA500;
	MPC.PWPR.BIT.B0WI=0;
	MPC.PWPR.BIT.PFSWE=1;
	MPC.P03PFS.BYTE=0x80;
	MPC.P05PFS.BYTE=0x80;
	MPC.PWPR.BIT.PFSWE=0;
	MPC.PWPR.BIT.B0WI=1;
	DA.DADR0=0x0000;
	DA.DADR1=0x0000;
	DA.DACR.BYTE=0xFF;
}
void set_AD(void){
	SYSTEM.PRCR.WORD=0xA502;
	SYSTEM.MSTPCRA.BIT.MSTPA17=0;
	SYSTEM.PRCR.WORD=0xA500;
	
	MPC.PWPR.BIT.B0WI=0;
	MPC.PWPR.BIT.PFSWE=1;
	MPC.P40PFS.BYTE=0x80;
	MPC.PWPR.BIT.PFSWE=0;
	MPC.PWPR.BIT.B0WI=1;

	S12AD.ADANSA.BIT.ANSA0=1;
	S12AD.ADCSR.BIT.ADCS=2;
	S12AD.ADCSR.BIT.ADST=0x01;
	
}
void set_SCI0(void){
	SYSTEM.PRCR.WORD=0xA502;
	SYSTEM.MSTPCRB.BIT.MSTPB31=0;
	SYSTEM.PRCR.WORD=0xA500;
	
	SCI0.SCR.BYTE=0x00;
	IEN(SCI0,ERI0)=0;//append
	IEN(SCI0,RXI0)=0;//append
	
	PORT2.PDR.BIT.B1=0;
	PORT2.PDR.BIT.B0=1;
	
	MPC.PWPR.BIT.B0WI=0;
	MPC.PWPR.BIT.PFSWE=1;
	MPC.P21PFS.BYTE=0x0A;
	MPC.P20PFS.BYTE=0x0A;
	MPC.PWPR.BIT.PFSWE=1;
	MPC.PWPR.BIT.B0WI=0;
	
	PORT2.PMR.BIT.B1=1;
	PORT2.PMR.BIT.B0=1;
	
	SCI0.SMR.BIT.CKS=0;
	SCI0.SCR.BIT.CKE=0;
	SCI0.SMR.BIT.STOP=0;
	SCI0.SMR.BIT.PM=0;
	SCI0.SMR.BIT.PE=0;
	SCI0.SMR.BIT.CHR=0;
	SCI0.SMR.BIT.CM=0;
	SCI0.BRR=80;
	IPR(SCI0,)=15;//append
	SCI0.SCR.BIT.RIE=1;//append
	SCI0.SCR.BIT.TE=1;
	SCI0.SCR.BIT.RE=1;
	SCI0.SSR.BIT.ORER=0;//append
	SCI0.SSR.BIT.FER=0;//append
	SCI0.SSR.BIT.PER=0;//append
	
	IEN(SCI0,ERI0)=1;//append
	IEN(SCI0,RXI0)=1;//append
}
void set_ADT(void){
	unsigned int i;
	SYSTEM.PRCR.WORD=0xa502;
	SYSTEM.MSTPCRA.BIT.MSTPA17=0;
	SYSTEM.MSTPCRB.BIT.MSTPB8=0;
	SYSTEM.PRCR.WORD=0xa500;
	
	IEN(S12AD,S12ADI0)=1;
	IPR(S12AD,S12ADI0)=1;
	
	S12AD.ADANSA.WORD=0x0000;
	S12AD.ADANSB.WORD=0x0000;
	
	S12AD.ADEXICR.BIT.OCS=0;
	S12AD.ADEXICR.BIT.TSS=1;
	S12AD.ADCSR.BIT.ADCS=0;
	S12AD.ADCSR.BIT.ADIE=1;
	S12AD.ADSSTRT=113;
	S12AD.ADSTRGR.BIT.TRSA=10;
	S12AD.ADCSR.BIT.TRGE=1;
	S12AD.ADCSR.BIT.EXTRG=0;
	
	TEMPS.TSCR.BIT.PGAEN=0;
	TEMPS.TSCR.BIT.TSEN=0;
	TEMPS.TSCR.BIT.PGAGAIN=3;
	TEMPS.TSCR.BIT.TSEN=1;
	
	for(i=0;i<5000000;i++);
	TEMPS.TSCR.BIT.PGAEN=1;
}

/*-------------------------------------------------------------------------------
	関数名		: hw_setup
	内容	 	: ハードウェアセットアップ用関数
	引数		: 無し
	戻値		: 無し
	更新日		: 2017/08/16
-------------------------------------------------------------------------------*/
void HardwareSetup(void){
	
	set_main_clk();																// クロック設定
	set_IRQ1();
	set_IRQ3();
	set_CMT0();
	set_DA();
	set_AD();
	set_SCI0();
	set_ADT();
	return;
	
}

intprg.c void Excep_CMT0_CMI0(void){ Call_CMT0(); } void Excep_ICU_IRQ1(void){ IRQ1_get(); } void Excep_ICU_IRQ3(void){ IRQ3_get(); } void Excep_S12AD_S12ADI0(void){S12ADI0_Temp(); } void Excep_SCI0_ERI0(void){ intr_err_receive();} void Excep_SCI0_RXI0(void){ intr_receive();}
main.c #include "iodefine.h" #include "LCD.h" #include "stdio.h" #define BUFSIZE 32 typedef struct{ unsigned short rPos; unsigned short wPos; unsigned char buf[BUFSIZE]; }stSIO; stSIO mRev; extern void HardwareSetup(void); unsigned short val; unsigned char sval; unsigned short ad_val=0; char AD_end; char send_buff[20]={0}; char sendbuff[4]={0}; char c_in[2]={' '}; int rcevflag=0; void IRQ1_get(void){ PORT1.PODR.BIT.B4^=1; } void IRQ3_get(void){ PORT1.PODR.BIT.B6^=1; } void Call_CMT0(void){ PORT1.PODR.BIT.B7^=1; } void send_char(char as_data[]){ while(*as_data!='\0'){ SCI0.TDR=*as_data;//transmit data to tera while(SCI0.SSR.BIT.TEND==0){} as_data++; } } void intr_receive(void){ mRev.buf[mRev.wPos++]=SCI0.RDR; if(mRev.wPos>=BUFSIZE){ mRev.wPos=0; } } void intr_err_receive(void){ unsigned char i=0; SCI0.SCR.BIT.RIE=0; i=SCI0.SSR.BIT.ORER; i=SCI0.SSR.BIT.FER; i=SCI0.SSR.BIT.PER; i++; SCI0.SSR.BIT.ORER=0; SCI0.SSR.BIT.FER=0; SCI0.SSR.BIT.PER=0; SCI0.SCR.BIT.RIE=1; } void S12ADI0_Temp(void){ AD_end=1; ad_val=S12AD.ADTSDR; } char new_word[2]={' '}; char old_word[2]={' '}; void main(void) { int data=0; int cnt=0; int i=0; int ad_add=0; int add_data[8]={0}; int move_cnt=0; char ad_buf[8]={0}; unsigned short temp=0; sval=0x30; LCD_init(); #if 1 PORT1.PODR.BIT.B4=1; PORT1.PODR.BIT.B6=1; PORT1.PODR.BIT.B7=1; PORT1.PDR.BIT.B4=1; PORT1.PDR.BIT.B6=1; PORT1.PDR.BIT.B7=1; CMT.CMSTR0.WORD=0x0001; HardwareSetup(); #endif #if 0 while(1){} #endif #if 0 while(1){ data+=10; DA.DADR0=data; timer(100); } #endif #if 0 while(1){ val=S12AD.ADDR0; } #endif #if 0 while(1){ SCI0.TDR=sval; sval++; while(SCI0.SSR.BIT.TEND==0){} timer(100); } #endif #if 0 while(1){ val=S12AD.ADDR0; sprintf(send_buff,"AD=%04d \r\n", val); send_char(send_buff); timer(500); } #endif #if 0 while(1){ new_word[0]=c_in[0]; LCD_cursor(1); LCD_write(c_in[0]); timer(100); if(new_word[0]!=old_word[0]){ send_char(new_word); } old_word[0]=new_word[0]; } #endif #if 0 while(1){ while(rcevflag==1){ send_char(c_in); rcevflag=0; if(cnt==0){LCD_cursor(1);} if(cnt==8){LCD_cursor(2);} LCD_write(c_in[0]); cnt++; if(cnt==16){cnt=0;} } } #endif #if 0 while(1){ if(mRev.rPos!=mRev.wPos){ sendbuff[0]=mRev.buf[mRev.rPos++]; send_char(sendbuff); if(cnt==0)LCD_cursor(1); if(cnt==8)LCD_cursor(2); LCD_write(sendbuff[0]); cnt++; if(cnt==16)cnt=0; if(sendbuff[0]=='0'){ sendbuff[0]=0x13; send_char(sendbuff); send_char("*STOP*"); timer(2000); send_char("=ON="); sendbuff[0]=0x11; send_char(sendbuff); } if(mRev.rPos>=BUFSIZE){mRev.rPos=0;} } } #endif #if 0 while(1){ timer(500); TEMPS.TSCR.BIT.PGAEN=1; while(TEMPS.TSCR.BIT.PGAEN==1); ad_val=S12AD.ADTSDR; temp=((ad_val-1580)/18)+23; sprintf(ad_buf,"%04d",temp); send_char(ad_buf); send_char("\r\n"); LCD_cursor(1); LCD_struct(ad_buf); } #endif #if 1 while(1){ if(AD_end){ AD_end=0; timer(500); TEMPS.TSCR.BIT.PGAEN=1; } switch(move_cnt){ case 0: add_data[0]=ad_val; break; case 1: add_data[1]=ad_val; break; case 2: add_data[2]=ad_val; break; case 3: add_data[3]=ad_val; break; case 4: add_data[4]=ad_val; break; case 5: add_data[5]=ad_val; break; case 6: add_data[6]=ad_val; break; case 7: add_data[7]=ad_val; move_cnt=-1; break; default: break; } move_cnt++; ad_add=0; for(i=0;i<8;i++){ ad_add+=add_data[i]; } ad_add>>=3; sprintf(ad_buf,"%04d",ad_add); LCD_cursor(1); LCD_struct(ad_buf); } #endif }
LCD.c #include "iodefine.h" /*---------------------------------------------------------- 関数名 : timer 内容 : 1msxdelay秒のソフトウェアタイマ 引数 : delayの整数値 戻値 : 無し 更新日 : 2024/04/01 ------------------------------------------------------------*/ void timer(int delay){//1ms x delay int i,j; for( i=0; i>4;//上位4bit code_e(code_4b); code_4b = code & 0x0F;//下位4bit code_e(code_4b); } /*---------------------------------------------------------- 関数名 : chara_w 内容 : 4ビットの文字コード書込み 引数 : 4ビット・文字コード 戻値 : 無し 更新日 : 2024/04/01 ------------------------------------------------------------*/ void chara_w(char chara_h){//4ビットデータの文字コード書込み PORTH.PODR.BYTE =chara_h;//1行目1文字 PORTJ.PODR.BIT.B1=1;//RS:hight(DR) PORTJ.PODR.BIT.B3=1;//E:hight(書込み) timer(1);//1ms_wait; PORTJ.PODR.BIT.B3=0;//E:Low(書込み終了) timer(1);//1ms_wait; } /*---------------------------------------------------------- 関数名 : LCD_write 内容 : 文字コード(8ビット)の書込み 引数 : 文字コード(8ビット) 戻値 : 無し 更新日 : 2024/04/01 ------------------------------------------------------------*/ void LCD_write(char LCD_char){//1文字コード転送 char chara_4b; chara_4b = (LCD_char & 0xF0) >>4;//上位4bit chara_w(chara_4b); chara_4b = LCD_char & 0x0F;//下位4bit chara_w(chara_4b); } /*---------------------------------------------------------- 関数名 : LCD_init 内容 : LCDの初期化,ポートJ,Hの出力端子設定 引数 : 無し 戻値 : 無し 更新日 : 2024/04/01 ------------------------------------------------------------*/ void LCD_init(void){ int i; //出力データの設定 PORTH.PODR.BYTE =0x0F;//PH0-3:1 PORTJ.PODR.BIT.B1 =1;//PJ1(RS):1 PORTJ.PODR.BIT.B3 =0;//PJ3(E):0 //出力端子に設定 PORTH.PDR.BYTE |=0x0F;//PH0-3:OUT PORTJ.PDR.BIT.B1 =1;//PJ1(RS):OUT PORTJ.PDR.BIT.B3 =1;//PJ3(E):OUT //LCD初期化シーケンス timer(40);//40ms_wait for(i=0; i<3; i++){ //1.FuctionSet 8bitI/F-set(0x3)3回設定 code_e(0x03);//FuctionSet(DL=1:8bitI/F) } //2.FuctionSet 4bitI/F-set(0x2) code_e(0x02);////FuctionSet(DL=1:4bitI/F) //①.FuctionSet 4bitI/F-set+2行表示/5x8ドット(0x28) code_w(0x28);//FuctionSet(DL=1:4bitI/F) //(N=1:2行表示.F=1:5x8ドット) //②.FuctionSet 4bitI/F-set+2行表示/5x8ドット(0x28) code_w(0x28);//FuctionSet(DL=1:4bitI/F) //(N=1:2行表示.F=1:5x8ドット) //③.DisplayON/OFFcontrol 表示ON/カーソルON/ブリンクOFF(0x0E) code_w(0x0E);//DisplayON/OFFcontro //(D=1:表示ON,C=1:カーソルON,B=0:ブリンクOFF) //④.Display Clear(表示クリア)(0x01) code_w(0x01);;//Display Clear(表示クリア) timer(2);//2ms_wait; //⑤.EntryModeSet インクリメント/表示をシフトさせない(0x06) code_w(0x06);//EntryModeSet //(I/D=1:インクリメント,S=0:表示をシフトしない) //初期化終了 } /*---------------------------------------------------------- 関数名 : LCD_struct 内容 : 文字列の表示 引数 : 文字列("abc") 戻値 : 無し 更新日 : 2024/04/01 ------------------------------------------------------------*/ void LCD_struct(const char *str){//文字列表示 int i=0; while(*str != '\0'){//文字列 LCD_write(*str);//1文字表示 str++;//次の文字アドレス設定 i++; if(i==8){//8文字以上は表示せず break; } } } /*---------------------------------------------------------- 関数名 : LCD_cursor 内容 : 表示位置の設定 引数 : 1:1行目1文字目,2:2行目の1文字目 戻値 : 無し 更新日 : 2024/04/01 ------------------------------------------------------------*/ void LCD_cursor(int cur){//1:1行目,2:2行目の1文字目 if(cur == 1){//1行目 code_w(0x80);//1行目1文字目 } if(cur == 2){//2行目 code_w(0xC0);//1行目1文字目 } }
LCD.h void timer(int delay);//1ms x delay void code_e(char code_h);//4ビットデータのインストラクション書込み void code_w(char code);//1バイト-インストラクション書込み void chara_w(char chara_h);//4ビットデータの文字コード書込み void LCD_write(char LCD_char);//1文字コード転送 void LCD_init(void);//LCD初期化 void LCD_struct(const char *str);//文字列表示 void LCD_cursor(int cur);//1:1行目,2:2行目の1文字目