忘備録-備忘録

技術的な備忘録

RX210のPWMを使い音声再生

2017-04-16 13:49:18 | RX210
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;
}



最新の画像もっと見る

コメントを投稿