2011年1月19日水曜日

LPC1768(Cortex-M3)のペリフェラルをレジスタ経由で制御してみる(の前に・・・)

昨日の記事でCortex-M3の導入方法について簡単に触れました。

先日の流れのまま最後のページまで到達するには途方もなく時間がかかるので、何らかのペリフェラルを例にとって実際に制御してみたいと思います。まずは「動かして楽しむ!」ですね!

今回は制御対象にUART1を選択しました。


まずはペリフェラルのクロックを確認します。
UART1のペリフェラルはPCLK_UART1というシンボルが付けられています。



そうだ。

大切な事を忘れていました。
ARM社はマイクロコントローラソフトウェアインターフェース規格を定めています。
従来、レジスタ操作などはデバイスベンダによって色々な流儀があったりして面倒でした。
簡単にいうと、これらを統一して扱いやすくするものがCMSIS(Cortex Microcontroller Software Interface Standard)です。
これは後ほど使います。
今はこんなものもあるという触りだけ・・・。

えーと、あ、そうそうUART1の話でした。
どこから始めるのかという話になるのですが、今回はレジスタによるデバイス制御に主眼を置いていますのでLPCXpressoのIDEを活用します。
また、スタートアップに関する処理はIDEが生成するものを使用します。

まずはプロジェクトの生成から。


プロジェクト名を適当に入れて下さい。


CMSISは今回使いません。(2011/01/21追記:やっぱり使いましょう!Use CMSISにチェックを入れておいて下さい!)


この辺りは初期値で良いです。


ここも。


最後にプロセッサを選択します。
今回はLPCXpresso LPC1768を使用しているのでリストからLPC1768を選択しました。
赤色になっているものは「このライセンスでは全部のROMを使う事はできないよ。」と言っていると思って頂ければ良いです。


上記の簡単な選択が終了するとプロジェクトが生成されます。
ソースディレクトリにはCランタイムスタートアップとmainが生成されています。


それでは少しだけCランタイムスタートアップを見てみましょう。
色々見るべきところはあるのですが、リセットベクタに対する関数はここで定義されています。


ここに記述されている.isr_vectorはリンカスクリプトで定義されています。
リセットベクタに書かれた関数ResetISRの実装は以下のようになっています。


dataとbssセグメントはメモリ(内蔵SRAM)上に配置されます。

初期値を持つデータはフラッシュからSRAMにここでコピーされます。
また、bssもここでゼロに初期化されます。
これら処理が終わった後でmain関数が呼び出される仕組みになっています。

また、__USE_CMSISが定義されている場合にはCMSISのSystemInit()が呼び出されるようになっています。選択したCランタイムライブラリによっては__libc_init_array()なども呼び出されます。

このようにLPCXpressoのIDEではスケルトンでここまで簡単にできてしまうようになっています。
いきなりmainから記述できてしまう。(良いやら悪いやら・・・。)

ということで、今回はペリフェラルを制御する一歩か二歩手前にお気軽に到達してみました。



(2011/01/21追記)
本当はレジスタアドレスを直接記述してと思っていましたが、説明が長くなって煩わしいページになりそうでした。当初の目的に従って「まずはレジスタでペリフェラルの操作を体験する」という事に主眼を置いて進めてみましょう!

CMSISを使う設定にした場合には以下の手順でCMSIS自体もビルドできるようにしておきます。
「Import Example project(s)」を選択します。


LPCXpressoのインストール先のサンプルプロジェクトディレクトリ内部にあるCMSISのプロジェクトzipファイルを選択します。


CMSISのプロジェクトを認識していると思うのでFinishを押して下さい。


プロジェクトエクスプローラが以下のようになっていれば、先ほど作成したuart1_testもビルドできます。

0 件のコメント:

コメントを投稿