2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

カテゴリー

ブログパーツ

無料ブログはココログ

« STM32F4 DISCOVERYのGPIOをテストする(新規プロジェクト編) | トップページ | STM32F4 DISCOVERYのシリアル通信(UART)をテストする(送信編) »

2011年12月 8日 (木)

STM32F4 DISCOVERYのGPIOをテストする(プログラム作成編)

ロボット作ろう:シェーキー製作記

いよいよプログラムです。今回はまず、基板上のユーザーボタンを押している間オレンジのLEDを点滅させるプログラムを作ってみます。

GPIOを使う前に、本来ならばクロックの初期設定が必要ですが、今回はこれを後回しにします。どのマイコンでもリセット後の初期状態でマイコンが動作しないということはありませんので、下手にいじって動かなくなっては大変、とにかく確実に動く状態でテストしようというわけです。そのため、最高速度で動いているのかどうかはわかりません。

STMのマイコンのペリフェラルプログラムは、普通のマイコンとはちょっと違います。PICなどではレジスタに直接値を書き込んで設定を変更しますが、基本的にこのマイコンは定義済みの関数を使って設定やデータのやり取りを行います。もちろん、レジスタに直接パラメータを書き込むことも出来ますが、プログラムの見通しを良くし、バグが入り難くするためにこのようになっているようです。

従って、どんな関数があるかを知らないと、とてもやり難いことになります。
ペリフェラル関係のヘッダファイルはLibrariesの中のSTM32F4xx_StdPeriph_Driverの中にあります。TrueSTUDIOのメイン画面のProject Explorerからアクセスしてみてください。

このフォルダの中のincを開くとたくさんのヘッダファイルがあります。GPIO関係のヘッダファイルはstm32f4xx_gpio.hです。コレを覗いてみると、ずらりと#defineが並び、最後のほうにいくつか関数が定義されています。これがGPIOを操作する関数です。

さて、ともあれプログラムを作ってみました。main関数はこんな風になりました。(インデントが崩れて見にくいですが)

int main(void)
{
//GPIO初期化################################
//GPIO初期化のための構造体GPIO_InitStructureを作る
GPIO_InitTypeDef GPIO_InitStructure;

//PORTAの設定開始(INPUT)---------------------------------
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
//初期化用構造体にパラメータをセットしていくため、いったん初期値に戻す
GPIO_StructInit(&GPIO_InitStructure);
//設定するピンを指定する(スイッチのピン・アクティブハイ)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
//指定したピンを入力に指定する
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
//プルアップを使用しない
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//GPIOのスピードを100MHz(最高速)にセットする
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

//PORTA設定入力終了。これでGPIOAを設定する
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PORTAの設定終了----------------------------------------

//PORTDの設定開始(OUTPUT)--------------------------------
//PORTDにクロックの供給を開始
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
//初期化用構造体にパラメータをセットしていくため、いったん初期値に戻す
GPIO_StructInit(&GPIO_InitStructure);
//設定するピンを指定する(4つのLED)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 |GPIO_Pin_13 | GPIO_Pin_14 |GPIO_Pin_15;
//指定したピンを出力に指定する
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
//出力ポートのタイプをプッシュプルに指定する
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//プルアップを使用しない
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//GPIOのスピードを100MHz(最高速)にセットする
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

//PORTD設定入力終了。これでGPIODを設定する
GPIO_Init(GPIOD, &GPIO_InitStructure);

//PORTDの初期値設定(LEDをすべて消灯)
GPIO_ResetBits(GPIOD,GPIO_Pin_12);
GPIO_ResetBits(GPIOD,GPIO_Pin_13);
GPIO_ResetBits(GPIOD,GPIO_Pin_14);
GPIO_ResetBits(GPIOD,GPIO_Pin_15);
//PORTDの設定終了----------------------------------------

//ここからプログラム本体################################
//ボタンを押している間LEDを点滅する無限ループ
while (1)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)){
//ボタンが押されて1になっていたら以下を実行
GPIO_SetBits(GPIOD,GPIO_Pin_13); //LED点灯
myDelay();
GPIO_ResetBits(GPIOD,GPIO_Pin_13); //LED消灯
myDelay();
}
}
}

詳しくは後ほど解説したいと思いますが、ポートAとポートDを初期設定するのはこんなもんだという見本です。時間遅延関数myDelay()は下記のようになっています。百万回ループをまわしています。

//時間遅延関数
void myDelay(){
uint32_t ii;
ii=0;
//1,000,000回ループを回る
while(ii<1000000){
ii++;
}
}

このプログラムはユーザーボタンを押している間、約260mS(オシロで計測)ごとに点灯・消灯を繰り返します。ビルドとダウンロードは次回投稿します。

« STM32F4 DISCOVERYのGPIOをテストする(新規プロジェクト編) | トップページ | STM32F4 DISCOVERYのシリアル通信(UART)をテストする(送信編) »

ロボット作ろう」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1140145/43257607

この記事へのトラックバック一覧です: STM32F4 DISCOVERYのGPIOをテストする(プログラム作成編):

« STM32F4 DISCOVERYのGPIOをテストする(新規プロジェクト編) | トップページ | STM32F4 DISCOVERYのシリアル通信(UART)をテストする(送信編) »