LPC810M021FN8 (18) -- アナログ・コンパレータ (3)

1 月 29 日付けの記事で使用した LPC810 プログラムのソース・リストと、コンパイル結果のオブジェクトの HEX ファイルを掲載します。
今回はリストの掲載だけで、詳しい説明については次回以降に回します。
LPC810M021FN8 を「単体」コンパレータとして使うための初期設定を済ませたあと、「スリープ・モード」に移行して、それ以降のプログラム実行は休止します。

/************************************************/
/* acmp_810 : Configure analog comarator (only) */
/*                                              */
/* 2014/01/21 Crated by pcm1723                 */
/************************************************/
#include "chip.h"

// placeholder
 __attribute__((weak)) void SystemInit( void )
{
} // void SystemInit()

void LPC8xx_acmp_setup(ACMP_POS_INPUT_T vp_sel,  // pos in 
                       ACMP_NEG_INPUT_T vm_sel,  // neg in
                       int              lad_sel) // ladder value
{
// initailize (power ON, bus clock ON and reset)	
  LPC_SYSCTL->PDRUNCFG &= (~SYSCTL_SLPWAKE_ACMP_PD);
  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_ACOMP);
  Chip_SYSCTL_PeriphReset(RESET_ACMP);
// Analog Comparator control register
  LPC_CMP->CTRL = ( ACMP_EDGESEL_FALLING // EDGESEL = fall
                  | vp_sel               // +input select
                  | vm_sel               // -input select
                  | ACMP_HYS_5MV      // hysteresis = 5 mV
                  );  
// setup voltage laddr if used
  if ((ACMP_POSIN_VLO == vp_sel) || (ACMP_NEGIN_VLO == vm_sel)) { 
    LPC_CMP->LAD = ( ACMP_LADENAB_BIT  // ladder enable
                   | (ACMP_LADSEL_MASK & (lad_sel << 1))    // ladder value
                   );
  } // if (lad_sel)
} // void LPC8xx_acmp_setup()

void LPC8xx_pin_setup( void )
{ 
  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_IOCON);
  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);
// disable pull-up/pull-down on ACMP_I1 (P0_0)
  LPC_IOCON->PIO0[IOCON_PIO0] &= ~PIN_MODE_MASK;
// disable pull-up/pull-down on ACMP_I2 (P0_1)
  LPC_IOCON->PIO0[IOCON_PIO1] &= ~PIN_MODE_MASK;
// enable ACMP_I1 on P0_0 (pin8 of DIP8, fixed assign)  
  Chip_SWM_EnableFixedPin(SWM_FIXED_ACMP_I1);
// enable ACMP_I2 on P0_1 (pin5 of DIP8, fixed assign)  
  Chip_SWM_EnableFixedPin(SWM_FIXED_ACMP_I2);
// enable ACMP_O  on P0_4 (pin2 of DIP8)  
  Chip_SWM_MovablePinAssign(SWM_ACMP_O_O,  4);	 
} // void LPC8xx_pin_setup()

void LPC8xx_periph_setup( void )
{
  LPC8xx_acmp_setup(ACMP_POSIN_ACMP_I1, ACMP_NEGIN_ACMP_I2, 0);
  LPC8xx_pin_setup();
}

int main( void )
{
  LPC8xx_periph_setup();
  __WFI(); // sleep
} // int main()

インクルード・ファイル/ライブラリとして LPCOpen V2.01 の「chip.h」からインクルードされるファイル群と、スイッチ・マトリクス・モジュールのライブラリ「swm_8xx.c」を使っています。
Keil/ARM uVision V4.53 のコンパイラコンパイルしたオブジェクトの HEX ファイルを下に示します。
フラッシュ・サイズは 768 バイトです。

:020000040000FA
:10000000600200104D0100005D010000550100007C
:1000100000000000000000000000000000000000E0
:100020000000000000000000000000005701000078
:100030000000000000000000590100005B0100000A
:100040005D0100005D010000000000005D01000096
:100050005D0100005D0100000000000000000000E4
:100060005D0100005D0100005D0100005D01000018
:100070005D0100005D010000000000005D01000066
:100080000000000000000000000000000000000070
:100090000000000000000000000000000000000060
:1000A0005D0100005D0100005D0100005D010000D8
:1000B0005D0100005D0100005D0100005D010000C8
:1000C00000F002F800F032F80CA030C8083824180C
:1000D0002D18A246671EAB4654465D46AC4201D180
:1000E00000F024F87E460F3E0FCCB6460126334280
:1000F00000D0FB1AA246AB4633431847F00100007C
:10010000000200000023002400250026103A01D33D
:1001100078C1FBD8520700D330C100D50B607047BF
:100120001FB5C046C0461FBD10B510BD00F02BF86E
:100130001146FFF7F5FF00F0D2F800F043F803B4E2
:10014000FFF7F2FF03BC00F047F8000007488047C4
:1001500007480047FEE7FEE7FEE7FEE7FEE7000090
:1001600004480549034A054B70470000DD020000C2
:10017000C10000006000001060020010600000106C
:10018000704770477047754600F022F8AE4605008C
:1001900069465346C008C000854618B020B5FFF731
:1001A000DFFF60BC00274908B6460026C0C5C0C5B1
:1001B000C0C5C0C5C0C5C0C5C0C5C0C5403D49005B
:1001C0008D4670470446C046C0462046FFF7B7FF3D
:1001D000004870470000001001491820ABBEFEE740
:1001E000260002007047000003490A68012383408B
:1001F0001A430A60704700008080044003490A687F
:10020000012383409A430A6070470000C0C1004048
:10021000020700098300064810B5520E1B18186823
:10022000FF249440A04391400143196010BD000099
:1002300000C0004070B5044611480D46816B16465B
:100240000122D203914381631320FFF7CDFF0D48B4
:100250004268012109038A43426042680A434260BE
:10026000204628434903411807480160002C01D06B
:10027000002D03D1F106890E491C416070BD0000BC
:10028000008204400080044000400240012110B57B
:10029000090300220811FFF7CDFF00F001F810BD9F
:1002A00010B51220FFF7A0FF0720FFF79DFF0A49B6
:1002B0004A68182082434A6007494039CA6A824323
:1002C000CA620020FFF79AFF0120FFF797FF042181
:1002D0008120FFF79DFF10BD40400440704710B5DE
:1002E000FFF7D4FF30BF002010BD00000003000066
:1002F000000000106002000004010000FFFFFFFF8B
:040000050000014DA9
:00000001FF

この HEX ファイルを「FlashMagic」などで書き込めば、

  • 8 番ピン - 非反転入力 (+ 入力)
  • 5 番ピン - 反転入力 (- 入力)
  • 2 番ピン - 出力

として機能する「単体」コンパレータになります。
ただし、電源投入/リセット時に 5 番ピンが低インピーダンスのロジック「L」レベルになっていると、シリアル ISP が強制起動してしまい、ユーザプログラムが実行されないことに注意する必要があります。
SWD 接続するための 3 番ピン、4 番ピンは空いているので、SWD 経由でのフラッシュ書き込み/デバッグも可能です。 (デバッグは wfi 命令を実行後は不可)