TiのC2000リアルタイム制御マイコンの勉強を始めました。

パワエレ制御専用の高性能32bitマイコンです。

専用とだけあって制御に特化した機能盛り沢山なマイコン(例えばPWMの出し方多彩、割込み豊富)ですが、まず使い方がわかりませんので、勉強していきたいと思います。

mbedやArduinoなど、開発がわりと優しめのマイコンばかり触れてきたため、定義をしっかり設定したり、レジスタを操作したりと、より深い部分を操作することは敷居が高く感じます。

まずは、開発環境であるCCS(Code Composer Studio)の導入から、電子工作分野のHello WorldであるLチカをやってみたいと思います。

具体的には評価ボードの基板(controlCARD)上のLD3(赤色)をタイマー割り込みで1秒毎に点滅させます。

早速、CCSの使い方でつまずいてましたw

環境

  • CCS9.2.0 Build 9.2.0.00013
  • Windows10 Pro バージョン1809 64bit
  • controlSUITE v3.4.9

参考

TMS320C2000:Piccolo MCUのソフトウェア開発入門

http://www.tij.co.jp/jp/lit/an/jaja230a/jaja230a.pdf

JAJA230A-2012年8月

小幡 智 氏著

この資料を参考にさせていただいております。非常に良くできた資料で、日本語の資料が少ない中、とても助かりました。

資料の作成が2012年とあり、7年前と少々古いですがCCS9.2.0でも問題ありませんでした。

資料中ではCCS5を使われてます。

記載したプログラムもこの資料から引用させていただきました。

Lチカプログラムほか、ePWM(HRPWM含む)やADコンバータなども掲載されています。

準備

CCSのダウンロード

CCSは開発環境です。

参考資料ではCCS5を使用していますが、私は2019年12月時点で最新のCCS9.2.0を使ってみました。

以下からダウンロードできます。

サイズが大きく、丸ごとダウンロードするofflineインストーラとインストールしながらダウンロードするwebインストーラの2種類がありますが、どちらでも構いません。

controlSUITEのダウンロード

controlSUITEはヘッダーファイルやサンプルや回路図などの情報をまとめたアプリケーションです。

データシート、リファレンスノート、回路図、その他資料、さらにはそれらのバージョン管理などをユーザーが管理していましたが、それでは大変なのでTiがまとめてくれたのがこれです。

以下からダウンロードできます。

プログラムを動かすには、controlSUITEをインストールしてできるフォルダ(ヘッダーファイルや、その他重要なデータ)をワークスペースにコピーする必要がありますので、インストール必須です。結構重いですが。

また、評価ボードの回路図もcontrolSUITEのフォルダに入っています。

使うマイコンなど

評価ボード : F28035 Piccolo Experimenter’s Kit

型名 : TMDSDOCK28035

このベースのボードは様々なcontrolCARDを挿せるようになっています。

今回は28035のcontrolCARDがセットになった実験用キットを使用します。

日本語と英語のページの情報が若干違うので、両方リンクを載せておきます。

動作確認の時、ベースボードの何pinに出力するか確認したいですが、ベースボードのシルク印刷が対応しています。

つまり、GPIO0を確認したいならシルクでGPIO00のpinを当たれば良いです。(シルクは「00」と書いてあります)

回路図、部品表、基板図面はcontrolSUITEをインストールした時の以下のフォルダにあります。

C:\ti\controlSUITE\development_kits~ExperimentersKits\DIM100ExperimentersKit-HWdevPkg_v2_0\R3

また、PCとはUSB接続しデバッグしますが、このボードのエミュレータは以下です。CCSの設定時に必要になります。上記の英語のリンクに書いてあります。

On-board XDS100v1 JTAG debug probe

Piccolo F2803x controlCARD

評価ボードとセットになっている controlCARDです。

F2803xのxにはシリーズ名が入ります。今回は28035です。

型名 : TMDSCNCD28035 R1.2

ベースボードと同じように、回路図、部品表、基板図面は以下に保存されています。

C:\ti\controlSUITE\development_kits~controlCARDs\CC2803xHWdevPkg_v2_0\R1_2

また、このcontrolCARDに載っているマイコンは以下です。

型名 : TMS320F28035

CCSを動かす

それでは、早速CCSを動かしていきます。

CCSを起動します

ワークスペースを指定

デフォルトのままとしました。

ディレクトリは日本語を含まない場所が良いです。

プロジェクト新規作成

File → New → CCS Project でプロジェクトを新規作成します。

以下画像のように設定します(黄色い丸をつけたところ)

  1. Target : 2803x Piccolo(対象のマイコンは28035なので)
  2. 評価ボードはF28035 Piccolo Experimenter’s KitなのでExperimenter’s Kitを選択する
  3. Connection : JTAGエミュレータ(デバッカ)を選択します。
    1. 評価ボードの説明にOn-board XDS100v1 JTAG debug probeの記載がある(上のサイト参照)ので、Texas Instruments XDS100v1 USB Debug Probeを選択します。
  4. Connection右のVerifyを押すと、succeededと出るので、接続が成功したことを確認します。(このとき、評価ボードをPCと接続しておきましょう)
  5. Project nameはproject0としました(何でも良いです)
  6. Empty Projects→Empty Projectを選択します。
  7. Finishを押して完了

これでproject0ができました。

ヘッダーファイル等の準備

次に、このプロジェクトで読み込むヘッダーファイル等を準備します。

controlSUITEインストール時にできたフォルダを見に行きます。

デフォルトでインストールしているなら、以下にあります。

C:\ti\controlSUITE\device_support\f2803x\v126

今回は、参考と同じv126で確認しています。以下2つのフォルダをコピーし、先程作ったproject0フォルダ(C:\Users\ユーザ名\workspace_v9_2\project0)に貼り付けます。

  • DSP2803x_common
  • DSP2803x_headers

CCSを確認すると、ツリーに先程のフォルダが追加されていることがわかります。

不要なファイルのExclude

続いて、参考資料に則り、今回のプログラムで不要なファイルのExclude設定をします。

プログラムによって必要なファイルは違いますので、どんなプログラムでも以下に示すExclude設定で良いわけではありません。

Excludeしないと重複して見に行ってしまうファイルがあるようで、デバッグ時にエラーが出ます。

DSP2803x_common/cmd/を開き、28035_RAM_lnk.cmd以外をExcludeします。

Excludeするには、右クリックしResource Configurations→Exclude from Build…をクリックします。

Select Allをクリックし、Debug,Releaseにチェックを入れ、OKを押します。

Excludeされると灰色になります。

次にSFO_TI_Build_V6.libをExcludeします。

次に画像の青色をExcludeします。

次に、DSP2803x_Headers_BIOS.cmd、28035_RAM_lnk.cmdをExcludeします。

今回のプログラムでは、自動生成された28035_RAM_lnk.cmdは使用しないため、Excludeではなく削除しても問題ないと参考には記載があります。(私は削除していません)

インクルードパスの設定

次に、インクルードパスを設定します。

上のメニューバーからProject→Propertiesを開きます。

Build→C2000 Compiler→Include Optionsを開きます。

+アイコンをクリックします。

Workspaceをクリックします。

DSP2803x_common – includeとDSP2803x_headers – includeを選択し、OKをクリックします。(複数選択します)

追加されました。Apply and Closeで閉じます。

main.c(空っぽ)の作成

main.cを作成します。

File→New→Source Fileを選択します。

Source fileはmain.cという名前にします。(何でも良いです)

これで空っぽのmain.cができましたので、次はプログラムを書き込んでいきます。

書き込むプログラム

参考からプログラムを引用させていただいていますが、コメントを適宜追加しています(^^)

今回はF28035 Piccolo Experimenter’s Kitを使っているので

//#define LAUNCH_PAD //When using C2000 LaunchPad, Uncomment this line.

//#define USE_F28069 //When using F28069, Uncomment this line.

の2行をコメントアウトします。

これらのdefineはLaunchPad(今回のとはまた別の評価キットです)とF28069を使用する時に有効になるので、今回は不要です。

プログラムでは #else の部分が有効になります。

後半でデバッグを開始すると、使用しない部分は灰色になるのでわかると思います(^^)(#ifdefの部分が灰色になります)

/*
* main.c
*
*  Created on: 2019/12/10
*      Author: *******
*/

#include "DSP28x_Project.h" //This is necessary if you use peripheral header file.
//#define LAUNCH_PAD //When using C2000 LaunchPad, Uncomment this line.
//#define USE_F28069 //When using F28069, Uncomment this line.

interrupt void CpuTimer0ISR(void);

//===================================
//main routine
//===================================
void main(void){

 // Initialize System Control:
 // PLL, WatchDog, enable Peripheral Clocks
 // This example function is found in the DSP2803x_SysCtrl.c file.
    InitSysCtrl();

 // Clear all interrupts and initialize PIE vector table:
 // Disable CPU interrupts
    DINT;

 // Initialize the PIE control registers to their default state.
 // The default state is all PIE interrupts disabled and flags
 // are cleared.
 // This function is found in the DSP2803x_PieCtrl.c file.
    InitPieCtrl();

 // Disable CPU interrupts and clear all CPU interrupt flags:
    IER = 0x0000;
    IFR = 0x0000;

 // Initialize the PIE vector table with pointers to the shell Interrupt
 // Service Routines (ISR).
 // This will populate the entire table, even if the interrupt
 // is not used in this example.  This is useful for debug purposes.
 // The shell ISR routines are found in DSP2803x_DefaultIsr.c.
 // This function is found in DSP2803x_PieVect.c.
    InitPieVectTable();

 // Interrupts that are used in this example are re-mapped to
 // ISR functions found within this file.
    EALLOW;        // This is needed to write to EALLOW protected register

    PieVectTable.TINT0 = CpuTimer0ISR;

    EDIS;          // This is needed to disable write to EALLOW protected registers

    //GPIO Init
    EALLOW;        // This is needed to write to EALLOW protected register

    #ifdef  LAUNCH_PAD
        GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;  // GPIO0 = GPIO mode
        GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;  // GPIO1 = GPIO mode
        GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;  // GPIO2 = GPIO mode
        GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0;  // GPIO3 = GPIO mode
        GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;   // GPIO0 = Output
        GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;   // GPIO1 = Output
        GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;   // GPIO2 = Output
        GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;   // GPIO3 = Output
    #else
     // LD3 connected to GPIO34
        GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;  // GPIO34 = GPIO mode
        GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;   // GPIO34 = Output
    #endif
        EDIS;     // This is needed to disable write to EALLOW protected registers

     // Timer Configuration
        InitCpuTimers();

    #ifdef   USE_F28069
        ConfigCpuTimer(&CpuTimer0, 80, 1000000);
    #else
     // CPU Freq = 60MHz
     // 1000000us = 1sec
        ConfigCpuTimer(&CpuTimer0, 60, 1000000);
    #endif
        IER |= M_INT1;
        PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

     // Timer Start
        CpuTimer0Regs.TCR.all = 0x4000;

     // Enable Interrupt
        EINT;

        while(1);
}
//===================================
//end main routine
//===================================

//===================================
//interrupt
//===================================
interrupt void CpuTimer0ISR(void){
    #ifdef  LAUNCH_PAD
        GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1;
        GpioDataRegs.GPATOGGLE.bit.GPIO1 = 1;
        GpioDataRegs.GPATOGGLE.bit.GPIO2 = 1;
        GpioDataRegs.GPATOGGLE.bit.GPIO3 = 1;
    #else
        GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;  // toggle 0 or 1
    #endif
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
//===================================
//end interrupt
//===================================

Lチカする

やっと動かせるところまで来ました(^^)

評価ボードがPCと接続されていることを確認します。

確認ができたら、虫マーク🐞をクリックし、デバッグを開始します。

Resumeをクリックすると、基板上のLD3が1秒毎に点滅することが確認できます。

Resumeで動作させ、Registers→Continuous Refreshでレジスタの変化がリアルタイムに見れます(今回は1秒間隔で見れる)

リアルタイムに変化が見れるときと見れない時があります。(止まって動かない。そんな時はCCS再起動)

RAMに書き込まれただけなので、評価ボードの電源を落とすとプログラムも消えます。(動作しなくなります)

その他

プロパティでマイコンの種類を変更すると自動的に28035_RAM_lnk.cmdのExcludeが解除されデバッグが失敗することがありました。そんなときは再度それをExcludeすれば通るようになります。

(まあ、まず変更することは無いですけどね)

以上(^^)