ソフトウエア開発 LPC810

ソフトウエア開発手順 -GPIO + デバッグ-

1.スイッチ・マトリックス・ツールでポートの定義

スイッチ・マトリックス・ツールを使って、ポートの定義をします。
スイッチ・マトリックス・ツールのインストール方法はこちら

スイッチ・マトリックス・ツールを実行します。

スイッチ・マトリックス・ツール

DIP8を選択します。

スイッチ・マトリックス・ツール

 

UARTポートの選択

5,8ピンをUARTとして使用するので、UARTの選択をします。

  1. ICの画の中のUSART0を選択します。
  2. Pin番号5をマウスでクリックし、選択メニューの中から、U0_RXDを選択します。
  3. 同様にPin番号8にU0_TXDを割り当てます。

スイッチ・マトリックス・ツール

2.プロジェクトの作成

プロジェクトは、サンプルのプロジェクトをImportして作成します。

トラ技のWebサイトでもサンプルの公開がされていますが、LPCXpressoにあるサンプルを使用してみます。

LPCXpressoを実行します。

LPCXpresso

ファイルを選択します。

LPCXpresso

ファイルは、

C:\nxp\LPCXpresso_7.1.1_125\lpcxpresso\Examples\NXP\LPC800\NXP_LPC8xx_SampleCodeBundle.zip

を選択し、Nextを押します。

LPCXpresso

まずは、GPIOの動作を確認したいので、

  • Blinky

を、その他に、

  • CMSIS_CORE_LPC8xx
  • CMSIS_DSPLIB_CM0
  • lpc800_driver_lib

の3つのプロジェクトを選択します。この3つのプロジェクトはBlinkyで必要になります。
選択したら、Finishボタンを押します。

LPCXpresso

 

3.Initial処理の追加

スイッチ・マトリックス・ツールで作成した処理を追加します。

LPC810 Project

 

Project ExplorerのBlinkyを開き、srcからmain.cをダブルクリックして、ファイルを開きます。
Switch Matrix Toolの下のTabから、swm.cを選択します。
今回は、Initial関数をBlinlyのソースにコピーします。

SMT Init

コピーした関数をBlinkyのmain.cにペーストし、main.cに呼び出し部を作成します。

#include "lpc8xx_clkconfig.h"
#include "lpc8xx_gpio.h"
#include "lpc8xx_mrt.h"

extern uint32_t mrt_counter;

void SwitchMatrix_Init()
{
    /* Enable SWM clock */
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7);

    /* Pin Assign 8 bit Configuration */
    /* U0_TXD */
    /* U0_RXD */
    LPC_SWM->PINASSIGN0 = 0xffff0100UL; 

    /* Pin Assign 1 bit Configuration */
    /* SWCLK */
    /* SWDIO */
    /* RESET */
    LPC_SWM->PINENABLE0 = 0xffffffb3UL;
}

/* Main Program */

int main (void) {
  uint32_t regVal;

  SystemCoreClockUpdate();
  SwitchMatrix_Init();

  /* Config CLKOUT, mostly used for debugging. */

4.デバッガの接続

デバッガ基板とPCをUSBケーブルで接続します。

LPC810デバッグ

 

5.コンパイルと接続

ファイルを保存したら、デバッグボタンを押します。
デバッグボタンを押すと、コンパイルを実行してデバッグ状態になります。

LPC810 Debug

デバッガが立ち上がらない時は...

Connect Errorが出る時は、デバッグポートが他の機能に割り当てられている事が考えられます。
その時には、

  1. デバッガからUSBケーブルを抜きます。
  2. LPC810のリセットPin(1番Pin)をLowにしたまま、USBケーブルをデバッガにつなぎます。
  3. LPC810のリセットPinをHighにします。
  4. この状態で、デバッガを起動します。(デバッグボタンを押します)

Targetの変更

このままコンパイルをすると、次のエラーがでます。

LPC810 Compile Error

 

原因は、このサンプルがLPC810のものではないからです。確認してみましょう。

Project ExplorerのBlinkyを選択した状態で、マウスの右ボタンをクリックし、Propertiesを開きます。

C/C++ Build内のMCP settingsを選択します。
TargetがLPC812になっていますので、LPC810に変更し、OKを押します。

ポートの変更

サンプルではPort0.7、16、17を使用しています。今回はPort0.4なのでその部分を変更します。

/* Set port p0.7 to output */
<span style="font-size: 13px;">GPIOSetDir( 0, 7, 1 );</span>

/* Set port p0.16 to output */
GPIOSetDir( 0, 16, 1 );

/* Set port p0.17 to output */
GPIOSetDir( 0, 17, 1 );

/* Set port p0.4 to output */
GPIOSetDir( 0, 4, 1 );

while以下の部分も変更します。
変更後のソースは、

#ifdef __USE_CMSIS
#include "LPC8xx.h"
#endif

#include "lpc8xx_clkconfig.h"
#include "lpc8xx_gpio.h"
#include "lpc8xx_mrt.h"

extern uint32_t mrt_counter;

void SwitchMatrix_Init()
{
 /* Enable SWM clock */
 LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7);

 /* Pin Assign 8 bit Configuration */
 /* U0_TXD */
 /* U0_RXD */
 LPC_SWM->PINASSIGN0 = 0xffff0100UL;

 /* Pin Assign 1 bit Configuration */
 /* SWCLK */
 /* SWDIO */
 /* RESET */
 LPC_SWM->PINENABLE0 = 0xffffffb3UL;
}

/* Main Program */

int main (void) {
 uint32_t regVal;

 SystemCoreClockUpdate();
 SwitchMatrix_Init();

 /* Config CLKOUT, mostly used for debugging. */
 regVal = LPC_SWM->PINASSIGN8 & ~( 0xFF << 16 );
 LPC_SWM->PINASSIGN8 = regVal | ( 12 << 16 ); /* P0.12 is CLKOUT, ASSIGN(23:16). */
 CLKOUT_Setup( CLKOUTCLK_SRC_MAIN_CLK );

 #if 0
 regVal = LPC_SWM->PINASSIGN0 & ~( (0xFF << 0) | (0xFF << 8) );
 LPC_SWM->PINASSIGN0 = regVal | ( (2 << 0) | (3 << 8) ); /* P0.2 is UART0 TX, ASSIGN(7:0); P0.3 is UART0 RX. ASSIGN(15:8). */
#endif

 /* Enable AHB clock to the GPIO domain. */
 LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);

 /* Set port p0.4 to output */
 GPIOSetDir( 0, 4, 1 );

 init_mrt(0x8000);

 while (1) /* Loop forever */
 {
   /* I/O configuration and LED setting pending. */
   if ( (mrt_counter > 0) && (mrt_counter <= 200) )
   {
     GPIOSetBitValue( 0, 4, 0 );
   }
   if ( (mrt_counter > 200) && (mrt_counter <= 400) )
   {
     GPIOSetBitValue( 0, 4, 1 );
   }

   else if ( mrt_counter > 400 )
   {
     mrt_counter = 0;
   }
 }
}