Cortex-M3の最近のブログ記事

while(1){ }で無限に繰り返す
 初期化を終えた後は、
   while(1){
     ここに記述した処理は終わることなく続く
   } 

  前回の処理で、使用しないI/Oピンをアナログ入力に設定し終えました。次に示す緑色の強調表示された関数、RCC_APB2PeriphClockCmd()で各ペリフェラルのクロックを停止します。

 RCC_APB2PeriphClockCmd()の関数は、各ポートの設定を行う前に呼び出し各ペリフェラルの変更を行うために各ペリフェラルを活動状態にするクロックをイネーブルにし、設定が終了したので、同じ関数で不要なペリフェラルの活動を止め、省電力化を図っています。

IAR5900010.jpg

GPIOx CRLレジスタ
 今回は、GPIO_Init関数の内部の次の範囲の処理について確認していきます。この処理は、AからE各GPIOポートの下位の0から7番ピンの設定を分担しているGPIO_CRLレジスタに対する処理のルーチンです。

tmpreg = GPIOx->CRL;
for (pinpos = 0x00; pinpos < 0x08; pinpos++)

 から
              GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
             }
          }
       }
    }
  GPIOx->CRL = tmpreg;

 LogicAnalyzerの設定を続けて、動かしましょう。

  =>Start/Stop Debug Session =>

12_keil_analyzer.GIF

ARMマイコン入門(57) STM32 バリュー・ラインを使ってみる(12)
GPIO_Init()関数

   前回、GPIOの初期化を行うために必要な情報の受け渡しにデータ構造を使用していることを確認しました。また、列挙型の型定義で受け渡しデータの型定義を行っています。独自に定義された型のデータは定義部で具体的な設定の値を確認することができました。それらの結果を基にGPIO_Init関数で何が行われているか確認します。

GPIOモードの設定
   GPIO Mode ConfigurationでGPIOポートの設定を行っています。まず最初の命令で、初期化のために渡されたGPIO_Modeの値を変数currentmodeにセットしています。GPIO_Modeはデータ構造GPIO_InitStructの中に構造体のメンバとで、GPIOポートの入出力などのモードが設定されています。

 μVison4のデバッガには変数の変化をグラフ化することができるLogic Analyzer(以後、Analyzer)が内蔵されています。使ってみましょう。

事前準備
 ダウンロードしたAnalyzer確認用プログラムを解凍します。

 確認用プログラムは、こちらよりダウンロードできます。
  2bk0214_Analyzer_test.lzh


1_keil_analyzer.GIF
 前回ストップウオッチで200000回のループ時間を計測した結果、0.6166892秒でした。これを1ループ0.5秒になるように調整します。
 ループ回数をx回とすると、次の式でxを求めることができます。

   200000:x=0.61666892:0.5

   x=162161

をセットすればよいことがわかりました。

  =>16216をセットしてbuild、download =>

10_stopwatch.GIF
 μVison4のデバッガにストップウオッチ機能があります。使ってみましょう。
  =>プロジェクトは前回使ったHello_LED.uvprojを使います =>

1_stopwatch.GIF

列挙型変数の定義
 GPIOMode TypeDefは型名で、enum宣言でGPIO_Modeの各設定状態を列挙型変数として定義しています。列挙型変数の基本的な要素(列挙定数)は整数です。この整数値に、各値に与えられた機能を類推できるわかりやすい名前を与えているのが、列挙型の型定義です。
 意味がわかりにくい0x00の値に、GPIO_Modeをアナログ入力モードに設定するという役割をGPIO_Mode_AINという名前を付けてわかりやすくしています。

 μVison4のデバッガ機能には変数の内容を表示するウォッチする機能があります。
  =>変数kをドラッグ、右クリック =>

12_debug2_trace.GIF

STM32バリュー・ライン用のサンプル・プログラムGPIOToggleを動かす
   今回は、GPIO_Init()関数でどのようなことが行われているか確認します。半分はSTM32のGPIOの制御の仕組みについて、半分はプログラムのCの記述方法の話になります。手元にJIS プログラム言語C JISX3010をおき、参照しながら確認することにします。
 GPIO_Initを呼び出す前に各GPIOの操作を行うためには各ポートのクロックをイネーブルにする必要があるため、RCC_APB2PeriphClockCmd関数でGPIOの該当ポートのクロックをオンにしました。関数GPIO_Initに渡す引数として対象汎用入出力ポート名と初期化のための次の二つのデータを用意します。
 この二つのデータは、初期化のためのデータ構造 GPIO_InitStructureのメンバのGPIO対象ピンを示すGPIO_PinとGPIOの動作モードを指定するGPIO_Modeの二つです。
 GPIO_InitStructure.GPIO_Pinには16ビットがすべて1がセットされたGPIO_Pin_Allの値が書き込まれ、GPIO_InitStructure.GPIO_ModeにはGPIO_Mode_Ainの値が書き込み、この初期化データのデータ構造のアドレスをGPIO_Init関数の2番目の引数として渡します。データ構造のアドレスを示すために、2番目の引数はデータ構造名GPIO_ InitStructureにこの変数のアドレスであることを示す&を付加し記入されています。
        &GPIO_InitStructure

 

IAR5500010.jpg
 μVison4のデバッガを起動できるようになりましたか? 引き続き、デバッガに内蔵しているトレース機能を試します。

 今回使用するプロジェクト・ファイルは、こちらよりダウンロードしてください。
   
2ak1223_Hello_LED.lzh

 ダウンロードしたファイルは解凍してください。

  =>Peoject =>Open Project =>

1_debug2_trace.GIF
 KEIL MCBTMPM360とμVison4の組み合わせることにより、強力なデバッグ機能を実現しています。最強といえるデバッグ機能を使ってみましょう。

  =>Debug =>Start/Stop Debug Session =>

1_debug_start.GIF
  =>μVison4の評価版ではデバッグ可能なコードに32kBytes以下の制限がある =>OK =>

2_debug_start.GIF

STM32バリュー・ライン用のサンプル・プログラムGPIOToggleを動かす
  前回、次のメイン・プログラムの開始部から、プログラムのステップ動作を開始しました。ボードのLED4を点滅させるPC8、LED3を点滅させるPC9、SW入力を受け取るPA0の各ディジタル・ポートの設定のため、GPIOポートのクロックをイネーブルにしました。

IAR5400010.jpg
 addするファイルはこちらからダウンロードしてください=>Hello_LED_source.lzh

  =>Targetの名前がTMPM364F10になっていることを確認 =>

12_new_project.GIF

STM32バリュー・ライン用のサンプル・プログラムGPIOToggleを動かす
Assert_parm関数、アロー演算子

    GPIOToggleのメイン・プログラムから最初に呼び出されるRCC_APB2PeriphClockCmd関数に制御が移ります。次に示すように呼び出された関数の最初の3行を飛ばして、引数NewStateがDISABLEでないかのチェックを行っています。 

IAR5300010.jpg





カテゴリ


Copyright (C) 2006-2015 CQ Publishing Co.,Ltd. All Rights Reserved.