MSP430、ハードウェアのプログラミングとデバッグの学習


今日、Habrauser様、MSP430に関する記事に出てきたギャップの一部、つまり、このマイクロコントローラーでデバイスをプログラミングするための基本とアプローチを埋めようとします。
SPIの操作、電球の点滅、プロテウスでのデバッグなど、かなり単純なタスクを多数検討するため、この記事は主に初心者を対象としています。


はじめに


この記事では、 eZ430-RF2500デバッグボードに基づいたデバイスを検討します。 ボードにはMSP430F2274マイクロコントローラーとCC2500ワイヤレスモジュールが含まれていますが、これについては詳しく説明しません。
私の同僚であるSokolov S. A.は、このデバッグキットの小さな上部構造を作成しました。これはすべての結論に添付されています。 アドオンには加速度計LIS331DLHがあり、SPIを介して相互作用します。

SPIで動作するSTMicroelectronicsデバイスは非常によく似ているため、これらのデバイスでの動作は次のようになります。

何が必要ですか


開発環境

まず、開発環境とコンパイラをダウンロードしてインストールする必要があります。 現在、 Code Composer StudioTI MSP430用のIAR Embedded Workbenchmspgccの 3つのオプションがあります。
Workbench KickStart Editionを使用します。 KickStartは無料で、コードの量に制限がありますが、これは学習するには十分です。

デバッグツール

オシロスコープまたはロジックアナライザーを手元に持っていない場合、多くの場合、デバイスで実際に何が起こっているのかを誤解することに関連した困難があります。 プロテウスは、デバイスが動作を拒否する理由を理解するのに役立ちます。
多くのマイクロコントローラーMSP430を見つけることができます。 残念ながら、MSP430F2274はProteusにはありませんでしたが、アナログがあります-MSP430F2272、それを使用します。

コードを書きましょう


プロジェクト作成

この段階では、問題は発生しません。 プログラミング言語として、C ++を選択します。

Proteusのファイルをコンパイルする必要がある場合は、(ドライバー)ウィンドウの(デバッガー)タブで、(シミュレーター)を選択し、(形式)ウィンドウの(リンカー出力)タブで、(その他)および(出力形式)を設定し、intel-standartを選択し、(出力ファイル)ウィンドウで拡張子を16進数に変更します。

ポートを操作する

マイクロコントローラーで最初にマスターすることは、ポートを操作することです。 小さな例を見てみましょう。

#include "msp430f2274.h"

void main void
{
WDTCTL = WDTPW + WDTHOLD ;

P1DIR = 〜BIT2 ;
P1REN | = BIT2 ;

P1DIR | = BIT1 + BIT0 ;

while true
{
if P1IN BIT2
{
P1OUT | = BIT1 ;
P1OUT = 〜BIT0 ;
}
他に
{
P1OUT | = BIT0 ;
P1OUT = 〜BIT1 ;
}
}
}


PxDIRはポート1の方向を制御します。このレジスタの特定のビットが0に設定されると、対応するピンが入力で機能します。 逆に、対応するビットが1に設定されている場合、ピンは出力で機能します。 この例では、P1.2-ボタン、P1.0-赤色LED、P1.1-緑色LEDの3つのピンが表示されます。

PxRENには、 プルアップ抵抗が内蔵されています。 ボタンはピンをグランドに閉じ、それに応じて、ゼロ状態にします。 ボタンが押されていない場合、ピンは何にも接続されておらず、ピン上の論理ユニットを確保するには、抵抗を介して電源に接続する必要があります。これがP1RENレジスタの機能です。

PxINおよびPxOUTにポートピンの状態が含まれます。 PxOUTレジスタに0または1を設定することにより、マイクロコントローラーフットの電圧を変更し、LEDをオンおよびオフにします。 PxINレジスタから特定のビットを読み取ると、ピンに適用される論理信号が得られます。

PxSELはピン機能を選択します。 マイクロコントローラーの画像のデータシートでは、通常、機能は「/」記号で示されます。

たとえば、図P2.7では、P2SELに対応するビットに0がある場合、通常のピンのように機能します。 この場合、デフォルトでは、ユニットがそこに設定されます。つまり、このフットは外部クロック水晶振動子を接続するように設計されています。

定数BIT0..BITFはファイルmsp430f2274.hに含まれており、1を含む特定のカテゴリの16ビットワードであり、他のすべてのビットは0を含んでいます。

msp430f2274.hファイルには多くの有用な情報が含まれていることに注意してください。 すべてのコントローラー定数には、英語のコメントが付いています。

この例では、Cビット演算が使用され、「| =」はレジスタのビットを右から左に1に設定し、反対の「&=〜」は0に設定します。

何が起こった:



SPIを使用する

例から始めましょう

#include "msp430f2274.h"

符号なし char spi 符号なし charデータ、 符号なし char dataEx = 0x00 ;

void main void
{
WDTCTL = WDTPW + WDTHOLD ;

P1DIR | = BIT0 + BIT1 ;
P1OUT = 〜BIT0 ;
P1OUT = 〜BIT1 ;

P3SEL = BIT1 + BIT2 + BIT3 ;
P3DIR | = BIT0 ;
P3OUT | = BIT0 ; // CC2500を無効にします(CSに1を設定)

P2SEL = 〜BIT6 ;
P2SEL = 〜BIT7 ;
P2DIR | = BIT6 + BIT7 ;
P2OUT | = BIT6 ; //温度センサーを無効にします(これもSPIに接続されています)
P2OUT | = BIT7 ; //加速度計をオフにします


// SPIを構成します
UCB0CTL0 | = UCMSB + UCMST + UCSYNC ;
UCB0CTL1 | = UCSSEL_2 ;
UCB0BR0 = 0x02 ;
UCB0BR1 = 0 ;
UCB0CTL1 = 〜〜UCSWRST ;

if spi 0x8F == 0x32
{
P1OUT | = BIT1 ; //赤色のLED
}
P1OUT | = BIT0 ; //緑色のLED
}

符号なし char spi 符号なし charデータ、 符号なし char dataEx
{
unsigned char RX ;

P2OUT = 〜BIT7 ; //加速度計をオンにします

while IFG2 UCB0TXIFG )) ; //送信バッファを待ちます
UCB0TXBUF = data ;
while IFG2 UCB0RXIFG ; //受信バッファを待ちます
RX = UCB0RXBUF ;

while IFG2 UCB0TXIFG )) ;
UCB0TXBUF = dataEx ;
while IFG2 UCB0RXIFG ;
RX = UCB0RXBUF ;

P2OUT | = BIT7 ;

RXを返し ます。
}

この例では、レジスタ値はアドレス0x8Fで要求され、デバイスを識別するコードが含まれています。 このコードはデータシートにリストされています。 これにより、データ交換が行われたことを確認できます。 成功した場合は、赤色のLEDをオンにします。
したがって、SPIに接続されている他のすべてのデバイスは、インターフェイスから切断する必要があります。 これを行うには、それらのCSを1に設定します。

おわりに


次回は、LIS331DLHの操作についてさらに詳しく説明し、割り込みを取得し、プログラマーに組み込まれたUSB-UARTブリッジを操作して、ウォッチドッグについて少しお話します。

この記事がお役に立てば幸いです、読者。

Source: https://habr.com/ru/post/J137205/


All Articles