上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
こんばんは!

長かったGWも今日でおしまい。。。
ああ、明日からまた仕事が始まってしまう(;_;)

さて、今日はFM3マイコンに内蔵されているベースタイマを使ってLEDを点滅させるプログラムを作ってみましょう。
FM3マイコンのベースタイマには、以下の4つの機能があります。

・PWMタイマ
・PPGタイマ
・リロードタイマ
・PWCタイマ

今回はLEDを点滅させるプログラムですので、リロードタイマを用いてコードを書いてみましょう。

--ここから--

#include "mcu.h"

static void initPort(void);
static void initBaseTimer(void);

int32_t main(void){

 initPort();
 initBaseTimer();

 while(1);

 return 1;

}

static void initPort(void){

 FM3_GPIO->PFRF_f.P3 = 0;
 FM3_GPIO->PZRF_f.P3 = 1;
 FM3_GPIO->DDRF_f.P3 = 1;
 FM3_GPIO->PDORF_f.P3 = 1;

}

static void initBaseTimer(void){

 FM3_BT3_RT->TMCR = 0x3030;
 FM3_BT3_RT->TMCR2 = 0x00;
 FM3_BT3_RT->STC = 0x50;

 NVIC_EnableIRQ(BTIM0_7_IRQn);

 FM3_BT3_RT->PCSR = 0xffff;
 FM3_BT3_RT->TMCR |= 0x03;

}

void BT0_7_IRQHandler(void){

 FM3_BT3_RT->STC &= 0xfe;
 FM3_GPIO->PDORF_f.P3 ^= 1;

}

--ここまで--

今回使用しているマイコンはMB9BF618Tですので、mb9b610t.hというデバイスヘッダファイルをプロジェクトフォルダに入れ、mcu.hをインクルードすれば、このコードの様に各レジスタのアドレスがFM3_xxx->xxxのようにマクロ経由で行えるようになります。
これはPICでも同じでしたね。

なお、FM3_BT3_RT->TMCRと書けばTMCRレジスタそのものに、FM3_BT3_RT->TMCR_f.xxx(xxxはビット名)と書けば、TMCRレジスタの各ビットにアクセスできます。詳細はヘッダファイルをご確認ください。

では、ソースコードの説明に入ります。

main関数では、initPort()関数とinitBaseTimer()関数を順番に呼び出し、無限ループに入っています。
無限ループ中はタイマ割り込みハンドラにてLEDの点滅を制御します。
その割り込みハンドラがBT0_7_IRQHandler()です。

まず、initPort()関数ではポートFの3ビット目をIO設定・出力設定とし、最後にHIを出力しています。
なお、インターフェース付属ボードではHIを出力した場合、LEDは消灯します。
CQ出版社のHPから回路図が入手できますのでご確認ください。

initBaseTimer()関数内では、ベースタイマのチャンネル3をリロードタイマとして初期化し、動作を開始させています。

まず、ベースタイマをリロードタイマとして使用する場合、以下のレジスタを設定する必要があります。

・TMCRレジスタ
・TMCR2レジスタ
・STCレジスタ
・PCSRレジスタ
(・TMRレジスタ)※このレジスタは読み出しのみ

各レジスタの詳細は、富士通さんのHPから入手できるペリフェラルマニュアルをご参照ください。
ありがたいことに日本語で書かれていますので、すぐにご理解いただけると思います。

ただし、各レジスタを設定しただけでは割り込みは発生しません。
ペリフェラルタイマは、割り込みが発生するとCortex-M3コアへ
(富士通ペリフェラル君)「割り込みが発生しました!!割り込みハンドラを呼び出して下さい!!」
という信号を送ることしか出来ないからです。
ですので、Cortex-M3コアが
(Cortex-M3様)「いやじゃ」
と言ったら、割り込みハンドラは呼ばれないのです。

そのため、タイマー初期化時などにあらかじめ「タイマ割り込みが発生するから、そのときはよろしくね」と伝えておかなければなりません。
それが、赤文字で書いた
NVIC_EnableIRQ(BTIM0_7_IRQn);
という部分です。
NVIC_EnableIRQ()はNVIC用の関数で、要はCortex-M3のもつ割り込みコントローラへアクセスするための関数です。
Interface6月号の第7章にとてもわかりやすい説明がありますので、詳細はそちらをご参照ください。
(記事を書かれているのもARM社の方です)

最後に、割り込みハンドラのBT0_7_IRQHandler()です。
この関数内では、割り込みフラグのクリアと、ポート出力の反転を行っています。
なお、使用する割り込みハンドラの関数名は、あらかじめスタートアップ用のアセンブリファイル内で登録をしておかなければなりません。
この内容もInterface6月号の第5章に詳しく書かれているので、ご確認ください。

駆け足でしたが、以上がペリフェラルタイマを用いた場合のLED点滅プログラムです。
本来であれば、割り込みハンドラ内の
if(i>2000000)
部分はカウントクロックによって変化させなければなりませんが、今回は大目に見てください(笑)

最後までお読みいただいて、ありがとうございました!!(感謝)
関連記事
スポンサーサイト
コメント
コメントの投稿
トラックバック URL
トラックバック
ご訪問者様
プロフィール

ゆってぃ

Author:ゆってぃ
経歴7年の組み込み系・制御系エンジニアです。
("ど素人"という文言は取りました…笑)
ソフトウェア開発経験ゼロの状態から、なんとか実務がこなせるようになってきた現在に至るまでの経験を、備忘録代わりに綴っていきたいと思います。
入門者の方、大歓迎!
(上級者の方、ごめんなさい…)

あと、ブログには全然関係ないですが、Bumpy Headというバンドのギターをやっています。
ライブ情報なんかも書いたりすることがあるので、その時に「行ってもいいよ~」といった感じのコメントを戴けると、泣いて喜びます(泣)
ブログ読んでくださってる方なら、チケット代サービスしちゃいます!

最後に…滅多に流用することは無いでしょうが、このブログに書かれているソースは、特に指定の無い限りMITライセンスとします。ただし、一部それ以外のものもございますのでご注意下さい。
※ブログのリンク先にあるコードに関しては、リンク先のポリシーに従ってください。

最新記事
最新コメント
カテゴリ
RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

twitter
リンク
ブロとも申請フォーム
スポンサードリンク


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。