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 でプロジェクトを新規作成します。
以下画像のように設定します(黄色い丸をつけたところ)
- Target : 2803x Piccolo(対象のマイコンは28035なので)
- 評価ボードはF28035 Piccolo Experimenter’s KitなのでExperimenter’s Kitを選択する
- Connection : JTAGエミュレータ(デバッカ)を選択します。
- 評価ボードの説明にOn-board XDS100v1 JTAG debug probeの記載がある(上のサイト参照)ので、Texas Instruments XDS100v1 USB Debug Probeを選択します。
- Connection右のVerifyを押すと、succeededと出るので、接続が成功したことを確認します。(このとき、評価ボードをPCと接続しておきましょう)
- Project nameはproject0としました(何でも良いです)
- Empty Projects→Empty Projectを選択します。
- 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すれば通るようになります。
(まあ、まず変更することは無いですけどね)
以上(^^)