GR-SAKURAからFM音源チップにマスタークロックを供給するため、RXマイコンのタイマを使って4MHzのパルスを生成することにしました。じつは今までGR-SAKURAはRXduinoライブラリと特電HALライブラリでしか使ったことがなかったのですが、ハードウェアマニュアルを読んでみるとRXマイコンのタイマ(MTU)ってSHのとほぼ同じものですね。これならすぐ使えるわ!と思ってサクサクっと組んでみたら…動かない。
(´・ω・`)ショボーン
どうも、RXは周辺機能をつかうまえに MSTP( MTU3 ) = 0; みたいにモジュールストップ解除をしないと、レジスタへのアクセス自体もできないらしい。まあ、消費電力を抑えるために各ペリフェラルごとに有効/無効できるのは良いことですね。ちなみに、割り込みレベルの設定と割り込み有効化も、IPR(MTU3,TGIA3) = 6; IEN(MTU3,TGIA3) = 1; みたいにするらしい。これらはいずれも実体はレジスタのビットフィールドだけどマクロが用意されているので使った方が見やすいですね。
あと、RXは多重化されてるピン機能の選択をするレジスタがちょっとややこしいかな。SHはPFCで一元管理されてて分かりやすかったのに…
で、めでたく4MHzのパルスの出力に成功
void mtu_init(void) { /* PC7をMTIOC3Aに設定 */ MPC.PWPR.BIT.B0WI = 0; // ピン機能選択の MPC.PWPR.BIT.PFSWE = 1; // プロテクト解除 MPC.PC7PFS.BIT.PSEL = 0x01; // PC7をMTIOC3Aに設 MPC.PWPR.BIT.PFSWE = 0; // ピン機能選択の MPC.PWPR.BIT.B0WI = 1; // プロテクト設定 PORTC.PMR.BIT.B7 = 1; // PC7は周辺機能として使用 SYSTEM.PRCR.WORD = 0xA502; // プロテクト解除 MSTP(MTU) = 0; // MTU (MTU0〜MTU5)のストップ状態解除 SYSTEM.PRCR.WORD = 0xA500; // プロテクト設定 /* MTU3のTCNT動作停止 */ MTU.TSTR.BIT.CST3 = 0; /* TCNTクリア */ MTU3.TCNT = 0x0000; /* カウンタクロックとカウンタクリア要因の設定 */ // GR-SAKURAでは、外部発振子 12MHz, // PLLCR.STC=16(16逓倍), PLLCR.PLIDIV=0(1分周), SCKCR.PCKB=2(4分周) // より、MTUのPCLKは 12*16/4 = 48MHz MTU3.TCR.BIT.TPSC = 0; // カウンタクロック: PCLK/1 = 48MHz MTU3.TCR.BIT.CKEG = 0; // 立ち上がりエッジでカウント MTU3.TCR.BIT.CCLR = 1; // TGRAのコンペアマッチでTCNTクリア /* PWMモード1 */ MTU3.TMDR.BYTE = 0x02; /* 波形出力レベルの選択 */ MTU3.TIORH.BIT.IOA = 1; // 初期状態で0出力 周期コンペアマッチで0出力 MTU3.TIORH.BIT.IOB = 2; // デューティコンペアマッチで1出力 /* 周期とデューティーの設定 */ MTU3.TGRA = 11; // 周期 1/4MHz = 250ns (48MHz/12 =4MHz) MTU3.TGRB = 5; // デューティー 125ns /* MTU3のTCNT動作開始 */ MTU.TSTR.BIT.CST3 = 1; }