自身の研究で低消費電力マイコンを使いたかったため、色々ぐぐったところTI社のMSP430マイコンなるものがヒットしました。
MSP430について勉強し、組み込み、開発するまでのことを備忘録としてここに残します。(あまり資料が見つからなかった、というのもあります)
本記事では、
①エディタのインストール
②Lチカ(プログラミング導入)
まで、書きます。
今後、タイマー、PWM、ADC、DAC、I2CやTX/RXまで書ければと思います。
マイコン:MSP430F2619TPM, 16bit, ~16MHz, RAM:4kB, 64-Pin
書き込み機:MSP-TS430PM64 の MSP-FET Flash Emulation Tool
MSP-TS430PM64 |
MSP-FET Flash Emulation Tool |
MSP430 64-pin Target Board |
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
①エディタのインストール(ユーザーズガイドやデータシートのDLも)
まずは、開発ツール(MSP-TS430PM64)のメーカーHPから必要なものをダウンロード。
①-(1)メーカー推奨の統合開発環境 Code Composer Studio (CCStudio) IDE を,
メーカーHP > Development Tools (5) > Code Composer Studio™ Integrated Development Environment for MSP Microcontrollers > Download > Download the latest CCS >
から、自身のPCに合ったインストーラをダウンロードします。
【私のPCはwin10 64bit なので、win用 Offline Installer を選択。32bit 版がDLされたが気にせずインストール! 】
【私のPCはwin10 64bit なので、win用 Offline Installer を選択。32bit 版がDLされたが気にせずインストール! 】
①-(2)各種データシートとユーザーズガイド
・MSP430F2619 のユーザーズガイド
・試作ターゲットボードのデータシード
・デバッグプローブ(MSP-FET Flash Emulation Tool)のユーザーズガイド
ユーザー・ガイド (2) > MSP Debuggers User's Guide
<--------------------------------------------------------------------------------------
(1)でDLした.zipを展開し、CCS_setup ~~.exeを実行。
※インストーラが存在するファイルパスにASCIIコードが含まれていると、インストーラが起動できませんでした。素直にダウンロードフォルダで実効するのが賢いか。
setup.exeを起動 |
インストールは基本OK連打しとけばいいが、3つ目あたりで「デバイスの選択」を迫られます。 CCStudioはMSP以外のいろんなマイコンの開発もできるっぽいのですが、今回はMSP430シリーズの開発のみなので、写真のように1つだけチェックして次に進みます。
まぁ、ぶっちゃけ「CCStudioのインストール MSP430」でぐぐった方が見やすい資料が出ます。
まぁ、ぶっちゃけ「CCStudioのインストール MSP430」でぐぐった方が見やすい資料が出ます。
デバイスの選択 MSP430 ultra-low-power MCUs |
インストールできたら起動しましょう。
Code Composer Studio IDE 起動画面 |
初期起動時にワークスペース(プログラムをまとめたプロジェクトを保存するところ)を設定します。たぶんここもパスにASCIIコードが入っていない方が賢明でしょう。
ワークスペースの設定 |
CCStudio for MSP で新規プロジェクトを作成しようとすると、下のような画面が出るはず。まず、Target は "MSP430x2xx Family" の中の "MSP430F2619" を選択。 Connection はPCとTarget boardを何で接続するか、を選択します。今回使うキットのMSP-FET Flash Emulation Tool で接続するとき、TI MSP430 USB1 [Default] を選択すれば通信できました。 Project name に任意のプロジェクト名を付けます。
新規プロジェクトの作成 |
新規プロジェクトが作成されるとこんな感じかと。 main.c にガンガンプログラムを書いていきましょう!!
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
②Lチカ(プログラミング導入)
今回は押しボタンスイッチ1つ・LED3つを使って、ボタンを押すと光らせるLEDをぐるぐる切り替えるプログラム書きます。これを例にCCSでの書き方やユーザーズガイドのどこを見るかなどを書いていきます。
まずは、回路図。
そして、実験風景。
まずは、回路図。
回路図(青色線から右をブレッドボード上に実装) |
そして、実験風景。
実験風景 |
タクトスイッチを押すことで光るLEDが切り替わっている。
あとは、とりあえずコードを以下に示します。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
<1行目>
1. #include <msp430.h> //MSP430F2619TPM
MSP430シリーズマイコンを使用するためのヘッダーファイル。新規作成したとき
から書いてあり、別段何かのファイルをコピーしないといけないとかそんなものは
ない。
<5-10行>
5. // 端子設定 /////////////////////////////////////////////////////////
6. #define test_LED 0b00000001 // P1.0 test_LED
7. #define RED_LED 0b00000001 // P6.0 RED_LED
ピンの割当て。ここではポートの指定はせず、ピンの指定だけします。Px.0が
0b00000001であることに注意。
<14行目>
14. void setup() { 初期設定関数の定義開始
<15行目>
15. WDTCTL = WDTPW + WDTHOLD; // Stop WathcDog Timer,
ウォッチドッグタイマ(WDT)を停止させる
(User's Guide P.347 10.3.1 WDTCTL, Watchdog Timer+ Register)
WDTCTLレジスタに書き込むとき上位2byteはパスワードであり常に 0x5AXX としなけ
ればならず、WDTを停止させるには WDTHOLD を1にせねばならない。なので、
ればならず、WDTを停止させるには WDTHOLD を1にせねばならない。なので、
0xXX80 と 0x5AXX をビット毎加算してWDTCTLに書き込む。
(もし、WDTISx とかを 0 以外で書きたいなら、適宜 0xXX80 を適切な値にする)
※WDTPW と WDTHOLD はどこか(MSP430.h ??)で #define されているっぽい。(もし、WDTISx とかを 0 以外で書きたいなら、適宜 0xXX80 を適切な値にする)
User's Guide P.347 10.3.1 WDTCTL, Watchdog Timer+ Register |
<16行目>
16. SVSCTL &= ~SVSFG;
低電圧フラグだけをクリア【Supply Voltage Supervisor (SVS)】
(U. G. P.340 9.3.1 SVSCTL, SVS Control Register)
低電圧監視フラグ(SVSFG) は電源電圧が低電圧状態から復帰したときに 1 が立つ。
次の電圧低下発生を検出できるよう、電源投入後フラグクリアする。
次の電圧低下発生を検出できるよう、電源投入後フラグクリアする。
17. SVSCTL = 0x60 + PORON;
SVSCTLレジスタの上位4bit(VLDx)でRESETをかける閾値電圧を設定する。
(U. G. P.340 9.3.1 SVSCTL, SVS Control Register)
0x60 (閾値:2.5V指定) を設定し、PORON (0x08) と合わせてSVSCTL に書き込む
ことで一旦 Power on Reset を起こす。
U. G. P.340 9.3.1 SVSCTL, SVS Control Register |
<18行目>
18. while(!(SVSCTL & SVSON)); // 電圧監視機能がONになるまで待機
SVSON ビットはSVSの状態を表し、SVS動作し始めると 1 が立つ。これを利用して
SVSON ビットが0=電源電圧が立ち上がるまで、の間whileにトラップされる。
<19-21行>
19. DCOCTL = 0; // Select lowest DCOx and MODx settings
20. BCSCTL1 = CALBC1_8MHZ; // Set RSELx
21. DCOCTL = CALDCO_8MHZ; // Set DCOx and MODx
内部の基本クロック周波数を指定する。ここからマスタークロック(MCLK)やサブメ
インクロック(SMCLK)を持ってくる。
(U. G. P.283 5.3.1 DCOCTL, DCO Control Register
(U. G. P.283 5.3.2 BCSCTL1, Basic Clock System Control Register 1)
19行目:一旦DCOCTLを 0 にクリアする(何の意味が? UGがやれと言うので。)
╔═ 基本クロックの決め方 ═════════════════════════════════╗
║DCOCTLの上位3bit(DCOx)とBCSCTL1の下位4bit(RSELx)の組み合わせにて基 ║
║本クロックは決定され、おおよその目安はデータシートに載っている。 ║
║(Datasheet P.42 DCO Frequency) ║
DCOx と RSELx による基本周波数の選択 |
Datasheet P.42 DCO Frequency |
║周波数を出すための設定が埋め込まれており、これが CALDCO_8MHZや CALB ║
║C1_8MHZ である。”DCOをCAL(libration)された8MHZに設定” = CALDCO ║
║_8MHZ。 ║
╚═══════════════════════════════════════════════════╝
20, 21行目:CALDCO_8MHZ や CALBC1_8MHZ を活用して簡単設定♪
<23-35行目>
各I/Oピンの設定
34. P6DIR = RED_LED | BLUE_LED | GREEN_LED; // P6.0, P6.4, P6.7;OUT, the others;IN
35. P6REN = 0x00; // P6 set to Pullup/Pulldown Disable
(U. G. P.328 8.2.1 Input Register PxIN:入力データレジスタ
(U. G. P.328 8.2.2 Output Registers PxOUT:出力データレジスタ
(U. G. P.329 8.2.3 Direction Registers PxDIR:入力/出力決定用レジスタ
(U. G. P.329 8.2.4 Pullup/Pulldown Resistor Enable Registers PxREN
║C1_8MHZ である。”DCOをCAL(libration)された8MHZに設定” = CALDCO ║
║_8MHZ。 ║
╚═══════════════════════════════════════════════════╝
<23-35行目>
各I/Oピンの設定
34. P6DIR = RED_LED | BLUE_LED | GREEN_LED; // P6.0, P6.4, P6.7;OUT, the others;IN
35. P6REN = 0x00; // P6 set to Pullup/Pulldown Disable
(U. G. P.328 8.2.1 Input Register PxIN:入力データレジスタ
(U. G. P.328 8.2.2 Output Registers PxOUT:出力データレジスタ
(U. G. P.329 8.2.3 Direction Registers PxDIR:入力/出力決定用レジスタ
(U. G. P.329 8.2.4 Pullup/Pulldown Resistor Enable Registers PxREN
:Pullup/Pulldown のEnable/Disable用データレジスタ
(U. G. P.329 8.2.5 Function Select Registers PxSEL and PxSEL2 )
:I/O以外の機能指定用データレジスタ
①INPUTピンにしたい場合
1-1 DIR=0; 入力ピン化
1-2 REN=X; 任意でPullup/Pulldown の Enable/Disableを選択
1-3 OUT=X; Pullup/Pulldown の 選択 (↑Enableの場合)
②OUTPUTピンにしたい場合
2-1 DIR=1; 出力ピン化
2-2 OUT=X; High/Lowを書き込む
③FUNCTION切り替え
3-1 DIR=X;機能に適した方を選択 (ADCならINPUT)
3-2 SEL=1;機能によってはSEL2も変更
<46,47行>
46. if((P6IN & BUTTON) == BUTTON){ //P6.1のButton は押すとHIGHが入力される
47. if(i == 0){ P6OUT = RED_LED; }
ポート6出力レジスタのRED_LED(0b00000001), すなわち P6.0 を HIGHにする
①INPUTピンにしたい場合
1-1 DIR=0; 入力ピン化
1-2 REN=X; 任意でPullup/Pulldown の Enable/Disableを選択
1-3 OUT=X; Pullup/Pulldown の 選択 (↑Enableの場合)
②OUTPUTピンにしたい場合
2-1 DIR=1; 出力ピン化
2-2 OUT=X; High/Lowを書き込む
③FUNCTION切り替え
3-1 DIR=X;機能に適した方を選択 (ADCならINPUT)
3-2 SEL=1;機能によってはSEL2も変更
<46,47行>
46. if((P6IN & BUTTON) == BUTTON){ //P6.1のButton は押すとHIGHが入力される
ポート6入力レジスタのBUTTON(0b00000010), すなわち P6.1 の状態を判定
ポート6出力レジスタのRED_LED(0b00000001), すなわち P6.0 を HIGHにする
<><><><><><><><><><><><><><><><><><><><><><><><>
以上。
0 件のコメント:
コメントを投稿