2016年12月30日

オープンソースのKiCADでLPC824のDIP化基板を作ってみる(30) 外部クロック(宿題)

今回作成した基板は12MHzの振動子も実装しています。



Image 362.png

うごかしているプロジェクトは内蔵の12MHzでPLLで30MHzにして動作させています。

LPC82xのユーザマニュアルをみたり呼ばれていないけど用意されている関数等を
呼んでみたりしたのですが、動作させられていません。

lib_lpc_board_8xxのboard_sysinitの
/* Set up and initialize clocking prior to call to main */
void Board_SetupClocking(void)
{
 /* Crystal is available on the board
  * but not connected by default.
  */
  Chip_SetupIrcClocking();

}

  Chip_SetupIrcClocking();の代わりに

       Chip_SetupXtalClocking();
を呼ぶ。

先だって
UM10800の
5.3.3 Set up the system oscillator using XTALIN and XTALOUT
に従って

 Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);
       
        ///
        Chip_IOCON_PinSetMode(LPC_IOCON, IOCON_PIO8, PIN_MODE_INACTIVE);
        Chip_IOCON_PinSetMode(LPC_IOCON, IOCON_PIO9, PIN_MODE_INACTIVE);
       
        Chip_SWM_EnableFixedPin(SWM_FIXED_XTALIN);
        Chip_SWM_EnableFixedPin(SWM_FIXED_XTALOUT);

なども呼んでみたのですが、
Chip_SetupXtalClocking関数内で

PLLのロック待ちで無限ループになってしまいます。
ちゃんと発振できていないようです。

ハード要因かソフト要因かは切り分けていかないといけない、のですが。

外付けも12MHz、内蔵も12MHz ということで、
精度を気にしなければ、実装面積もコストも内蔵でいいのでは、ということで
とりあえず、宿題としておきます!


参考までに、今回の基板のLPC_824_DIP.pdf回路図をアップ。

スイッチが3.3V出力。
クロックは動作未確認ですので、本当に参考まで。

その他はピン出しだから問題ないかと。

posted by EWRXJP at 12:00| Comment(0) | TrackBack(0) | NXP | このブログの読者になる | 更新情報をチェックする

2016年12月29日

オープンソースのKiCADでLPC824のDIP化基板を作ってみる(29) スイッチを使ってみる(2)

なぜ、スイッチを押しても0(GND)にならないか?

半田不良ではなさそうです。

自分で書いた回路図を見直してみます。

Image 360.png

大ミスです。
3.3Vに吊っておいて、スイッチを押したらGNDに落ちる ようにしていたつもりが
GNDには接続されておらず、スイッチを押したら3.3Vに吊られるようになっていました。


困りました。。


ちょっと考えてみると、スイッチを押しても押さなくても1になる。

ということはLPC824はプルアップされている?

じゃん太を外して、ピンを浮いている状態にしてもやはり1のままです。


プルアップされている、ということはプルダウンもできるのでは?


調べてみたところ、lib_lpc_chip_82xのipcon_8xx.cに
/* Set the pin mode (pull-up/pull-down). */
void Chip_IOCON_PinSetMode(LPC_IOCON_T *pIOCON, CHIP_PINx_T pin, CHIP_PIN_MODE_T mode)
{
 uint32_t reg;
 reg = pIOCON->PIO0[pin] & ~(PIN_MODE_MASK);
 pIOCON->PIO0[pin] = reg | (mode << PIN_MODE_BITNUM);
}

という関数を見つけました。

mainに追記してみます。


int main(void)
{
  static int pin_state = 0;
  int prev_state;
  static int count = 0;
   
 SystemCoreClockUpdate();
 Board_Init();
 Board_LED_Set(0, false);
 
        Chip_IOCON_PinSetMode(LPC_IOCON, IOCON_PIO1, PIN_MODE_PULLDN);      
        Chip_GPIO_SetPinDIRInput(LPC_GPIO_PORT, 0, 1);
 
 /* Enable SysTick Timer */
 SysTick_Config(SystemCoreClock / TICKRATE_HZ);
        prev_state = Chip_GPIO_GetPinState(LPC_GPIO_PORT, 0, 1);
      
       
 /* Loop forever */
 while (1) {
  //__WFI();
          pin_state = Chip_GPIO_GetPinState(LPC_GPIO_PORT, 0, 1);
          if(pin_state != prev_state)
          {
            prev_state = pin_state;
            count++;
          }
         
 }
}

無事動作しました!
スイッチを押していないときは0,押しているときは1。

チャタリング防止を回路上入れていないので、雑に押すと
数カウントアップします。

まあ、ソフト的に対応可能ですね。

Image 361.png


回路図 間違えてしまいましたが
なんとかリカバリーできました^^
posted by EWRXJP at 12:00| Comment(0) | TrackBack(0) | NXP | このブログの読者になる | 更新情報をチェックする

2016年12月28日

オープンソースのKiCADでLPC824のDIP化基板を作ってみる(28) スイッチを使ってみる(1)

さて、GPIOのInputとしてスイッチを使ってみたいと思います。

ぱっとみたところ、LPCOpenのサンプルの中に入力が見つかりません。
おそらく、LED用の出力コードの周辺に入力のライブラリも用意されているはず、ということで探してみます。

lib_lpc_boards_8xxのboard.cに
以下の関数がありmす。

/* Initialize the LEDs on the NXP LPC824 LPCXpresso Board */
static void Board_LED_Init(void)
{
 int i;
 for (i = 0; i < LEDSAVAIL; i++) {
  Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, 0, ledBits[i]);
  Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, ledBits[i], true);
 }
}
Chip_GPIO_SetPinDIROutputがある、ということはInputもあるはず。

Chip_xxxで始まるのは
lib_lpc_chip_82xにふくまれます。



検索したらgpio_8xx.hにいました。
ヘッダの中でインライン記述していますね。

STATIC INLINE void Chip_GPIO_SetPinDIROutput(LPC_GPIO_T *pGPIO, uint8_t port, uint8_t pin)
{
#ifdef CHIP_LPC82X
 pGPIO->DIRSET[port] = 1UL << pin;
#else
 pGPIO->DIR[port] |= 1UL << pin;
#endif
}
/**
 * @brief Set GPIO direction for a single GPIO pin to an input
 * @param pGPIO : The base of GPIO peripheral on the chip
 * @param port : GPIO port to set (supports port 0 only)
 * @param pin  : GPIO pin to set direction on as input
 * @return Nothing
 */
STATIC INLINE void Chip_GPIO_SetPinDIRInput(LPC_GPIO_T *pGPIO, uint8_t port, uint8_t pin)
{
#ifdef CHIP_LPC82X
 pGPIO->DIRCLR[port] = 1UL << pin;
#else
 pGPIO->DIR[port] &= ~(1UL << pin);
#endif
}

ついでに、入力値を読む関数も探しておきます。
特定ポートの値をtrue/falseで返してくれる関数のようです。
STATIC INLINE bool Chip_GPIO_ReadPortBit(LPC_GPIO_T *pGPIO, uint32_t port, uint8_t pin)
{
 return (bool) pGPIO->B[port][pin];
}

chipのライブラリ関数はアプリ側から直接呼べます。

Lチカのmainを書き換えてみます。

ボタンを押されたらGNDになるので、0。
それ以外はプルアップで1。
状態が変わったらカウントアップ。というコードです。

int main(void)
{
  static int pin_state = 0;
  int prev_state;
  static int count = 0;
   
 SystemCoreClockUpdate();
 Board_Init();
 Board_LED_Set(0, false);
  Chip_GPIO_SetPinDIRInput(LPC_GPIO_PORT, 0, 1);
 
 /* Enable SysTick Timer */
 SysTick_Config(SystemCoreClock / TICKRATE_HZ);
        prev_state = Chip_GPIO_GetPinState(LPC_GPIO_PORT, 0, 1);
      
       
 /* Loop forever */
 while (1) {
  //__WFI();
          pin_state = Chip_GPIO_GetPinState(LPC_GPIO_PORT, 0, 1);
          if(pin_state != prev_state)
          {
            prev_state = pin_state;
            count++;
          }
         
 }
}

countとpin_stateをライブウォッチに登録します。
実行して、ボタンを押して観測してみます。

Image 357.png

なぜかpin_stateが1っぱなしで変わりません。。

ちょっと調査をしてみます。
posted by EWRXJP at 12:00| Comment(0) | TrackBack(0) | NXP | このブログの読者になる | 更新情報をチェックする

2016年12月27日

オープンソースのKiCADでLPC824のDIP化基板を作ってみる(27) Lチカをしてみる(2)

blinkyプロジェクトのメインコードは、こんな感じで、非常にシンプルです。

void SysTick_Handler(void)
{
 Board_LED_Toggle(0);
}
/**
 * @brief main routine for blinky example
 * @return Function should not exit.
 */
int main(void)
{
 SystemCoreClockUpdate();
 Board_Init();
 Board_LED_Set(0, false);
 /* Enable SysTick Timer */
 SysTick_Config(SystemCoreClock / TICKRATE_HZ);
 /* Loop forever */
 while (1) {
  __WFI();
 }
}

Board LEDをSysTickでトグルさせています。

ではこのBoard LEDがどこで定義されているか、というと

lib_lpc_boards_8xxです。

boards.cの中でLEDポートの定義をしています。
Image 322.png
元はLED3つで、0.12,16,17になっていましたが、
今回起こしたボードは0.0の1つだけなので、以下のように書き換えます。


//#define LEDSAVAIL 3
//static const uint8_t ledBits[LEDSAVAIL] = {12, 16, 27};


#define LEDSAVAIL 1
static const uint8_t ledBits[LEDSAVAIL] = {0};



修正したらlibをリビルドし、blinkyもリビルドします。

ICEはI-jetを使うように変更、

Image 323.png

デフォルトでI-jetから5V供給するようになっているので、そのままにしておきます。


Image 324.png

これで、ダウンロードしてデバッグ、で実行すると、無事にボード先端のLEDが点滅してくれました。

Image 325.png


LEDのところのジャンパを付けるのを忘れないようにしないといけません。

ちなみに、LPC-LINK2でもできるはず、ですが、LPCLINK2はJTAGからの5V給電がないので、
コネクタから5Vか3.3Vを電源用に出したコネクタに入れてあげる必要があります。


posted by EWRXJP at 12:00| Comment(0) | TrackBack(0) | NXP | このブログの読者になる | 更新情報をチェックする

2016年12月26日

オープンソースのKiCADでLPC824のDIP化基板を作ってみる(26) Lチカをしてみる(1)

基板も用意できたので、確認がてらLチカをしてみます。

LPCZone:NXP LPCマイコン情報

LPC8xxのボード用のサンプルコードをクリック

Image 317.png


今回は、回路図も参考にしたLPC824 MAXボードのサンプルを使います。
LPCExpresso用と、IAR/Keil用があるので、IAR用をクリックしてダウンロード。


Image 318.png

zipを解凍すると、階層ふかいのですが
lpcopen_2_19_keil_iar_nxp_lpcxpresso_824\applications\lpc8xx\iar_ewarm_projects\nxp_lpcxpresso_824
にある、nxp_lpcxpresso_824_periph_examples.ewwを起動
Image 319.png

ワークスペースの中に、たくさんのプロジェクトが登録されています。
Image 320.png

上の2つはライブラリ用のプロジェクトで、他のプロジェクトが各種ペリフェラルのサンプルです。

lib_lpc_chipはLPC824の汎用ライブラリ、
lib_lpc_boardは、LPC824MAXボード用のライブラリです。

まずは両方ビルドしましょう。
順番はどちらからでもビルド通るようです。

つづいて定番のBlinky、periph_blinkyをメイクします。
ライブラリのビルドができていないとエラーになるので、気をつけましょう。。
Image 321.png



無事メイクが通りました。ただ、MAXボードと、今回のボードはLEDのポートを変えているので
このままではLチカできません。

ポートを変更していきたいと思います。

posted by EWRXJP at 12:00| Comment(0) | TrackBack(0) | NXP | このブログの読者になる | 更新情報をチェックする