連載
» 2015年09月11日 07時00分 UPDATE

「mbed」で始めるARMマイコン開発入門(12):ベアメタルで高速I/Oに挑戦、LPC1114の実力に迫る (2/4)

[今岡通博,MONOist]

ベアメタルでFastI/O

 それでは、クラスライブラリを使わないベアメタルでプログラムを書いてみたいと思います。

 内容としては前ページのプログラムと同じなのですが、ベアメタルとなるとLPC1114固有ペリフェラルのレジスタアドレスを意識する必要があります。今回の場合mbed.hがインクルードするヘッダファイル(またこれからインクルードされるファイル)に定義されているので、そのシンボルを使うだけでよいのですが、実際にはGPIOの入出力を設定するLPC_GPIO0->DIRやGPIOに対して値をやりとりするLPC_GPIO0->DATAなどはLPC1114のアドレス空間である0x5000-00000台にマッピングされています。

photo LPC1114のメモリマップ

 それでは簡単にプログラムを見ていきましょう。3行目でGPIOの入出力を設定するレジスタの7bit目のみを1としています。よってPort0の7番目のピンのみ出力に設定しています。ベアメタルではピンの指定の仕方がmbedとは異なりますので注意が必要です。次にベアメタルで使うピン配置図を示します。

photo

 Port0だけですが、レジスタのビットとLPC1114のピンの対応を表にしておきました。Bit7に対応するのはLPC1114の28番ピンになります。mbedでいうところのdp28あるいはLED2にあたります。

photo

 次に永久ループの中では交互にGPIO0DATAにマッピングされているレジスタへ、0x80と0x00を書き込みます。0x80が書き込まれた時には、28番ピンがhighになり0x00の場合はLowとなります。これをノーウエイトで繰り返すことになります。

1:#include "mbed.h"
2:int main(void){
3:    LPC_GPIO0->DIR =0x00000080;  //Port0-7のみ出力ポート
4:    while(1){
5:        LPC_GPIO0->DATA=0x0000080; 
6:        LPC_GPIO0->DATA=0x0000000;   
7:    }   
8:}
list3

 このプログラム(List3)を実行した時の、LPC1114のピンに出力される波形を見てみましょう。

photo ベアメタルプログラミングで高速点滅させた場合

 測定の結果グラフから波形の周波数は6.87MHzでした。これは1秒間に約687万回ループを繰り返していることになります。ベアメタルにすることによりクラスライブラリーを使ったものより9倍以上高速化することができました。

Copyright© 2017 ITmedia, Inc. All Rights Reserved.