未分類

【LaunchPad】TI製LaunchPadの導入とLチカについてまとめてみる

どうも、はじめまして。

今回はTexas Instruments 社が提供するマイコンボードである、LaunchPadの始め方(Lチカ)をまとめてみました。

いろいろ情報はあるんですが、案外海外製マイコンって英語のマニュアルばっかりでとっつきにくいんですよね、、、

調べながらやってるので間違い等はたぶんあります。その際はコメント等で指摘いただけると幸いです。
(スマン、事情により一時コメ欄停止中)

※本記事のマイコン画像はTIホームページからの引用になります

LanchPadとは?

いわゆるリアルタイム制御用マイコン、に分類されるものらしい。

詳細は以下のTIホームページに書いてある。

組み込み向け開発:ハードウェアリソースキット

私も使い始めたばっかりなので調べ調べやってるんだけど、このマイコンの特徴を超簡潔にまとめると、

バチクソ計算能力が高い高速マイコン

といった感じ。(だとおもう)

たとえばこのマイコンで通称Lチカをやることを例えると、”草野球に大谷”かもしれない。

もちろんグレードにかなりの幅があるので一概には言えないみたいなんだけど、”リアルタイム演算用”の題目が付いたものは三角関数の計算やPWMの操作に特化したモデルで三角関数演算ユニット、なるものを積んでいるらしい。

もちろんADCやDAC、CANやUSARTなどなどめっちゃ機能はあるんですが、そこは割愛します。(俺も良く知らん)

まぁなんでこのマイコンを使うんですかっていう事なんだけど、

まぁぶっちゃけ適当にプログラム書いてもこなしてくれる速度があるから、ですかね。

これとは別のマイコンボードで同じチップを乗せたものを使ったことがあるんですが、まぁ、強かった。。。
変なところで気を使いたくないのでこれを使います。

マイコンを使用する準備を整える

まぁこんな記事書いてるんだけど、個人的にこういうマイナーな(その筋では超メジャー、とも言えるが、、、)マイコンはそこまで触ったことないんですよね。

じゃぁなんで解説なんてしてんだよって?

それは個人的に書きたいしネットの適当な情報に助けられた経験が意外にあるからです。

ツギハギでいいんですよ。ネットの情報は。新しくて何か引っかかって理解できたらそれで万々歳。最初から正しい理解を得たいなら本を買えばいいのだッ!!

てな感じ。

Arduinoなどは基本的にググればほぼ 100%、回答が見つかるのですが、今回のマイコンは情報が基本的に英語、かつあまり見つからないということで、結構手が出しにくかったりなんだったり。。。。

今後のために備忘録がてらまとめておきます。

マイコンボードを購入する

まずLaunchPadを購入します。

電子部品を取り扱う大手企業が取り扱ってる感じですね。Amazonとかでポチれないのがちょっと硬派な感じがしますね。

以下にリンクを張っておきます。

Digi-keyでも出ないことはないんですが、検索に引っかからなかったですね。

LaunchXL、という型番名?でも名前が通っているようなので、どっちか入力すれば引っかかりそうです。

私は今回TIの方から直接購入してみました。

あとで直で購入した際の手順等もまとめて置こうと思います。

商品の中身をチェック

届いたら商品の中身を確認します

今回購入したのは、LanchPad f28379D になります。

海外直送でキタっぽいですが、結構でっかい段ボールに包まれてきました。

内容物は以下のような感じ。

・マイコン本体(静電防止袋つき)
・ユーザーガイド
・ピンアサインなどをメモした用紙
・USBケーブル

届いたら袋を開けて破損などがないかどうかチェックしておきましょう。

開発環境を整える

次に開発環境を整えます。

今回使うC2000のリアルタイム制御マイコンでは、TI社製の Code Composer Studio という環境を使います。(TIのマイコン全部がこれではないらしいです。)通称CCSと呼ばれる開発環境で、Eclipse、というワークスペース環境をもとに作られているようです。

インストール手順、および日本語マニュアルは以下のサイトに記載がありました。

CCSのインストール手順について:Embedded Technology Lab.

Code Composer Studio ユーザーズマニュアル:PDF

ここでは環境整備ついては割愛します。

「マイコンに関する技術資料・サンプルプログラムの入手方法」、を手に入れる

次にマイコンに関する技術資料を手に入れます。

これがねぇ、、結構手間取りました。

というのも、マイコンの名前で検索しても、複数の方法でサンプルプロジェクト、スタートガイド等を手に入れる方法があるようで、どれが使えるやつなのかわからなかったんですよね。(結論としてはたぶん、全部使えるんだとは思うけど、、、)

今回はその1例ということで、CCSを操作して手に入れる方法を紹介します。

まずはCCSを起動します。

以下のようなウィンドウが出現した後、数秒でフォルダ選択の画面が現れます。

ここでは適当にドキュメントにフォルダを用意しておきました。

CCSにおいてはここで指定したフォルダが「ワークスペース」になります。

この後の画面でわかりますが、CCSはリアルタイム制御のテスト用に、実験中に使用する変数などをプログラム実行中に変更したりできます。

CCSはArduinoIDEのように書き込みとコンパイルだけを行うものではなく、いろいろ試すことができます。
(最近Arduinoつよつよになってきたけど、、、)

どんな環境で設定してましたか?みたいな情報を保存できるっていう感じです。

開くと以下のような画面になります。

ここで技術資料を手に入れます。

まず、「View」→「Resource Explorer」を開きます。

Resource explorerというのはCCSで取り扱うマイコンなどの情報を保存している場所のようで、いろんなマイコンの情報があります。

今回のLaunchPadはリアルタイム制御用のもので、「f28379D」というチップを積んでいますので、左のナビゲーションウィンドウからおなじ名前のものを探してクリックします。

フォルダを開くと中に以下のようなファイルがありますので、とりあえず全部開いてPDFとかでローカルに保存しておきます。

上から順に、
1:マイコンのガイド
2:リファレンスマニュアル
3:よくわからんシート
4:ファームウェアに関するガイド
5:ADCや各種通信のプログラムの記述などに関する説明
6:サンプルプロジェクトに関するガイド
7:IPCユーザーガイド

が入ってました。

とりあえず今はサンプルプログラムの使い方が欲しいので6の文書を開きました。

サンプルプログラムを手に入れる

次にサンプルプログラムを手れていきます。

このマイコンではArduinoなどとは違い、「Void loopに書き込めば動くぜ☆」てきなマイコンではないので、割り込み処理などの記述もすべて自分で行う必要があります。

が、それをいきなり新しいマイコンでやるのはだいぶハードルが高いので、TIがサンプルプログラムをすでに用意してくれているのです。

いやぁ、助かったぜ、、、、(-_-;)

Example Projects Quickstart Guide」を開くと、上部に以下のような記載があります。

簡潔にまとめると、

C2000wareソフトウェア開発キットをインストールしたときのフォルダにサンプルが含まれてるのでそれを使ってね、ということです。

C2000は変更していなければCドライブ直下のtiのフォルダに入っているはずなので、以下のようなディレクトリになるはずです。

次に実際にサンプルプロジェクトをワークスペースにインポートしていきます。

File」ー>「Import」をクリックすると以下のようなウィンドウが開きます。

Import Project を選択するとインポートの方法選択画面が出ます。

今回はCCSのプロジェクトをインポートしたいので「CCS Projevts」を選択します。

次にサンプルプロジェクトが存在するディレクトリを指定します。

Select search-directory」にtiの下にあるフォルダを選択します。

ここでディレクトリの指定先が二つあります。

どちらかを選択するかにより、サンプルが存在する場所から現在の場所へとプロジェクトをコピーするか否かが変わります。(多分重要)

C:\ti\c2000\C2000Ware_\driverlib\f2837xd\examples\cpu1:チェックを入れる

② C:\ti\c2000\C2000Ware_\device_support\f2837xd\examples\cpu1:チェック入れない

今回は上の方を選択します。

これらの違いなんですが、ざっと確認してみたところ、①、②のフォルダのいずれも、 ”プログラムの内容” については違いがないようです。

異なる点はインクルードされるファイルが個別に分けられているかどうかです。

例えば、ledを点滅させるプログラムが①と②の場所に二つあります。

それぞれのフォルダには以下のようにファイルが格納されています。

①の方には同時に読み込まれるファイルがすべてのプロジェクトでまとめてあり、②の方ではそれぞれのフォルダごとに分けて用意されている、という感じですかね。(ようわからん。)

ここからはCCSの仕様の問題だとは思いますが、インポート処理時にこれらのファイルが入ったインクルードフォルダがコピーされるかどうかはわからないので、②においてはコピーしないでください、と注意書きがありました。
(元の場所から今使用しているワークスペースへ、プロジェクトをコピーして使用)

この辺は一長一短だと思うので実際にミスしてみないとわからなそうです。

今回は元のファイルはいじらずに保存しておきローカルで書き換えたりしたかったので、今のワークスペースにコピーする①を選択します。

今Lチカをやりたいので、以下「led_blinky」のプロジェクトを選択し、「Finish」をクリックします。

(※driverlib以下にあるプロジェクトは自動でコピーが行われるようです。自動でチェックが入りました)

読み込みが始まると数秒で終了します。

終了したら上部のタブから「View」- >「Project Explorer」を選択します。

すると以下のようにインポートしたフォルダ内のファイル(と読み込んだ覚えがないファイル)が表示されます。

ファイルのアイコンにバツ印(見ればわかる赤い矢印)が付いていなければ、正しくインポート作業完了です。

マイコンにサンプルを書き込んで使ってみる

次に読み込んだプロジェクトを実際にマイコンに書き込んでみようと思います。

マイコンボードを付属のUSBケーブルでPCに接続します。

待機時のマイコンの状態確認

すでにOut of Box Demo といって、サンプルのプログラムがすでに書き込まれているらしいのですが、USBを接続した直後は以下のように点灯しました。

電源投入直後に赤青黄のLEDが数秒間点滅した後、以下のような状態に切り替わりました。(結構まぶしい)

待機状態では特に熱くなるとかはありませんでした。
(これ以前に不良品を引いて破壊しました。つないだだけで60度ぐらいになったら不良品である確率が高いです)

※ジャンパがありますが、これは出力側のモジュールに電源を供給しているものです。ないとLEDは点灯しません。
 通信側と絶縁させたい場合、このジャンパを外して個別に絶縁電源を用意してやればOKです。

CCSにおけるプログラムのコンパイル・デバッグの方法について

プログラムをデバッグ・書き込み

CCS上でのプログラムのコンパイル、デバッグ方法についてまとめておこうと思います。

プログラムのデバッグは、上部にある緑色の虫のようなマークをクリックします。

クリックすると以下のようなメモリの初期化、プログラムの書き込みに関する進捗ウィンドウが表れます。

エラーを示すポップウィンドウがでたり、コンソールにエラーメッセージが出たりしなければ特に問題ありません。

デバッグはこの内容なら数秒で終わるかと思います。

ワークスペースの説明とセットアップ

つぎにワークスペース内部のウィンドウの説明と、セットアップについて簡単にまとめます。

今回は一例としてよく使うウィンドウ設定にしました。

上記の画像では「Debug」、「Variables」、「Expressions」、「Console」の4つを表示させています。
これらは上部のタブにある、「View」からクリックすることで選択できます。

今表示させているものはどれも必須のものかと思いますが、お好みで消したり追加できます。配置も自由に調節できます。

プログラムの実行方法について

次にプログラムの実行をします。その前に上部のタブを確認します。

先ほどとは異なり、上部のタブが少し変化しているのが分かります。主に、①デバッグ前、②実行前、③実行中において変化します。よく使うボタンと役割は以下のような感じです。

緑色の矢印ボタンをクリックすれば、プログラムがマイコン上で実行されます。

サンプルプログラム:"Blinky”を実行してみる。

上記までで情報の取得、サンプルプログラムのインポート、サンプルプログラムの書き込み準備ができました。

次にこれを実行していこうと思います。

うん、エラー出た。

いいねぇ、適当にLチカのプログラムだよ☆、と言われてロードしてもなんも始まらん感じ。

さぁて、ちゃんとエラー内容見ていきますか。

翻訳すると以下のような感じ。

「デバッグセッションを開始するには、ターゲットコンフィギュレーションが必要です。ターゲット設定ファイルを新規に作成し、エディターで開きますか?」

と聞いてきてます。

つまりターゲットマイコンが設定できてねぇ、的なメッセージです。続けて「Yes」を押します。

どうやらコンフィギュレーションファイル、なるものを生成して情報を保存していおくらしい。

適当にわかりやすい名前を付けて保存します。(デフォルトからいじらない方がいいと思います。)

ファイル作成後、以下のようなウィンドウがワークスペース内に表示されます。

マイコン上のチップを選択できるので、マイコン上の該当するチップを選択します。

今回は「TMS320F28379D」が載っているLAUNCHPADなのでこのチップにチェックを入れます。

次に「Connection」を選択します。ちょっとよくわかってないんですが、多分マイコンへの書き込み等を行う接続方法だと思います。

今回のLAUNCHPADにはエミュレータなるもの搭載されているらしい。

ワイもよくわかりませんが、ググった結果をそのまま伝えると、マイコン上でプログラムを実行するための言語変換器みたいなものらしいです。

まぁたぶんPCで書いたプログラム→エミュレータ→マイコンチップへの書き込み的な感じなんだろうな。(後で調べておきます。)

ボード上を確認すると、「XDS100v2」と記載があります。なのでこれを選択し、以下のように設定しました。

次に書き込みをおこなってみます。

先ほどデバッグ方法で言った緑色の虫みたいなマークをクリックします。

すると以下のようなウィンドウが表れます。

どのCPUに書き込みますかという案内について書かれています。

適当に性能がいいマイコンを選択したんでよくわかってませんが、このマイコンはバチクソに性能が高く、二つのCPUを持っているようです。

う~ん、宝の持ち腐れwww

まぁとにかくそういうわけで、二つのCPUで分担できる、両方に書き込めるようです。Lチカのプログラムを二つのCPUに書き込んでもどうしようもないので今回はCPU1にのみ書き込みます。

虫マークのようなボタンを押したら爆速で終了しました。

以下のような画面に推移します。

無事書き込みはできたようです。

再度実行!

さて、再生マークをクリックして再度事項してみます。

いえ~いい。成功しました。

ソースコード詳しく読まずにやりましたが、いちばん右の青いLEDが0.5秒間隔で点滅しています。

ソースコードの規約などを読んでいく

はじめに公開されているサンプルコードの利用規約などをちゃんと確認していきます。

今回のデモで使用したコードはTIが提供するソースコードであり、TIが作成したということを明記した上での使用は認められています。

著作権は放棄しないけど、明記すれば使用できます。ソースコード中に記載された文章は以下の通りです。

//#############################################################################
// $TI Release: F2837xD Support Library v3.12.00.00 $
// $Release Date: Fri Feb 12 19:03:23 IST 2021 $
// $Copyright:
// Copyright (C) 2013-2021 Texas Instruments Incorporated - http://www.ti.com/
//
// Redistribution and use in source and binary forms, with or without 
// modification, are permitted provided that the following conditions 
// are met:
// 
//   Redistributions of source code must retain the above copyright 
//   notice, this list of conditions and the following disclaimer.
// 
//   Redistributions in binary form must reproduce the above copyright
//   notice, this list of conditions and the following disclaimer in the 
//   documentation and/or other materials provided with the   
//   distribution.
// 
//   Neither the name of Texas Instruments Incorporated nor the names of
//   its contributors may be used to endorse or promote products derived
//   from this software without specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// $
//#############################################################################

日本語に翻訳すると以下のような感じ。

//#############################################################################
// $TI Release: F2837xD サポートライブラリ v3.12.00.00 $STD
// $Release Date: Fri Feb 12 19:03:23 IST 2021 $
// $Copyright:
// Copyright (C) 2013-2021 Texas Instruments Incorporated - http://www.ti.com/.
//
// 本書の内容は、予告なく変更することがあります。
// このファイルは、次の条件を満たす場合に限り、再配布および使用することができます。
// 以下の条件を満たす場合に限り、ソースおよびバイナリ形式の再配布および使用が許可されます。
// 
// このような場合、「Ctrl + C」キーを押してください。
// このような場合、「CONTACT」ボタンをクリックしてください。
// 
// バイナリ形式で再配布する場合は、上記の著作権表示、この条件一覧、および以下の免責事項を再現する必要があります。
// バイナリ形式で再配布する場合は、上記の著作権表示、この条件一覧、および以下の免責事項を、バイナリ形式で提供される文書および/またはその他の資料で再現する必要があります。
// バイナリ形式で再配布する場合は、上記の著作権表示、本条件一覧、および以下の免責事項を   
バイナリ形式の再配布は、上記の著作権表示、この条件一覧、および以下の免責事項を、 // ドキュメントおよび/または配布物とともに提供されるその他の資料で再現しなければなりません。
// 
// このような場合、以下のようになります。
// このソフトウェアを使用した製品を推奨または販売促進するために、Texas Instruments Incorporated の名前およびその貢献者の名前を使用することは、書面による特別な事前の許可なしに禁止されています。
// このソフトウェアは、事前に書面による特別な許可を得ることなく、Texas Instruments Incorporated およびその貢献者の名前を、このソフトウェアから派生した製品の推奨または販売促進のために使用してはなりません。
// 
// 本ソフトウェアは、著作権者および貢献者によって提供されています。
// このソフトウェアは、著作権所有者および貢献者によって「現状のまま」提供され、いかなる明示または黙示の保証(以下を含むが、これに限定されない)も行われません。
本ソフトウェアは、著作権所有者および貢献者によって // 「現状のまま」提供されます。
本ソフトウェアは、著作権所有者および貢献者によって // 「現状のまま」提供されます。いかなる場合においても、著作権者または貢献者は 
// また、著作権者または貢献者は、いかなる場合においても、直接的、間接的、偶発的、特別、例示的、または結果的な損害について責任を負いません。
// 著作権所有者または貢献者は、いかなる場合も、直接的、間接的、特別、例示的、または結果的な損害(代用品の調達を含むが、これに限定されない。
// 代用品またはサービスの調達、使用、データ、または利益の損失、またはビジネス上の損失。
// を含むがこれに限定されない)に対して責任を負いません。
契約、厳格責任、または不法行為のいずれであっても、// 責任の理論 
本ソフトウェアの使用から発生する、契約、厳格責任、または不法行為(過失またはその他を含む) // にかかわらず、どのような原因、どのような責任論であっても。
// 本ソフトウェアの使用に起因する損害の可能性について知らされていた場合であっても。
// $
//#############################################################################c

自分の商品を売るために「俺TIに認証されてんだぜ!」とか広告したり、自作発言しなければ、共用してOKということやな。

ソースコードの中身をみていく

今回使用したLチカのソースコードは以下の通りです。

こんなにガチなLチカのソースコードもあんまりないよね。。。

// Included Files
//
#include "driverlib.h"
#include "device.h"

//
// Defines
//
# define LOOP_COUNT 10

//
// Main
//
void main(void)
{
    //
    // Initialize device clock and peripherals
    //
    Device_init();

    //
    // Initialize GPIO and configure the GPIO pin as a push-pull output
    //
    Device_initGPIO();
    GPIO_setPadConfig(DEVICE_GPIO_PIN_LED1, GPIO_PIN_TYPE_STD);
    GPIO_setDirectionMode(DEVICE_GPIO_PIN_LED1, GPIO_DIR_MODE_OUT);

    //
    // Initialize PIE and clear PIE registers. Disables CPU interrupts.
    //
    Interrupt_initModule();

    //
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    //
    Interrupt_initVectorTable();

    //
    // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
    //
    EINT;
    ERTM;

    //
    // Loop Forever
    //
    for(;;)
    {
        //
        // Turn on LED
        //
        GPIO_writePin(DEVICE_GPIO_PIN_LED1, 0);

        //
        // Delay for a bit.
        //
        DEVICE_DELAY_US(500000);

        //
        // Turn off LED
        //
        GPIO_writePin(DEVICE_GPIO_PIN_LED1, 1);

        //
        // Delay for a bit.
        //
        DEVICE_DELAY_US(500000);
    }
}

//
// End of File
//

CCSでは「Ctrl + 右クリック」をすることで、インクルードされたファイルや変数の中身までアクセスできます。

これを使っていろいろ見てみようと思います。

ぶっちゃけ細かく見ているとまともに見れた記事にならないので文章で適当にコメントしていこうと思います。

2つのインクルードファイル:driverlib.hとdevice.h

以下の二つがincludeされていました。

#include "driverlib.h"
#include "device.h"

●driverlib.h について

EPWM、EQEP等の各種機能へアクセスするためのヘッダファイルをまとめたヘッダファイルになってる

●device.h について

各種GPIOの設定や変数が何を指しているのかをまとめたファイルになってる。中を見てみると以下のようになっていた

#define定義で、わかりやすい名前を付けているファイル、という感じでした。

ここではLED1のGPIOピンの定義は直接レジスタ指定で、それ以外はされに別の”pinmap.h”というファイルで定義したものを使用する、という感じでした。

すこしわかりにくいなぁと思ったんですが、どうやらpinmapの方で”チップとして決まっている入出力の設定”を、Launcpad上に合わせて再度定義したのが"device.h"という感じみたいです。多分。

マイコンチップの機能を全部使わないことはよくあることかと思いますが、一応設定ファイルはいじってない、ということみたいですね。

ハード的に決まってる仕様:pimmap.h
ハードをLaunchpad上でどう使っているのか?:device.h

って感じだと思う。

中身を詳しく読む必要はないかもしれませんが、だいたい何設定してるのかはわかりました。

(使えるとは言ってない。)

Device_init();

main関数で最初に定義されてる関数でした。

中身を見ましたが、マイコン上のペリフェラルを有効化するコードが並んでました。

量が多いんで必要なとこしか見てませんが、EPWMの出力を許可する・しない、とか、AD変換を有効にするか、とかでした。たぶん。

CCSにおいては、「Ctrl」+「右クリック」を行うことにより、変数や関数を定義した箇所へジャンプすることができます。

Device_initGPIO();

この関数ではGPIOの設定を行ってるっぽい。けどこれはポートごとの指定かな?

ポートがA~Fまであるっぽいんだけど、これはマイコン上のピンの集まりのことを言っているはず。

だいたい機能ごとにくくりがあったりするのでそんな感じだと思います。

ちょっとよくわからなかったけど、コードの注釈では”GPIOポートのロックを解除します”とのことだったので、多分書いとけば大丈夫そう。

GPIO_setPadConfig(DEVICE_GPIO_PIN_LED1, GPIO_PIN_TYPE_STD);

ここでは指定された引数のピンの状態を決定しているみたい。

Arduinoで言うならたぶんpinMode(1, OUTPUT);

今指定してるのはLEDのピンの出力をどうしますか?ということだと思うんだけど、状態としては以下の4つが選択できるらしい。

多分これは回路構成がどうなってますか?ってとこにかかわると思うんだけど、LEDのカソードをマイコンに接続しているのか、アノードなのかとか、その辺の構成によって出力を切り替えられる模様。

すげぇな、、、そんな設定までできんのか。。。

GPIO_setDirectionMode(DEVICE_GPIO_PIN_LED1,GPIO_DIR_MODE_OUT);

ここではGPIOピンの出力モードを設定していました。

設定項目は以下の通り。

INとOUTの2択で出力設定をできるみたい。今回はLEDなのでOUTになってた。

Interrupt_initModule();

ここではPIEコントロールレジスタ、なるものを設定している模様。う~ん、わからん。

特に引数とかはなし、適当にググってみたけどそれっぽいのはなかった。

Interrupt_initVectorTable();

PIE、なるもののvecter tableをセッティングしているらしい。うん、わからん。割り込みのベクタのことかな?

あとで調べるけど今のところ基礎的な設定っぽい(とりあえず書いておけ的な雰囲気)なので放置しておく。

EINT;

ここはなかの関数が見れなかったんだけど、どうやら割り込みの許可を行うフラグてきなものらしい。

ERTM;

リアルタイムデバッグ割り込み、なるものを許可しているフラグらしい。こちらも詳細は覗けないんだけど、多分expressions等でリアルタイムに変数を変更したりできるから、その辺の割り込みを許可するためのものなのかも。

EINT;とERTM;はたぶんどのプロジェクトでも必須だと思う。(設定中は禁止しておかないと多分ダメ。)

以下、forループ内部

これ以降はfor文の内容に触れていきます。

main関数は一通り上から実行した後、ここでぐるぐる無限ループで回しているっぽい。

GPIO_writePin(DEVICE_GPIO_PIN_LED1,0);

GPIOの出力を直接読み書きできる関数らしい。引数はベースアドレスに対する移動分のアドレスと、多分1か0の値。

ベース・アドレス・指定方式?だったっけかな.... 地獄で多分習ったけど半分くらい揮発している。。。

引数として渡されたアドレスは ”GPIO_DATA_BASE” というメモリ上のアドレスを基準として数えたアドレスになっているらしいけど、詳細はちょっと不明。

多分そこそこ読み込まないとよくわからんレジスタに値を格納しちゃったりしそうです。

DEVICE_DELAY_US(500000);

usec刻みでの待機時間を設ける関数。いま500,000usecが渡されているので、0.5secの待ち時間を設けていることになる。

待機時間の生成方法を見てみる。

#define DEVICE_DELAY_US(x) SysCtl_delay \
(((  ((long double)(x)) / (1000000.0L / (long double)DEVICE_SYSCLK_FREQ)) - 9.0L) / 5.0L)

関数定義で定義された関数を使用しているらしい。

そのままだとわかりにくいので分数表記に直すと以下の通り。

$$
\rm{
\left(
\frac{ (long\ double)(x) }
{ \frac{1000,000}{(long\ double)DEVICE\_SYSCLK\_FREQ} } - 9.0
\right)
\times
\frac{1}{5}
}
$$

中を見ると変わるんだけど、main関数のループを何サイクル待機するのかを直接指定する関数 ”SysCtl_delay”を、usec指定できるようにした関数になっているみたい。

ただこの関数を読んだ時点で9サイクル確定で必要になる+1度呼び出すごとに5サイクル必要になる、的なことが書いていあるので、Arduino同様タイマ割り込みのような正確な時間生成はできない。

まぁそれはおいておいて、中身を見てみる。

500,000usecを引数で渡したとすると、これを1,000,000で割るので、0.5となる。()これをさらに"DEVICE_SYSCLK_FREQ"で割っている。

いま"DEVICE_SYSCLK_FREQ"は、

#define DEVICE_OSCSRC_FREQ          20,000,000U
#define DEVICE_SYSCLK_FREQ          ((DEVICE_OSCSRC_FREQ * 20 * 1) / 2)

となっているので、20[MHz]を20倍して2で割る、つまり200[MHz]になっている。

(なので、1サイクルあたりの時間は5[nsec]ということになる)

可読性が良くないので書き直すと、

$$
\left(
\frac{ (long\ double)(x) }{1,000,000}
\times{(long\ double)DEVICE\_SYSCLK\_FREQ } - 9.0
\right)
\times
\frac{1}{5}
$$

という感じ。

usecで読み込んだ引数を1[MHz]で割ると割合で0.5、それに200MHzかければ100MHzになる。
つまり、200MHzでは1サイクルで5[nsec]なので、それを100M倍すれば、0.5になるというわけか。。。。

ただこ待機関数では前述した注意点があり、これらを消すために以下のように、
・"SyCtl_dely”という関数自体を読み込んだ時点で9サイクルデフォルトでかかるので、待ちたいサイクル数から9を引いている。
・この関数内で1サイクル待機するごとに5サイクル消費するので引数として渡したサイクル数の5倍待機することから5で割っている。

という処理をしているわけか、、、。。。

なるほどね。めんどいわ。

普通にタイマ割り込み使いたいよ。

GPIO_writePin(DEVICE_GPIO_PIN_LED1, 1);

先ほどと同じ関数で、今度はGPIO出力に1を設定してLEDを点灯する。

DEVICE_DELAY_US(500000);

この関数で再度0.5[sec]点灯状態を待機している。

プログラムの内容まとめ

一通り読んでみたけど、今回のサンプルプログラムの内容としては、

1.デバイスの設定を行う
2.GPIOのコンフィグ(マイコンのハード)、GPIOのコンフィグ(LauncPad仕様)、各種設定
3.main関数を200[MHz]で呼び出すように設定
4.main関数内のforループで、「LED消灯➡0.5sec待機➡LED点灯➡0.5sec待機」

って感じですね。

まとめ

今回はLAUNCPADの導入として、
・開封
・CCSの設定等
・サンプルプログラムの入手方法の確認
・Lチカのプログラムの書き込みテストとその内容確認

をやってみました。

ようわからんところは「ようわからん」と書いてありますが、勉強したら調べたりし次第、適宜加筆していきます。

とりあえず動いたし全容は把握できたのでよし!

ではまた。

-未分類
-,