忘備録-備忘録

技術的な備忘録

RX62NのUSB機能を使う

2015-12-06 21:29:51 | RX62N
RX62NのUSB機能を使用してRX62NをCDCデバイスにするプログラムです。基本となる部分はルネサスエレクトロニクスのサンプルプログラムを利用しました。
関数化してあるので簡単に使用することができます。

e2 studioのエクスポートしたプロジェクト

サンプルプログラム
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <machine.h>
  4. #include "iodefine.h"
  5. #include ".\USBStack\usb_hal.h"
  6. #include ".\USBStack\CDC\usb_cdc.h"
  7. void _INIT_IOLIB( void );    //プロトタイプ宣言
  8. int main(void)
  9. {
  10.     int data;
  11.     unsigned char c,buf[256];;
  12.     SYSTEM.SCKCR.BIT.ICK = 0x00;        //システムクロック x16 96MHz
  13.     SYSTEM.SCKCR.BIT.PCK = 0x01;        //周辺クロック   x4  48MHz
  14.     SYSTEM.SCKCR.BIT.BCK = 0x01;        //外部バスクロック x4  48MHz
  15.     /*Initialise the USB CDC Class*/
  16.     USBCDC_Init();
  17.     setpsw_i();                            //割込み許可 clrpsw_i()割込み禁止
  18.     _INIT_IOLIB();                        // printf(),scanf()の初期化
  19.     while(false == USBCDC_IsConnected());    //USB接続待ち
  20.     c = charget();        //ホストから1文字入力
  21.     printf("RX62N USB cdc test program.\n");
  22.     while(1)
  23.     {
  24.         c = charget();        //ホストから1文字入力
  25.         charput(c);        //ホストに1文字出力
  26.         printf("Input string:");
  27.         scanf("%s",buf);
  28.         printf("string: %s\n",buf);
  29.     }
  30. }

RX210で矩形波を出力する

2015-12-06 21:14:46 | RX210
RX210のタイマMTU0を使用してをMTIOC0A端子(PORT3-BIT4)から一定周波数の矩形波を出力するプログラムのサンプルです。

  1. #include "iodefine.h"
  2. #include <machine.h>
  3. #define PCLK 125                // 周辺機器のクロック設定 125kHz
  4. /*
  5. タイマの設定
  6. */
  7. void initMTU0cmt(void)
  8. {
  9.     SYSTEM.PRCR.WORD = 0x0A502;
  10.     MSTP(MTU0) = 0;                //MTU0 モジュールスタンバイ解除
  11.     SYSTEM.PRCR.WORD = 0x0A500;
  12. /* 端子の設定 */
  13.     PORT3.PODR.BIT.B4 = 0;        // P34 MTIOC0A 出力初期値
  14.     PORT3.PDR.BIT.B4 = 1;        // P34 出力設定
  15.     PORT3.PMR.BIT.B4 = 0;        // P34ポートとして使用
  16.     MPC.PWPR.BIT.B0WI = 0;        // PFSWE書き込み可
  17.     MPC.PWPR.BIT.PFSWE = 1;        // PFSレジスタへの書き込み可
  18.     MPC.P34PFS.BIT.PSEL = 1;    // P34をMTIOC0Aとして使用
  19.     MPC.PWPR.BIT.PFSWE = 0;        // PFSレジスタへの書き込み禁止
  20.     PORT3.PMR.BIT.B4 = 1;        // P34周辺機器として使用
  21. /* MTUタイマの設定 */
  22.     cycle = PCLK * 1000UL / 1000UL / 2UL;
  23.     MTU.TSTR.BIT.CST0 = 0x00;    //MTUカウント停止
  24.     MTU0.TCR.BIT.TPSC = 0x00;    // CLK PCLK/1 でカウント
  25.     MTU0.TCR.BIT.CCLR = 0x02;    //TCNT0はTGRBのコンペアマッチでクリア
  26.     MTU0.TMDR.BIT.MD = 0x00;    //タイマーノーマルモード
  27.     // 出力波形の設定
  28.     MTU0.TIORH.BIT.IOA = 0x03;    // MTIOC0A初期出力はLow出力コンペアマッチでトグル出力
  29. //    MTU0.TIORH.BIT.IOA = 0x00;    // MTIOC0A 出力禁止
  30.     MTU0.TIORH.BIT.IOB = 0x00;    // MTIOC0B 出力禁止
  31.     MTU0.TGRA = 0;                //出力ON-OFFのタイミング
  32.     MTU0.TGRB = 0;                //周波数の設定
  33.     MTU0.TCNT = 0;                //カウンタクリア
  34.     MTU.TSTR.BIT.CST0 = 0x00;    //タイマ停止
  35. }
  36. /*
  37. 波形の出力
  38.   引数 周波数
  39.  */
  40.  void setFrequency(int Frequency)
  41.  {
  42.      int sycle;
  43.      if(Frequency == 0) {
  44.         MTU.TSTR.BIT.CST0 = 0x00;        //タイマストップ
  45.      } else {
  46.         sycle = PCLK * 1000UL / Frequency / 2UL;
  47.         //MTU0.TCNT = 0;                //カウンタクリア
  48.         MTU0.TGRB = sycle;
  49.         MTU.TSTR.BIT.CST0 = 0x01;    //タイマスタート
  50.      }
  51.  }
  52. void main(void)
  53. {
  54.     unsigned int n=0;
  55. /* クロックは速いほうが正確な周波数になる */
  56.     //change_oscillation_PLL();            // クロックソースPLL
  57.     initMTU0cmt();
  58.     setFrequency(1000);                    // 1kHz出力
  59.     while(1) {
  60. /* ハードウェアで波形出力するのでプログラムでは何もしなくてもよい */
  61.     }
  62. }

RXマイコンでprintfを使う

2015-12-06 20:27:38 | RX210
開発環境はe2 studioでルネサスエレクトロニクス製のCコンパイラを使用しています。やはりprintf()が使えると開発に便利なのでprintf()を動作させる方法を調べてみました。
printf()ないでmalloc()を使用しているらしくヒープ領域が必要です。プロジェクト生成のウィザードでヒープ領域を設定します。どのくらい必要かは調べていません。


次に示すコードlowsrc.cを追加します。このファイルの最後に1文字分の入出力を行う関数charput(),charget()にコードを追加します。lowsrc.cはHEW開発環境では自動的に生成されるらしいです?。
main()関数かreset_program.c()内でlowsrc.cファイル内の入出力初期化用の関数_INIT_IOLIB()を呼び出します。

  1. void _INIT_IOLIB( void );
  2. main()
  3. {
  4.     _INIT_IOLIB();
  5.        .
  6.        .
  7.     printf("Hello world!\n");
  8.        .
  9.        .
  10. }

lowsrc.c