GPIOの使い方はそれほど難しくありません.
下記のGPIO_Pin_xは、GPIO_Pin_0~GPIO_Pin_15 あるいは GPIO_Pin_All のどれかです.
●GPIOAの入力データを16bit読む
uint16_t x;
x = GPIO_ReadInputData (GPIOA);
●GPIODのbit5の入力データを読む
uint8_t x;
x= GPIO_ReadInputDataBit (GPIOD, GPIO_Pin_5);
●GPIOHの出力データを16bit読む
uint16_t x;
x = GPIO_ReadOutputData (GPIOH);
●GPIOCのbit12の出力データを読む
uint8_t x;
x = GPIO_ReadOutputDataBit (GPIOC, GPIO_Pin_12);
●GPIOFのbit9を0にする
GPIO_ResetBits (GPIOF, GPIO_Pin_9);
●GPIOFのbit9を1にする
GPIO_SetBits (GPIOF, GPIO_Pin_9);
●GPIOGに16bitの0x1234を出力する
GPIO_Write (GPIOG, 0x1234);
●GPIOGのbit15に1を出力する
void GPIO_WriteBit (GPIOG, GPIO_Pin_15, Bit_SET);
●GPIOGのbit15に0を出力する
void GPIO_WriteBit (GPIOG, GPIO_Pin_15, Bit_RESET);
●GPIOBのbit15,bit1,bit0に1を出力する.その他のbitは据え置き.動作が高速.右辺は下16bitだけが有効.
GPIOB->BSRR = 0x00008003;
●GPIOBのbit15,bit1,bit0に0を出力する.その他のbitは据え置き.動作が高速.右辺は下16bitだけが有効.
GPIOB->BRR = 0x00008003;
ポートの属性を設定するのは下記のようにします.
●GPIOBのbit4とbit0を出力に設定する.かつGPIODのbit1とbit0を入力に設定する.
①GPIO_InitTypeDef GPIO_InitStructure;
②RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD, ENABLE);
③GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_0;
④GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
⑤GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
⑥GPIO_Init(GPIOB, &GPIO_InitStructure);
⑦GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_0;
⑧GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
⑨GPIO_Init(GPIOD, &GPIO_InitStructure);
①GPIOを設定するためだけに使う構造体を宣言します.
②APB2にぶら下がったGPIOのうちGPIOBとGPIODにclockを供給します.他のGPIOも使いたい場合はRCC_APB2Periph_GPIOxをORで連結します.
③出力にしたいpinをORで連結します.
④出力ドライブ能力を設定します.選択肢はつぎです.
GPIO_Speed_2MHz
GPIO_Speed_10MHz
GPIO_Speed_50MHz
⑤出力または入力の選択肢はこれだけあります.
GPIO_Mode_AIN アナログ入力
GPIO_Mode_IN_FLOATING floating入力(pull-upもpull-downもしない)
GPIO_Mode_IPD pull-down入力
GPIO_Mode_IPU pull-up入力
GPIO_Mode_Out_OD open-drain出力
GPIO_Mode_Out_PP push-pull出力 (フツーの出力)
GPIO_Mode_AF_OD Altanate Function open-drain出力 (peripheralのIOピンとしてアサイン)
GPIO_Mode_AF_PP Altanate Function push-pull (peripheralのIOピンとしてアサイン)
⑥GPIOBに、構造体情報を書く
⑦入力にしたいpinをORで連結します.
⑧入力に設定
⑨GPIODに構造体情報を書く
サンプルプログラム
ページ末尾からproject folderをDLできます.eclipseへの組み込み方法はこちらを参照してください.
以上を踏まえ、GPIOBのbit0をトグルするプログラムを書きます.
トグルする方法は3種類の手段を試します.動作速度が変わるかどうかを測定します.
main.c
#include "stm32f10x.h" CPUのハードウエアに根ざしたいろいろな設定をします
GPIO_InitTypeDef GPIO_InitStructure; GPIOを設定するためだけに使う構造体を宣言
↓特定bitを反転させるサブルーチン
void GPIO_ReverseBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==0) GPIO_SetBits(GPIOx, GPIO_Pin);
else GPIO_ResetBits(GPIOx, GPIO_Pin);
return;
}
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIOBにclockを供給
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; bit0を指定
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 出力動作速度を指定
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 出力に指定
GPIO_Init(GPIOB, &GPIO_InitStructure); GPIOBに構造体情報を書く
while (1)
{
↓この表記でトグルすると2MHzぐらいの周波数のパルスを得られます.動作が速いです.
// highest speed
//GPIOB->BSRR = 0x00000001;
//GPIOB->BRR = 0x00000001;
↓この表記でトグルすると400kHzぐらいの周波数のパルスを得られます.動作が遅いです.
// middle speed
//GPIO_SetBits (GPIOB, GPIO_Pin_0);
//GPIO_ResetBits (GPIOB, GPIO_Pin_0);
↓この表記でトグルすると100kHzぐらいの周波数のパルスを得られます.動作が遅いです.
// low speed
GPIO_ReverseBit (GPIOB, GPIO_Pin_0);
}
}
↓debug関数なのでとりあえず無視
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while (1) { }
}
#endif