M2の小西です。
自身の研究で低消費電力マイコンを使いたかったため、色々ぐぐったところ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されたが気にせずインストール! 】
①-(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」でぐぐった方が見やすい資料が出ます。
デバイスの選択 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が切り替わっている。
→
→
→
→
→
あとは、とりあえずコードを以下に示します。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <msp430.h> //MSP430F2619TPM
/*
* main.c
*/
// 端子設定 /////////////////////////////////////////////////////////
#define test_LED 0b00000001 // P1.0 test_LED
#define RED_LED 0b00000001 // P6.0 RED_LED
#define BUTTON 0b00000010 // P6.1 BUTTON
#define BLUE_LED 0b00010000 // P6.4 BLUE_LED
#define GREEN_LED 0b10000000 // P6.7 GREEN_LED
// 初期設定 /////////////////////////////////////////////////////////
void setup() {
WDTCTL = WDTPW + WDTHOLD; // Stop WathcDog Timer,
SVSCTL &= ~SVSFG; // 低電圧フラグを消去 Supply Voltage Supervisor
SVSCTL = 0x60 + PORON; // SVS POR enabled @ 2.5V 電圧低下検出.この電圧以下ではマイコンリセット.
while(!(SVSCTL & SVSON)); // 電圧監視機能がONになるまで待機
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_8MHZ; // Set RSELx
DCOCTL = CALDCO_8MHZ; // Set DCOx and MODx
// 省力化のため、すべてのピンを初期化
P1DIR = test_LED; // P1.0;OUT, the others;IN
P1REN = 0x00; // P1 set to Pullup/Pulldown Disable
P2DIR = 0x00; // P2 set to INPUT for unused Port pins
P2REN = 0x00; // P2 set to Pullup/Pulldown Disable
P3DIR = 0x00; // P3 set to INPUT for unused Port pins
P3REN = 0x00; // P3 set to Pullup/Pulldown Disable
P4DIR = 0x00; // P4 set to INPUT for unused Port pins
P4REN = 0x00; // P4 set to Pullup/Pulldown Disable
P5DIR = 0x00; // P5 set to INPUT for unused Port pins
P5REN = 0x00; // P5 set to Pullup/Pulldown Disable
P6DIR = RED_LED | BLUE_LED | GREEN_LED; // P6.0, P6.4, P6.7;OUT, the others;IN
P6REN = 0x00; // P6 set to Pullup/Pulldown Disable
}
int main(void)
{
setup(); // システム初期設定.これ以前には何も処理をしないこと
int i = 0; // 汎用計算変数
P1OUT = test_LED; // 初期設定
P6OUT = GREEN_LED; // 初期設定
while(1){
if((P6IN & BUTTON) == BUTTON){ //P6.1のButton は押すとHIGHが入力される
if(i == 0){ P6OUT = RED_LED; }
else if(i == 1){ P6OUT = BLUE_LED; }
else if(i == 2){ P6OUT = GREEN_LED; }
i++;
if(i == 3){i = 0;}
while((P6IN & BUTTON) == BUTTON); //ボタンが離されるのを待つ
}
}
}
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
<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)を停止させる
(U ser's G uide P.347 10.3.1 WDTCTL, Watchdog Timer+ Register)
WDTCTLレジスタに書き込むとき上位2byteはパスワードであり常に 0x5A XX としなけ
ればならず、WDTを停止させるには WDTHOLD を1にせねばならない。なので、
0xXX80 と 0x5A XX をビット毎加算してWDTCTLに書き込む。
(もし、WDTISx とかを 0 以外で書きたいなら、適宜 0xXX80 を適切な値にする)
※WDTPW と WDTHOLD はどこか(MSP430.h ??)で #define されているっぽい。
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行目>
17. SVSCTL = 0x60 + PORON;
SVSCTLレジスタの上位4bit(VLDx)でRESETをかける閾値電圧を設定する。
(
U. G. P.340 9.3.1 SVSCTL, SVS Control Register)
0x
6 0 (閾値:2.5V指定) を設定し、PORON (0x0
8 ) と合わせて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
║ ただし、1MHZとか16MHZだとかのよく使われる周波数はあらかじめきっかりの ║
║ 周波数を出すための設定が埋め込まれており、これが CALDCO_8MHZや CALB ║
║ C1 _8MHZ である。” DCOを CAL(libration)された8MHZに設定” = CAL DCO ║
║ _8MHZ 。 ║
╚ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ╝
20, 21行目:
CALDCO_8MHZ や CALB C1 _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が入力される
ポート6入力レジスタのBUTTON(0b00000010), すなわち P6.1 の状態を判定
47. if(i == 0){ P6OUT = RED_LED; }
ポート6出力レジスタのRED_LED(0b00000001), すなわち P6.0 を HIGHにする
<><><><><><><><><><><><><><><><><><><><><><><><>