LEDチカチカ(非RTOS)
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
#analog
#norelated
#contents
* LEDチカチカ(非RTOS) [#i8a730b4]
** 構成 [#x8b981a1]
LPC1769には、基板上に最初からLEDがついています。~
なので、これを点滅させてみましょう。~
LPC1769のピンアサインについては、インストールされた中にあ...
後半の方(P31〜P33あたり)のページに、LPC1769のピンアサイン...
LEDの記載を見ると、P0[22]と書いてあるのがわかります。~
これは、ポート0の22番ピンということになります。~
#ref(ledpin.png,left,nowrap,LEDピンアサイン)
このピンの出力を、周期的に変化させてやれば、LEDチカチカが...
** プロジェクト [#n24a5191]
まずは、新規プロジェクトを作りましょう。~
QuickStartPanelのNew projectから、LPC176Xの「C Project」...
ここでは、「ledtest01」としました。~
MCUはLPC1769を選び、CMSIS Library to link project toは、C...
Code Read Protectについては、コードを読み出されないように...
#ref(ledproject.png,left,nowrap,LEDプロジェクト設定)
プロジェクトが作成されたら、右クリックからプロパティを開...
「Project References」は、CMSISv2p00_LPC17xxと、DriverLib...
これで、変数や関数の定義を、プロジェクトをまたいで遡るこ...
#ref(prjref.png,left,nowrap,プロジェクト参照)
次に、「C/C++ General」の「Paths and Symbols」を開いて、i...
まず、IncludesタブのLanguagesがGNU Cのところを選択すると...
ここに、/DriverLib/incも追加します。~
#ref(includs.png,left,nowrap,Includeパス設定)
次にLibrariesタブの設定ですが、ここもすでに、CMSISv2p00_L...
同様に、DriverLibを追加します。~
ここは、「DriverLib」と記載するだけにしておいて下さい。~
#ref(libraries.png,left,nowrap,ライブラリ設定)
最後に、Libraries Pathsの設定も同様にします。~
#ref(libpaths.png,left,nowrap,ライブラリパス設定)
ここまでで、プロジェクトの設定は終わりですので、反映させ...
QuickStartPanelからBuildを実行して、ledtest01.axfが出来上...
「Project References」で指定した、CMSISv2p00_LPC17xxと、D...
** ソースコード [#g8126864]
以下、ソースコード。~
まず、最初から作られているmain.cをベースに、以下のinclude...
// TODO: insert other include files here
#include "lpc17xx_pinsel.h"
#include "lpc17xx_gpio.h"
次に、指定時間waitするためのカウンタをグローバル変数とし...
// TODO: insert other definitions and declarations here
volatile uint32_t msTicks = 0;
void SysTick_Handler(void) {
msTicks++;
}
void systick_delay (uint32_t delayTicks) {
uint32_t currentTicks = msTicks;
while ((msTicks - currentTicks) < delayTicks);
}
そして、メイン関数は以下のようになります。~
int main(void) {
// TODO: insert code here
PINSEL_CFG_Type pincfg; // ピン設定構造体
uint32_t state = 0;
// LED初期化
pincfg.Funcnum = PINSEL_FUNC_0;
pincfg.OpenDrain = PINSEL_PINMODE_NORMAL;
pincfg.Pinmode = PINSEL_PINMODE_PULLUP;
pincfg.Portnum = PINSEL_PORT_0;
pincfg.Pinnum = PINSEL_PIN_22;
PINSEL_ConfigPin(&pincfg);
GPIO_SetDir(PINSEL_PORT_0, (1 << PINSEL_PIN_22), 1 );
GPIO_SetValue(PINSEL_PORT_0, (1 << PINSEL_PIN_22));
SysTick_Config(SystemCoreClock / 1000);
while (1) {
systick_delay(500);
state = GPIO_ReadValue(PINSEL_PORT_0);
GPIO_ClearValue(PINSEL_PORT_0, state & (1 << PINSEL_PI...
GPIO_SetValue(PINSEL_PORT_0, ~state & (1 << PINSEL_PIN...
}
return 0;
}
** ソースコード解説 [#ofe52d41]
まず、メイン関数の先頭からですが、LEDを使用するために、LE...
ピンの設定用構造体PINSEL_CFG_Typeは以下のようになっており...
(デフォルト値のままであればそのまま使えますが、一応……)~
typedef struct
{
uint8_t Portnum; /**< Port Number, should be PINSEL_POR...
where x should be in range from 0 to 4 */
uint8_t Pinnum; /**< Pin Number, should be PINSEL_PIN_x,
where x should be in range from 0 to 31 */
uint8_t Funcnum; /**< Function Number, should be PINSEL...
where x should be in range from 0 to 3 */
uint8_t Pinmode; /**< Pin Mode, should be:
- PINSEL_PINMODE_PULLUP: Internal pull-up resistor
- PINSEL_PINMODE_TRISTATE: Tri-state
- PINSEL_PINMODE_PULLDOWN: Internal pull-down resist...
uint8_t OpenDrain; /**< OpenDrain mode, should be:
- PINSEL_PINMODE_NORMAL: Pin is in the normal (not o...
- PINSEL_PINMODE_OPENDRAIN: Pin is in the open drain...
} PINSEL_CFG_Type;
PINSELやGPIOの定義は、DriverLibの中にあるヘッダの定義です...
これらは、解凍したペリフェラルドライバライブラリの中にあ...
どのような設定をすればいいかは、ユーザーマニュアルを見て...
ユーザーマニュアルは[[NXP社のHPから検索して:http://www.nx...
[[LPC17xx User manual:http://www.nxp.com/documents/user_m...
落としたら、「Chapter 8: LPC17xx Pin connect block」を開...
「Table 74」を見ると、今回使用するP0[22]は「Table 80」に...
#ref(table74.png,left,nowrap,Table 74)
「Table 80」を見ると、P0[22]は、Function00(0)の時はGPIO(...
#ref(table80.png,left,nowrap,Table 80)
この、RTS1やTD1というのは何かというのは、「Table 73. Pin ...
#ref(table73.png,left,nowrap,Table 73)
今回は、GPIOとしてこのピンを使いますので、機能は0番を指定...
PINSEL_CFG_TypeのOpenDrainは、オープンドレインにはしない...
PINSEL_CFG_TypeのPinmodeは、内蔵プルアップのままにするの...
さらに、PortnumはPINSEL_PORT_0で、PinnumがPINSEL_PIN_22な...
詳細については、ユーザーマニュアルの同じ所に載っています...
最後に、この構造体を指定してPINSEL_ConfigPinを呼べば、こ...
----
次に、そのピンに対して、実際に操作を行います。~
GPIO_SetDirは、指定したポートの、立てたビットのピンの入出...
PINSEL_PORT_0の、PINSEL_PIN_22ビットのピンを、出力(1)用に...
これでH/Lを出力できるようになったので、まずはLEDをON状態...
GPIOの命令は、GPIO_SetValueで指定したピンをHighに、GPIO_C...
一つの命令でH/Lを設定するわけではないので、注意が必要です...
ユーザーマニュアルの「Chapter 9: LPC17xx General Purpose ...
#ref(setclr.png,left,nowrap,SETとCLR)
まずはON状態で初期化するので、GPIO_SetValueにPINSEL_PORT_...
----
次に、SysTick_Configで、1msの割り込みを発生させます。~
これは、DriverLibのSYSTICK_InternalInitを使用してもいいは...
SysTick_Configは、引数に指定したクロックで割り込みを発生...
ここでは、システムコアクロックを1000で割った値を入れてい...
引数にmsを指定すればいいSYSTICK_InternalInitよりわかりに...
SysTick_Configは、System Tick Timerの割り込みを発生させま...
この中に、g_pfnVectorsという割り込み関数テーブルがあり、...
今回、同名のSysTick_Handlerという関数を作った事により、WE...
----
さて、後は、無限ループの中身ですが、最初は1msの割り込みカ...
500ms待って、LEDをトグルさせ、1秒周期の点滅にします。~
waitが終わったら、その時のポート0の状態を読み出し、ローカ...
次に、22番ピンがHighであればLowにするため、22番ピンの元の...
元の状態がLowであれば、GPIO_ClearValueには0が指定されるの...
さらに、22番ピンがLowであればHighにするため、22番ピンの元...
元の状態がHighであれば、GPIO_SetValueには0が指定されるの...
** 実行・デバッグ [#vb6fb1bf]
ソースが出来て、ビルドが通ったら、いよいよ実行です。~
LPC1769と一体になっている、LPC-LinkとPCをUSBで繋いで、Qui...
#ref(debug.png,left,nowrap,デバッグ)
初回は、ドライバのインストールなどがあり、時間がかかるか...
待つかキャンセルかを聞かれるダイアログが表示されることも...
また、USBを接続しなおしたりした場合にも、エミュレータ選択...
無事に実行できると、自動的にmain関数の先頭でbreakがかかり...
Step Over(F6)でステップ実行を行い、最初のGPIO_SetValueでL...
Resume(F8)を押せば、LEDが点滅します。~
Suspendで、その時実行している箇所で停止します。~
Terminate(Ctrl+F2)でデバッガは停止し、マイコン自体はその...
お手軽にIDEでデバッグ出来るのは楽でいいですね。~
#u2b(v1xaoRxPuSY,w=640,h=360)
** クロックの設定 [#s8a8ffe8]
デバッガで停止中に、SysTick_Configの引数に指定している、S...
ポップアップが表示されて、100000000という数字が値として設...
(このために、SYSTICK_InternalInitじゃなくてSysTick_Config...
#ref(scc.png,left,nowrap,SystemCoreClock)
実はこのLPC1769、このままでは100MHzでしか動作していません...
LPC1769より前のLPC1768ではよかったのですが、LPC1769は120M...
この設定は、CMSISv2p00_LPC17xxライブラリの方で行われてい...
CMSISv2p00_LPC17xxプロジェクトのsystem_LPC17xx.cを開いて...
#define CLOCK_SETUP 1
#define SCS_Val 0x00000020
#define CLKSRCSEL_Val 0x00000001
#define PLL0_SETUP 1
#define PLL0CFG_Val 0x00050077
//#define PLL0CFG_Val 0x00050063
#define PLL1_SETUP 1
#define PLL1CFG_Val 0x00000023
#define CCLKCFG_Val 0x00000003
#define USBCLKCFG_Val 0x00000000
#define PCLKSEL0_Val 0x00000000
#define PCLKSEL1_Val 0x00000000
#define PCONP_Val 0x042887DE
#define CLKOUTCFG_Val 0x00000000
これで、120MHzで動作するようになりました。~
こちらの詳細につきましては、以下のblogがとてもわかりやす...
参考にさせていただきました。
[[PS3とLinux、電子工作も-LPCXpresso LPC1769の120MHzクロッ...
以上で、非RTOS版のLEDチカチカは終了です。~
終了行:
#analog
#norelated
#contents
* LEDチカチカ(非RTOS) [#i8a730b4]
** 構成 [#x8b981a1]
LPC1769には、基板上に最初からLEDがついています。~
なので、これを点滅させてみましょう。~
LPC1769のピンアサインについては、インストールされた中にあ...
後半の方(P31〜P33あたり)のページに、LPC1769のピンアサイン...
LEDの記載を見ると、P0[22]と書いてあるのがわかります。~
これは、ポート0の22番ピンということになります。~
#ref(ledpin.png,left,nowrap,LEDピンアサイン)
このピンの出力を、周期的に変化させてやれば、LEDチカチカが...
** プロジェクト [#n24a5191]
まずは、新規プロジェクトを作りましょう。~
QuickStartPanelのNew projectから、LPC176Xの「C Project」...
ここでは、「ledtest01」としました。~
MCUはLPC1769を選び、CMSIS Library to link project toは、C...
Code Read Protectについては、コードを読み出されないように...
#ref(ledproject.png,left,nowrap,LEDプロジェクト設定)
プロジェクトが作成されたら、右クリックからプロパティを開...
「Project References」は、CMSISv2p00_LPC17xxと、DriverLib...
これで、変数や関数の定義を、プロジェクトをまたいで遡るこ...
#ref(prjref.png,left,nowrap,プロジェクト参照)
次に、「C/C++ General」の「Paths and Symbols」を開いて、i...
まず、IncludesタブのLanguagesがGNU Cのところを選択すると...
ここに、/DriverLib/incも追加します。~
#ref(includs.png,left,nowrap,Includeパス設定)
次にLibrariesタブの設定ですが、ここもすでに、CMSISv2p00_L...
同様に、DriverLibを追加します。~
ここは、「DriverLib」と記載するだけにしておいて下さい。~
#ref(libraries.png,left,nowrap,ライブラリ設定)
最後に、Libraries Pathsの設定も同様にします。~
#ref(libpaths.png,left,nowrap,ライブラリパス設定)
ここまでで、プロジェクトの設定は終わりですので、反映させ...
QuickStartPanelからBuildを実行して、ledtest01.axfが出来上...
「Project References」で指定した、CMSISv2p00_LPC17xxと、D...
** ソースコード [#g8126864]
以下、ソースコード。~
まず、最初から作られているmain.cをベースに、以下のinclude...
// TODO: insert other include files here
#include "lpc17xx_pinsel.h"
#include "lpc17xx_gpio.h"
次に、指定時間waitするためのカウンタをグローバル変数とし...
// TODO: insert other definitions and declarations here
volatile uint32_t msTicks = 0;
void SysTick_Handler(void) {
msTicks++;
}
void systick_delay (uint32_t delayTicks) {
uint32_t currentTicks = msTicks;
while ((msTicks - currentTicks) < delayTicks);
}
そして、メイン関数は以下のようになります。~
int main(void) {
// TODO: insert code here
PINSEL_CFG_Type pincfg; // ピン設定構造体
uint32_t state = 0;
// LED初期化
pincfg.Funcnum = PINSEL_FUNC_0;
pincfg.OpenDrain = PINSEL_PINMODE_NORMAL;
pincfg.Pinmode = PINSEL_PINMODE_PULLUP;
pincfg.Portnum = PINSEL_PORT_0;
pincfg.Pinnum = PINSEL_PIN_22;
PINSEL_ConfigPin(&pincfg);
GPIO_SetDir(PINSEL_PORT_0, (1 << PINSEL_PIN_22), 1 );
GPIO_SetValue(PINSEL_PORT_0, (1 << PINSEL_PIN_22));
SysTick_Config(SystemCoreClock / 1000);
while (1) {
systick_delay(500);
state = GPIO_ReadValue(PINSEL_PORT_0);
GPIO_ClearValue(PINSEL_PORT_0, state & (1 << PINSEL_PI...
GPIO_SetValue(PINSEL_PORT_0, ~state & (1 << PINSEL_PIN...
}
return 0;
}
** ソースコード解説 [#ofe52d41]
まず、メイン関数の先頭からですが、LEDを使用するために、LE...
ピンの設定用構造体PINSEL_CFG_Typeは以下のようになっており...
(デフォルト値のままであればそのまま使えますが、一応……)~
typedef struct
{
uint8_t Portnum; /**< Port Number, should be PINSEL_POR...
where x should be in range from 0 to 4 */
uint8_t Pinnum; /**< Pin Number, should be PINSEL_PIN_x,
where x should be in range from 0 to 31 */
uint8_t Funcnum; /**< Function Number, should be PINSEL...
where x should be in range from 0 to 3 */
uint8_t Pinmode; /**< Pin Mode, should be:
- PINSEL_PINMODE_PULLUP: Internal pull-up resistor
- PINSEL_PINMODE_TRISTATE: Tri-state
- PINSEL_PINMODE_PULLDOWN: Internal pull-down resist...
uint8_t OpenDrain; /**< OpenDrain mode, should be:
- PINSEL_PINMODE_NORMAL: Pin is in the normal (not o...
- PINSEL_PINMODE_OPENDRAIN: Pin is in the open drain...
} PINSEL_CFG_Type;
PINSELやGPIOの定義は、DriverLibの中にあるヘッダの定義です...
これらは、解凍したペリフェラルドライバライブラリの中にあ...
どのような設定をすればいいかは、ユーザーマニュアルを見て...
ユーザーマニュアルは[[NXP社のHPから検索して:http://www.nx...
[[LPC17xx User manual:http://www.nxp.com/documents/user_m...
落としたら、「Chapter 8: LPC17xx Pin connect block」を開...
「Table 74」を見ると、今回使用するP0[22]は「Table 80」に...
#ref(table74.png,left,nowrap,Table 74)
「Table 80」を見ると、P0[22]は、Function00(0)の時はGPIO(...
#ref(table80.png,left,nowrap,Table 80)
この、RTS1やTD1というのは何かというのは、「Table 73. Pin ...
#ref(table73.png,left,nowrap,Table 73)
今回は、GPIOとしてこのピンを使いますので、機能は0番を指定...
PINSEL_CFG_TypeのOpenDrainは、オープンドレインにはしない...
PINSEL_CFG_TypeのPinmodeは、内蔵プルアップのままにするの...
さらに、PortnumはPINSEL_PORT_0で、PinnumがPINSEL_PIN_22な...
詳細については、ユーザーマニュアルの同じ所に載っています...
最後に、この構造体を指定してPINSEL_ConfigPinを呼べば、こ...
----
次に、そのピンに対して、実際に操作を行います。~
GPIO_SetDirは、指定したポートの、立てたビットのピンの入出...
PINSEL_PORT_0の、PINSEL_PIN_22ビットのピンを、出力(1)用に...
これでH/Lを出力できるようになったので、まずはLEDをON状態...
GPIOの命令は、GPIO_SetValueで指定したピンをHighに、GPIO_C...
一つの命令でH/Lを設定するわけではないので、注意が必要です...
ユーザーマニュアルの「Chapter 9: LPC17xx General Purpose ...
#ref(setclr.png,left,nowrap,SETとCLR)
まずはON状態で初期化するので、GPIO_SetValueにPINSEL_PORT_...
----
次に、SysTick_Configで、1msの割り込みを発生させます。~
これは、DriverLibのSYSTICK_InternalInitを使用してもいいは...
SysTick_Configは、引数に指定したクロックで割り込みを発生...
ここでは、システムコアクロックを1000で割った値を入れてい...
引数にmsを指定すればいいSYSTICK_InternalInitよりわかりに...
SysTick_Configは、System Tick Timerの割り込みを発生させま...
この中に、g_pfnVectorsという割り込み関数テーブルがあり、...
今回、同名のSysTick_Handlerという関数を作った事により、WE...
----
さて、後は、無限ループの中身ですが、最初は1msの割り込みカ...
500ms待って、LEDをトグルさせ、1秒周期の点滅にします。~
waitが終わったら、その時のポート0の状態を読み出し、ローカ...
次に、22番ピンがHighであればLowにするため、22番ピンの元の...
元の状態がLowであれば、GPIO_ClearValueには0が指定されるの...
さらに、22番ピンがLowであればHighにするため、22番ピンの元...
元の状態がHighであれば、GPIO_SetValueには0が指定されるの...
** 実行・デバッグ [#vb6fb1bf]
ソースが出来て、ビルドが通ったら、いよいよ実行です。~
LPC1769と一体になっている、LPC-LinkとPCをUSBで繋いで、Qui...
#ref(debug.png,left,nowrap,デバッグ)
初回は、ドライバのインストールなどがあり、時間がかかるか...
待つかキャンセルかを聞かれるダイアログが表示されることも...
また、USBを接続しなおしたりした場合にも、エミュレータ選択...
無事に実行できると、自動的にmain関数の先頭でbreakがかかり...
Step Over(F6)でステップ実行を行い、最初のGPIO_SetValueでL...
Resume(F8)を押せば、LEDが点滅します。~
Suspendで、その時実行している箇所で停止します。~
Terminate(Ctrl+F2)でデバッガは停止し、マイコン自体はその...
お手軽にIDEでデバッグ出来るのは楽でいいですね。~
#u2b(v1xaoRxPuSY,w=640,h=360)
** クロックの設定 [#s8a8ffe8]
デバッガで停止中に、SysTick_Configの引数に指定している、S...
ポップアップが表示されて、100000000という数字が値として設...
(このために、SYSTICK_InternalInitじゃなくてSysTick_Config...
#ref(scc.png,left,nowrap,SystemCoreClock)
実はこのLPC1769、このままでは100MHzでしか動作していません...
LPC1769より前のLPC1768ではよかったのですが、LPC1769は120M...
この設定は、CMSISv2p00_LPC17xxライブラリの方で行われてい...
CMSISv2p00_LPC17xxプロジェクトのsystem_LPC17xx.cを開いて...
#define CLOCK_SETUP 1
#define SCS_Val 0x00000020
#define CLKSRCSEL_Val 0x00000001
#define PLL0_SETUP 1
#define PLL0CFG_Val 0x00050077
//#define PLL0CFG_Val 0x00050063
#define PLL1_SETUP 1
#define PLL1CFG_Val 0x00000023
#define CCLKCFG_Val 0x00000003
#define USBCLKCFG_Val 0x00000000
#define PCLKSEL0_Val 0x00000000
#define PCLKSEL1_Val 0x00000000
#define PCONP_Val 0x042887DE
#define CLKOUTCFG_Val 0x00000000
これで、120MHzで動作するようになりました。~
こちらの詳細につきましては、以下のblogがとてもわかりやす...
参考にさせていただきました。
[[PS3とLinux、電子工作も-LPCXpresso LPC1769の120MHzクロッ...
以上で、非RTOS版のLEDチカチカは終了です。~
ページ名: