Stellaris 1day Workshop - Texas Instruments Wiki

Stellaris 1day Workshop
Student Guide
日本語版
Jan 2010
Notice
Creation of derivative works unless agreed to in writing by the copyright owner is forbidden. No
portion of this publication may be reproduced, stored in a retrieval system or transmitted in any
form or by any means, electronic, mechanical, photocopying, recording or otherwise, without the
prior written permission from the copyright holder.
Texas Instruments reserves the right to update this Guide to reflect the most current product
information for the spectrum of users. If there are any differences between this Guide and a
technical reference manual, references should always be made to the most current reference
manual. Information contained in this publication is believed to be accurate and reliable.
However, responsibility is assumed neither for its use nor any infringement of patents or rights of
others that may result from its use. No license is granted by implication or otherwise under any
patent or patent right of Texas Instruments or others.
アプリケーション作成に向けて
Module Topics
アプリケーション作成に向けて ............................................................................................................. 4-1
Stellaris 用ソフトウェア....................................................................................................................... 4-2
ファームウェア開発パッケージ .................................................................................................... 4-2
RTOS.................................................................................................................................................. 4-5
StellarisWare 3rd パーティ・フォルダ ............................................................................................. 4-6
日本の 3rd パーティ ......................................................................................................................... 4-6
Lab 4 サンプルプログラムのビルド、デバッグを行う ................................................................... 4-7
Part1. LED の点滅周期をターミナルからコントロールするプログラムの作成 ...................... 4-8
Part2. StellarisWare のサンプルプロジェクトをビルド、デバッグ...........................................4-16
オプション演習....................................................................................................................................4-18
tiobj2bin ユーティリティを使い.bin ファイルを作成 .................................................................4-18
Stellaris 1day Workshop – For Application Development
4-1
Stellaris 用ソフトウェア
ファームウェア開発パッケージ
ファームウェア開発パッケージ
‹
‹
各評価キット/リファレンスキットごとに用意
多くのサンプルを同封
Š
Š
Š
Š
Š
ペリフェラル・ドライバ ライブラリ
USBライブラリ
グラフィックスライブラリ
オープンソースのTCP/IP、File System
その他ユーティリティ・モジュール
グラフィックス・ライブラリのサンプル
基本
オプション・ボタン
キャンバス
プッシュボタン
チェックボックス
コンテナ
セキュリティ・キーパッド
BLDC タッチスクリーン
モーター・コントローラ
※このグラフィックス・ライブラリは特定のLCD
パネル//コントローラを対象にした
このグラフィックス・ライブラリは特定のLCDパネル
ソフトウェアではありません。
Stellaris 1day Workshop – For Application Development
4-2
USB ライブラリ
‹
USB インターフェイス準拠
Š
‹
Stellaris は、USB デバイスおよび組み込みホスト準拠テストに合格
入手できるサンプル:
Š
デバイスの例:
Š
Š
Š
Š
Š
Š
Š
ホスト例:
Š
Š
Š
Š
マス・ストレージ
HID キーボード
HID マウス
Windows INF ファイルの記述とサポート対象クラス
Š
Š
Š
Š
Š
HID キーボード
HID マウス
CDC シリアル
ジェネリック・バルク
デバイス・ファームウェアのアップグレード
オシロスコープ
ベースとなる Windows ドライバを指す
config 文字列をセットする
PID/VID をセットする
プリコンパイルされた DLL が用意されているため開発時間が短縮される
デバイス・フレームワークを USBLib に統合
USB ホスト/デバイス
オシロスコープのデモンストレーション
オシロスコープ配線
オシロスコープ・デモ
USB ホスト・モード
メモリ・スティックへのデータ・ダンプ
2010/1/26
Stellaris 1day Workshop – For Application Development
オシロスコープ・オプション
USB デバイス・モード
PC によるデモの制御
5
4-3
システム・プログラミング・オプション
Stellaris シリアル・フラッシュ・ローダ
‹
‹
‹
‹
デバッグ・インターフェイスを必要とすることなく、フラッシュ・プログ
ラミングを可能にする小さなプログラム
Stellaris MCU 製品はすべて、このローダがフラッシュ・メモリに事
前にロードされた状態で出荷
インターフェイス・オプションには、UART または SSI がある
アプリケーション・ノート AN01242 を参照
Stellaris ブート・ローダ
‹
‹
‹
‹
アプリケーション・ローダとして機能する小さなプログラム
また、Stellaris マイクロコントローラ上で実行中のアプリケーショ
ンのアップデート・メカニズムとしても使われる
インターフェイス・オプションには、UART(デフォルト)、I2C、SSI、
イーサネット、USB がある
アプリケーション・ノート AN01248 を参照
オンチップ・ソフトウェアの機能拡張(ROM)
ROMに搭載されているStellarisWare®
‹
‹
‹
StellarisWare® DriverLib
StellarisWare® ブートローダ
その他のフラッシュ・メモリ節約オプション
(AESテーブル、CRC)
使い方概要
1.
ビルド・オプションにてTARGET_IS_TEMPEST_RB1
またはTARGET_IS_DUSTDEVIL_RA0をプリ・デファイン
2.
driverlib/rom.hをインクルード
driverlib/rom.hをインクルード
3.
ROM_xxx()
ROM_xxx() APIを使用
APIを使用
※すべてのStellaris
デバイスにROM
ROMが搭載されているわけではありません。
が搭載されているわけではありません。
すべてのStellarisデバイスに
Stellaris 1day Workshop – For Application Development
4-4
RTOS
SafeRTOS概要
LM3S9B96のROMに搭載
規格
タスク生成
タスク状態
タスクプライオリティ
スケジューリング
クリティカルセクション
ISRプライオリティ
メッセージキュー
セマフォ
イベントフラグ
mutex
メモリプール
時間管理
使用SRAM
freeRTOSをベースとした独自仕様
数量無制限(メモリ依存)、動的生成(スタックは動的生成せず)
Ready / Running / Blocked (WAIT) / Suspended
0:最低 < 10:最高 (ROM版での制限)、動的変更可能
プリエンプティブかつタイムスライス(同優先度のラウンドロビン)
割り込み禁止(Disable可能なもののみ)、もしくは
スケジューラのサスペンド(ISRの実行が可能)
Disable可能 7:最低 < 5:最高 (API実行可能)
Disable不可能 4:最低 < 0:最高 (API実行禁止)
あり(バッファは動的生成せず)
なし(キューを利用した実装が可能)
なし
なし
なし
Systick timer を利用。Tick数の取得、一定時間のDelayが可能
524Byte (0x20000000 – 0x0000020C固定)
DSP/BIOS6概要
TI DSP向けRTOSをARMコアに対応
規格
スレッド・モデル
Swi生成
Swi状態
Swiプライオリティ
タスク生成
タスク状態
タスクプライオリティ
スケジューリング
クリティカルセクション
キュー
セマフォ
イベントフラグ
mutex
メモリプール
時間管理
使用SRAM
独自仕様
Hwi / Swi / Task / Idle
数量無制限(メモリ依存)、動的生成可能
Inactive / Ready / Running
0:最低 < 31:最高、動的変更不可
数量無制限(メモリ依存)、動的生成可能
Ready / Running / Blocked / Terminated
0:最低 < 31:最高、動的変更可能
プリエンプティブ
各スレッド・スケジューラのDisable、プライオリティの動的変更
あり
あり
あり
あり
あり
Tick数の取得、一定時間のDelayが可能
スケーラブル(使用するモジュールごとに増加)
Stellaris 1day Workshop – For Application Development
4-5
StellarisWare 3rd パーティ・フォルダ
3rdパーティ・フォルダ
Stellarisへ移植済みのソフトウェア
※ライセンス等は各ソフトウェアに従いますのでご注意ください
日本の 3rd パーティ
日本の3rdパーティ
関連会社様(抜粋)
IARシステムズ株式会社
統合開発環境「EWARM」を始め、ハード評価、ソフト開発に必要な
OS、ミドル、開発ツールをトータルに提供
イー・フォース株式会社
Cortex-M3に最適化されたコンパクトタイプのμITRON仕様
RTOS「μC3/Compact」とTCP/IPスタック「μNet3/Compact」
株式会社エーアイコーポレーション
RLL機能対応μITRON仕様RTOS「TOPPERS-Pro」、
iPodクラスドライバ対応USBをはじめ各種ミドルウェアの提供
株式会社コンピューテックス
SWD、SWVテクノロジー対応JTAGエミュレータ「PALMiCE3」、
「J-STICK」、Flash Programmer「FP-10」、統合開発環境「CSIDE-IDE」
株式会社ソフィアシステムズ
ARM KEIL製品正規代理店、ソフィアシステムズ製エミュレータ、
オンボード・フラッシュROMライタ、各種評価ボード、受託開発
Stellaris 1day Workshop – For Application Development
10
4-6
Lab 4 サンプルプログラムのビルド、デバッグを行う
Lab4:サンプルプログラムのビルド、デバッグを行う
ファームウェア開発パッケージに含まれるユーティリティ
“Command Line Processing Module”を使いターミ
ナル(UART接続)からLEDの点滅周期をコントロールす
るソフトウェアを作成
2. Lab1にて動かしたサンプルのプロジェクトをインポート、
ビルド、デバッグ
1.
Command Line Processing Module
例)usb_host_msc
API
データ型
typedef int (*pfnCmdLine)(int argc, char *argv[]);
typedef struct
{
const char *pcCmd
*pcCmd;;
pfnCmdLine pfnCmd;
pfnCmd;
const char *pcHelp
*pcHelp;;
}
tCmdLineEntry
変数
tCmdLineEntry g_sCmdTable[
g_sCmdTable[ ]
関数
int CmdLineProcess (char *pcCmdLine)
Int
Cmd_help(int argc,
[])
argc, char *argv
*argv[])
{
<中略>
中略>
return(0);
}
…
tCmdLineEntry g_sCmdTable[]
g_sCmdTable[] =
{
{ “help”
“ : Display list of commands”
help”, Cmd_help,
Cmd_help,
commands” },
<中略>
中略>
{ "cat", Cmd_cat,
" : Show contents of a text file" },
Cmd_cat,
{ 0, 0, 0 }
};
…
Int
main(void)
main(void)
{
int iStatus;
iStatus;
<中略>
中略>
ReadLine関数でターミナル
の入力を配列g_cCmdBufへ
代入しています
ReadLine();
ReadLine();
if(g_cCmdBuf[0] == '¥
'¥0')
{
continue;
}
コマンドラインの文字配列のポイン
タを渡して実行する。
g_sCmdTableに該当するコマンド
の構造体があれば、同構造体の
pfnCmdメンバ(関数)を実行する。
iStatus = CmdLineProcess(g_cCmdBuf);
CmdLineProcess(g_cCmdBuf);
…
if(iStatus == CMDLINE_BAD_CMD)
{
UARTprintf("Bad command!¥
command!¥n");
}
※ 演習で使用する StellarisWare は
“C:\StellarisWare”
にインストールされているものとして説明します。
Stellaris 1day Workshop – For Application Development
4-7
Part1. LED の点滅周期をターミナルからコントロールする
プログラムの作成
1. プロジェクトを作成します。
lab4 という名前のプロジェクトを作成してください。ワークスペースにある lab4 以
外のプロジェクトは閉じておくといいでしょう。
2. 既存のファイルを追加します。
lab4 では lab3 で作成したプログラムをベースに Command Line Processing Module を
使ったルーチンを追加してみます。以下のファイルをプロジェクトに追加してくだ
さい。
startup_ccs.c
lab3.c
driverlib.lib
uartstdio.c
Stellaris 1day Workshop – For Application Development
4-8
lab3.c は lab4.c に名前を変更してください。プロジェクトビューから lab3.c を右クリ
ック→Rename より変更できます。
3. インクルード・サーチパスを追加します。
StellarisWare のライブラリ用ヘッダファイルを使用していますので、lab3 と同様に
ビルドオプションにインクルード・サーチパスを追加してください。
Stellaris 1day Workshop – For Application Development
4-9
4. ビルド、ロード、実行し、いったん動作確認します。
ここまでで lab3 と同じプログラムができあがったはずですので、動作確認してくだ
さい。
5. Command Line Processing Module のソースファイルを追加します。
Command Line Processing Module のソースファイル cmdline.c は uartstdio.c と同じ
く C:\StellarisWare\utils フォルダにありますのでプロジェクトに追加してください。
6. lab4.c に記述を追加します。
追加する記述が少し多めですので追加するコードを
C:\stellaris_1day\template\lab4_template.c に用意してあります。書かれているコードを
lab4.c の適当な場所へ追加してください。また SysTick の割込み処理関数内の
UARTprintf 関数の処理は、コマンド入力をしづらくすると思いますのでコメントア
ウトしてください。
処理の流れは以下のようになります。
① クロックや周辺機能の初期化
② 割込み許可
③ ターミナルからの入力読み込み
④ コマンドの実行及びエラー処理
⑤ ③に戻る
以下 lab4_template.c の解説です。行番号は次ページより掲載のソースにもとづいて
います。
1 行目から 6 行目は必要なヘッダファイルのインクルードです。追加するコードの
中でCスタンダードライブラリ関数、ペリフェラル・ドライバ・ライブラリの
UART 用関数、Command Line Processing Module ユーティリティの関数を使用してい
ます。
11 行目は Command Line Processing Module ユーティリティの CmdLineProcess 関数に
渡すコマンドライン文字列用の配列 g_cCmdBuf[]の宣言です。
13 行目から 97 行目はターミナルからの入力を g_cCmdBuf 配列へ代入する ReadLine
関数(サブルーチン)の記述です。
99 行目から 136 行目はこのプログラムで使えるコマンドのヘルプをターミナルに表
示する関数(サブルーチン)の記述です。
Stellaris 1day Workshop – For Application Development
4 - 10
138 行目から 165 行目はターミナルの入力から SysTick に任意のピリオドを設定する
関数(サブルーチン)の記述です。
167 行目から 174 行目は Command Line Processing Module が参照する構造体の配列
g_sCmdTable[]の宣言です。
※配列 g_sCmdTable[]は CmdLineProcess 関数から直接参照していますので配列名を
変更してはいけません。
177 行目から 226 行目は main 関数です。<中略>の部分にはクロックや周辺機能の設
定及び割込み許可のコードが入るでしょう。最後の while 文のなかでターミナルか
らのコマンド読み込みと CmdLineProcess 関数の実行を行っています。
Stellaris 1day Workshop – For Application Development
4 - 11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <stdlib.h>
#include <string.h>
#include "driverlib/uart.h"
#include "utils/cmdline.h"
#define CMD_BUF_SIZE 64
static char g_cCmdBuf[CMD_BUF_SIZE];
void ReadLine(void)
{
unsigned long ulIdx, ulPrompt;
unsigned char ucChar;
g_cCmdBuf[0] = '\0';
ulIdx = 0;
ulPrompt = 1;
while(1){
if(ulPrompt){
UARTprintf("> %s", g_cCmdBuf);
ulPrompt = 0;
}
// Loop while there are characters that have been received from
the
// UART.
//
while(UARTCharsAvail(UART0_BASE))
{
//
// Read the next character from the UART.
//
ucChar = UARTgetc();
//
// See if this character is a backspace and there is at
least one
// character in the input line.
//
if((ucChar == '\b') && (ulIdx != 0))
{
//
// Erase the lsat character from the input line.
//
UARTprintf("\b \b");
ulIdx--;
g_cCmdBuf[ulIdx] = '\0';
}
//
// See if this character is a newline.
//
else if((ucChar == '\r') || (ucChar == '\n'))
Stellaris 1day Workshop – For Application Development
4 - 12
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
{
//
// Return to the caller.
//
UARTprintf("\n");
return;
}
//
// See if this character is an escape or Ctrl-U.
//
else if((ucChar == 0x1b) || (ucChar == 0x15))
{
//
// Erase all characters in the input buffer.
//
while(ulIdx)
{
UARTprintf("\b \b");
ulIdx--;
}
g_cCmdBuf[0] = '\0';
}
//
// See if this is a printable ASCII character.
//
else if((ucChar >= ' ') && (ucChar <= '~') &&
(ulIdx < (sizeof(g_cCmdBuf) - 1)))
{
//
// Add this character to the input buffer.
//
g_cCmdBuf[ulIdx++] = ucChar;
g_cCmdBuf[ulIdx] = '\0';
UARTprintf("%c", ucChar);
}
}
}
}
int Cmd_help(int argc, char *argv[])
{
tCmdLineEntry *pEntry;
//
// Print some header text.
//
UARTprintf("\nAvailable commands\n");
UARTprintf("------------------\n");
//
// Point at the beginning of the command table.
//
pEntry = &g_sCmdTable[0];
//
Stellaris 1day Workshop – For Application Development
4 - 13
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
// Enter a loop to read each entry from the command table.
of the
// table has been reached when the command name is NULL.
//
while(pEntry->pcCmd)
{
//
// Print the command name and the brief description.
//
UARTprintf("%s%s\n", pEntry->pcCmd, pEntry->pcHelp);
The end
//
// Advance to the next entry in the table.
//
pEntry++;
}
//
// Return success.
//
return(0);
}
int Cmd_systickPeriodSet(int argc, char *argv[])
{
int period;
if(argc != 2)
{
UARTprintf("need argument ex) set 0xFFFFFF\n");
return(CMDLINE_BAD_CMD);
}
else
{
period = strtol(argv[1], NULL, 0);
if(period < 0xfff){
UARTprintf("the period looks too short\n");
return(CMDLINE_BAD_CMD);
}
else if(period > 0xffffff){
UARTprintf("the period is too long\n");
return(CMDLINE_BAD_CMD);
}
SysTickPeriodSet((unsigned long)period);
UARTprintf("set successfully!\n");
return(0);
}
}
tCmdLineEntry g_sCmdTable[] =
{
{ "help",
Cmd_help,
" : Display list of commands" },
{ "h",
Cmd_help,
"
: alias for help" },
{ "?",
Cmd_help,
"
: alias for help" },
Stellaris 1day Workshop – For Application Development
4 - 14
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
{ "set",
{0,0,0}
Cmd_systickPeriodSet, "
: Set SysTick Period" },
};
void main(void)
{
int iStatus;
<中略>
while(1){
//
// Get a line of text from the user.
//
ReadLine();
if(g_cCmdBuf[0] == '\0')
{
continue;
}
//
// Pass the line from the user to the command processor.
// It will be parsed and valid commands executed.
//
iStatus = CmdLineProcess(g_cCmdBuf);
//
// Handle the case of bad command.
//
if(iStatus == CMDLINE_BAD_CMD)
{
UARTprintf("Bad command!\n");
}
//
// Handle the case of too many arguments.
//
else if(iStatus == CMDLINE_TOO_MANY_ARGS)
{
UARTprintf("Too many arguments for command processor!\n");
}
//
// Otherwise the command was executed. Print the error
// code if one was returned.
//
else if(iStatus != 0)
{
UARTprintf("Command returned error code %d\n", iStatus);
}
}
}
Stellaris 1day Workshop – For Application Development
4 - 15
7. ターゲット・コンフィグレーションを作成します。
Lab3 同様、既存の TargetConfiguration.ccxml をプロジェクトに追加してください。
8. ビルド、ロード、実行し動作確認します。
それでは実行してみましょう。実行後ターミナルビューからコマンドを入力し、
LED の点滅周期が変化すれば成功です!
Part2. StellarisWare のサンプルプロジェクトをビルド、デ
バッグ
9. ワークスペースへ StellarisWare のサンプルプロジェクトをインポートします。
既存の CCS プロジェクトを使用するにはワークスペースへのインポートを行います。
StellarisWare の各サンプルは CCS プロジェクトが用意されています。例として
usb_host_msc のプロジェクトをインポートしてみます。
Stellaris 1day Workshop – For Application Development
4 - 16
CCS のメインメニュー、Project→Impoert Existing CCS/CCE Eclipse Project をクリ
ックしてください。すると下図のようなダイアログが現れますので、Select root
directry フィールドに Browse…ボタンを使って
C:\StellarisWare\boards\ek-lm3s9b92\usb_host_msc\ccs
評価キット名
を入力し、Finish をクリックしてください。
10. プロジェクトのソースコードなどを確認します。
プロジェクトビューより usb_host_msc.c をダブルクリックするとソースコードが確
認できます。アウトラインビューを使うと関数や変数の参照がしやすいと思います。
11. ビルド、ロード、実行し動作確認します。
プロジェクトをインポートし、実際に動作させながらコードを参照すると確認もし
やすいと思いますのでご活用下さい。
以上で lab4 は終了です。お疲れ様でした。時間に余裕のある方は
オプション演習をご覧下さい。
Stellaris 1day Workshop – For Application Development
4 - 17
オプション演習
tiobj2bin ユーティリティを使い.bin ファイルを作成
12. lab4 のビルドオプションに tiobj2bin を実行する設定を追加します。
ビルドオプションの Build Steps タブを前に出し、Post-build step:内の Command フィ
ールドに以下のコマンドラインを入力してください。少し長いのでインポートした
usb_host_msc プロジェクトのビルドオプションからコピー&ペーストすると入力の
間違いがなくよいでしょう。
"${CCE_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin.bat" "${BuildArtifactFileName}"
"${BuildArtifactFileBaseName}.bin" "${CG_TOOL_ROOT}/bin/ofd470.exe"
"${CG_TOOL_ROOT}/bin/hex470.exe"
"${CCE_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin.exe"
※上記コマンドラインは 1 行です(改行なし)。
13. ビルドし.bin ファイルができていることを確認します。
.bin ファイルは C:\stellaris_1day\lab4\Debug フォルダに出来ていると思います。確認
してください。
14. CCS を終了し、LM Flash Programmer にて作成した.bin ファイルを書き込みます。
いくつか.bin ファイルを書込み、動作確認して、lab4 の.bin ファイルが問題ないこと
を確認してください。
オプション演習は以上です。お疲れ様でした。
Stellaris 1day Workshop – For Application Development
4 - 18