RX210のPORT3のBIT4にスピーカを接続しPWMを使用して、音声データを出力するプログラムです。割り込みを使用して1周期ごとにパルスの幅を変更します。
#include "iodefine.h" #include <machine.h> #include "voice.h" //音声データの配列 #include "vect.h" #define PCLK 25000 // 周辺機器のクロック設定 25MHz /* クロック周波数を50MHzに変更 */ void change_oscillation_PLL(void) { unsigned int i; SYSTEM.PRCR.WORD = 0xA507; SYSTEM.VRCR = 0x00; SYSTEM.MOFCR.BYTE = (0x30); SYSTEM.MOSCWTCR.BYTE = (0x0D); SYSTEM.MOSCCR.BYTE = 0x00; while (0x00 != SYSTEM.MOSCCR.BYTE); for (i = 0; i < 100; i++) nop(); SYSTEM.PLLCR.WORD = (0x0901); SYSTEM.PLLWTCR.BYTE = (0x09); SYSTEM.PLLCR2.BYTE = 0x00; for (i = 0; i < 100; i++) nop(); SYSTEM.OPCCR.BYTE = (0x00); while (0 != SYSTEM.OPCCR.BIT.OPCMTSF); SYSTEM.SCKCR.LONG = 0x21821211; while (0x21821211 != SYSTEM.SCKCR.LONG); SYSTEM.BCKCR.BYTE = 0x01; while (0x01 != SYSTEM.BCKCR.BYTE); SYSTEM.SCKCR3.WORD = (0x0400); /* PLL */ while ((0x0400) != SYSTEM.SCKCR3.WORD); SYSTEM.PRCR.WORD = 0xA500; } /* タイマの設定 MTU0 */ void initMTU0pwm(void) { SYSTEM.PRCR.WORD = 0x0A502; MSTP(MTU0) = 0; //MTU0 モジュールスタンバイ解除 SYSTEM.PRCR.WORD = 0x0A500; /* 端子の設定 */ PORT3.PODR.BIT.B4 = 0; // P34 MTIOC0A 出力初期値 PORT3.PDR.BIT.B4 = 1; // P34 出力設定 PORT3.PMR.BIT.B4 = 0; // P34ポートとして使用 MPC.PWPR.BIT.B0WI = 0; // PFSWE書き込み可 MPC.PWPR.BIT.PFSWE = 1; // PFSレジスタへの書き込み可 MPC.P34PFS.BIT.PSEL = 1; // P34をMTIOC0Aとして使用 MPC.PWPR.BIT.PFSWE = 0; // PFSレジスタへの書き込み禁止 PORT3.PMR.BIT.B4 = 1; // P34周辺機器として使用 /* MTUタイマの設定 */ MTU.TSTR.BIT.CST0 = 0x00; //MTUカウント停止 MTU0.TCR.BIT.TPSC = 0x00; // CLK PCLK/1 でカウント MTU0.TCR.BIT.CCLR = 0x02; // TCNT0はTGRBのコンペアマッチでクリア MTU0.TMDR.BIT.MD = 0x02; // タイマーPWMモード1 // 出力波形の設定 MTU0.TIORH.BIT.IOA = 0x05; // MTIOC0A 初期出力はHigh出力コンペアマッチでLow出力 MTU0.TIORH.BIT.IOB = 0x06; // MTIOC0B 初期出力はHigh出力コンペアマッチでHigh出力 MTU0.TIORL.BIT.IOC = 0x05; // MTIOC0C 初期出力はHigh出力コンペアマッチでLow出力 MTU0.TIORL.BIT.IOD = 0x06; // MTIOC0D 初期出力はHigh出力コンペアマッチでHigh出力 MTU0.TGRA = 0; // MTIOC0Aデューティー比 MTU0.TGRB = 1563; // MTU0 周波数 15994.9Hz サンプリング周波数設定 // MTU0.TGRB = 1136; // MTU0 周波数 22007.0Hz MTU0.TGRC = 0; // MTIOC0Cデューティー比 MTU0.TGRD = 1563; // MTU0 周波数 MTU3.TGRBと同じ値に // MTU0.TGRD = 1136; // MTU0 周波数 22007.0Hz MTU0.TCNT = 0; // カウンタクリア IR(MTU0, TGIB0) = 0; // 割り込みフラグクリア IEN(MTU0, TGIB0) = 1; // Enable TGIB0 IPR(MTU0, TGIB0) = 8; // Set interrupt priority level MTU0.TIER.BIT.TGIEB = 1; // TGIEB割り込み許可 MTU.TSTR.BIT.CST0 = 0x01; // タイマ動作 } //音声データ内のどの位置まで再生したか unsigned long pos; void main(void) { change_oscillation_PLL(); initMTU0pwm(); pos = 0; setpsw_i(); // 割込み許可 割込み禁止はclrpsw_i() while (1) { /* ハードウェアで波形出力するのでプログラムでは何もしなくてもよい */ } } // MTU0 TGIB0 割り込みルーチン #include "iodefine.h" void Excep_MTU0_TGIB0(void) { MTU0.TGRA = voice[pos] >> 5; pos++; if (pos > 50570) pos = 0; }
※コメント投稿者のブログIDはブログ作成者のみに通知されます