« トラ技別冊MARY基板のデバッグ | トップページ | Debug printf用の可変長引数マクロ »

LPCXpressoでCMSIS Peripheral Libraryを使う

LPCXpresso IDEには、ARMが提供するMCUコアへのアクセスに対応したライブラリ(レジスタ名の定義など)がビルトインされていますが、加えてNXPが提供するPeripheral Firmware Driver Library(以下、Peripheral Library)が存在します。この、Peripheral Libraryを使うとI/Oの設定などのコードの可読性が上がるので私のお気に入りアイテムです。

そこで、LPCXpresso IDEでPeripheral Libraryを使えるようにしてみました。ついでに、IDE添付のライブラリを1.3から最新の2.0にしてみました。IDEは執筆時点の最新版である、v3.6.3(Build 317)を使用。


新規ライブラリプロジェクトの作成

先ずは、このリンクから最新のCMSISファイル一式(LPC17xx CMSIS-Compliant Standard Peripheral Firmware Driver Library)をダウンロード。

CMSISv2.0ベースで、コンパイル済みのライブラリを作成します。手順は以下です。

1. IDEのProject and File WizardsからCreate C Static Library projectを選択

NewLibrary

プロジェクト名はCMSISv2p01_LPC17xxとしました。

2. プロジェクトのフォルダーに以下のファイルをコピー

□inc

  • core_cm3.h, core_cmFunc.h, core_cmInstr.h(LPC1700CMSIS\Core\CM3\CoreSupportフォルダー)
  • system_LPC17xx.h(LPC1700CMSIS\Core\CM3\DeviceSupport\NXP\LPC17xx)
  • LPC1700CMSIS\Drivers\includeフォルダ配下のファイル一式

□src

  • core_cm3.c(LPC1700CMSIS\Core\CM3\CoreSupportフォルダー)
  • system_LPC17xx.c → IDE添付版の方が版数が進んでいるため、IDE添付版を使用
  • LPC1700CMSIS\Drivers\sourceフォルダ配下のファイル一式

3. ビルド → libCMSISv2p01_LPC17xx.aファイルができあがり


サンプルの作成

Peripheral LibraryのSysTick,PINSEL, GPIOを使ってLチカのサンプルを作ってみました。手順は以下です。

1. プロジェクトの作成

  • New Project → NXP LPC1700 C Projectを選択
  • デフォルトのテンプレートに従うため、ライブラリとインクルードファイルの参照先がCMSISv1p30_LPC17xxとなっています。プロパティーからMCU Compiler→Directories , MCU Linker→Librariesのの設定をCMSISv2p01_LPC17xxに修正します
  • LPC1700CMSIS\Examples\SysTick\10ms_baseから、lpc17xx_libcfg.hをコピー。今回はGPIO以外は使わないため、このファイルがそのまま使用できますが、UARTなど他のペリフェラルを使用する場合は、対応する定義をコメントアウト

2. Lチカコードはこんな感じです

/*
===============================================================================
 Name        : main.c
 Author      : Todotani
 Version     : 1.0 2011/4/17
 Description : LED flash for LPCXpresso LPC1769 with CMSIS Libraries
===============================================================================
*/

#include "LPC17xx.h"
#include "lpc17xx_libcfg.h"
#include "lpc17xx_pinsel.h"
#include "lpc17xx_gpio.h"
#include "lpc17xx_systick.h"

FunctionalState LED_State = ENABLE;

// SysTick interrupt handler
void SysTick_Handler(void)
{
    // toggle LED2 port (P0.22)
    if (LED_State == ENABLE)
    {
        // Output Low level
        GPIO_ClearValue(0, (1<<22));
        LED_State = DISABLE;
    }
    else
    {
        GPIO_SetValue(0, (1<<22));
        LED_State = ENABLE;
    }
}


int main(void) {
    //Configure LED port - GPIO P0.22
    PINSEL_CFG_Type PinCfg;
    PinCfg.Portnum   = 0;
    PinCfg.Funcnum   = 0;                        // Set port as GPIO
    PinCfg.OpenDrain = PINSEL_PINMODE_NORMAL;
    PinCfg.Pinmode   = PINSEL_PINMODE_TRISTATE;  // pull-up / pull-down disabled
    PinCfg.Pinnum    = 22;
    PINSEL_ConfigPin(&PinCfg);

    //Use P0.22 is connected to LED2
    GPIO_SetDir(0, (1<<22), 1); //Set P0.22 as output

    //Initialize System Tick with 100ms time interval
    SYSTICK_InternalInit(100);
    //Enable System Tick interrupt
    SYSTICK_IntCmd(ENABLE);
    //Enable System Tick Counter
    SYSTICK_Cmd(ENABLE);

    // Enter an infinite loop, just incrementing a counter
    volatile static int i = 0 ;
    while(1) {
        i++ ;
    }
    return 0 ;
}
  • 38~44行目で、PINSEL/PINMODEレジスタの設定を行っています
  • 47行目で、LEDが繋がっているP0.22をOutputに設定
  • 50行目以下で、systick割り込み周期を設定
  • 19行目以降のsystick割り込みハンドラーで、LEDをトグル


ライブラリのライセンス条件

ARM社のCMSISライセンスアグリーメントを見ると、ライブラリの使用者は、ライブラリのコピーや製品への組み込みは許諾されますが、改変や再配布については特に記載がないことから許していないと考えられます(ヘッダファイルには、can be freely distributed within development toolsとあり、IDE組み込み用の再配布のみ許可)。そのため、ライブラリコードそのものはブログに掲載しないことにしました。

ARMのライセンスはCoreライブラリの部分だけで、Peripheral LibraryはNXPのライセンスが適用されると思います。こちらは、"for illustrative purposes only which provides customers with programming information regarding the products"とあり、「プログラム情報の例示用」という自分には解釈が難しい表現になっています。個人で説明用途に使う分にはOKだが再配布や製品への組み込みはダメよの意味と思っておけばよいのかな・・

« トラ技別冊MARY基板のデバッグ | トップページ | Debug printf用の可変長引数マクロ »

NXP-ARM」カテゴリの記事

コメント

この記事へのコメントは終了しました。

2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ