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を選択
プロジェクト名は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」カテゴリの記事
- LPCXpresso IDEでのC++コードサイズ肥大化の対策(2011.10.15)
- XBee APIモードライブラリのLPCXpressoへの移植(2011.10.09)
- LPCXpresso LPC1769でFree RTOSを使う(2011.07.27)
- LPCXpresso LPC1769でFatFsを動かす–USB Host編(2011.07.19)
- LPCXpresso LPC1769でFatFsを動かす - DMA編(2011.05.14)
この記事へのコメントは終了しました。
コメント