STM32F4 DISCOVERYのシリアル通信(UART)をテストする(エコーバック編)
ロボット作ろう:シェーキー製作記
送信がうまくいったので、次は受信したキャラクタをそのまま送信するエコーバックをプログラムしてみます。
写真のように装置をセットアップしました。隣の基板がRS232Cへのレベルコンバータです。このICを使い、単三電池4本を内蔵し、電源電圧を3.3Vと約5V(電池の電圧)に切り替えて使えるようになっています。もう5,6年も前に製作したものですが、電源供給もできるので重宝しています。でも、今ならこれの方がいいですよね。
これを経由して
(USART2のTXD)PA2 → パソコンのCOMポートのRXD
(USART2のRXD)PA3 → パソコンのCOMポートのTXD
と、なるように接続します。
プログラムはこうなりました。
例によって、ブログに貼り付けるとインデントが崩れてしまうので読みにくいですが。
int main(void)
{
uint16_t i;
//GPIOAとUSART2にクロック供給
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
//GPIO初期化用構造体を作る
GPIO_InitTypeDef GPIO_InitStructure;
//GPIOAのPIN2をオルタネイテブファンクションで出力に設定
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//GPIOAのPIN3をオルタネイテブファンクションに設定
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//GPIOAのPIN2とPIN3をオルタネィテブファンクションのUSART2に割り当て
GPIO_PinAFConfig(GPIOA , GPIO_PinSource2 , GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA , GPIO_PinSource3 , GPIO_AF_USART2);
//USART初期化用構造体を作る
USART_InitTypeDef USART_InitStructure;
//USART2を9600bps,8bit,ストップビット1,パリティなし,フロー制御なし,送受信有効に設定
USART_InitStructure.USART_BaudRate = 9600*3;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, &USART_InitStructure);
//USART2を有効化
USART_Cmd(USART2, ENABLE);
//無限ループを回りながら、受信フラグをチェック。受信したらエコーバック
while (1)
{
if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE)==SET){
//データ受信あり
USART_ClearFlag(USART2, USART_FLAG_RXNE); //フラグをリセット
i=USART_ReceiveData(USART2); //受信したデータ読み込み
USART_SendData(USART2, i); //そのデータを送信
}
}
}
TeraTermを9600bpsに設定しキーを叩くと叩いた文字がエコーバックされます。
このプログラムは割り込みを使わずにポーリングで処理しています。本来は割り込みで処理したいところですね。
というわけで、次はSTM32F4の割り込みをテストしてみようとおもいます。
« STM32F4 DISCOVERYのGPIOをテストする(実行・デバッグ編) | トップページ | STM32F4 DISCOVERYのSysTick割り込みをテストする »
「ロボット作ろう」カテゴリの記事
- Raspberry Pi3でturtlebotを動かしたいのだけど(2016.06.11)
- STM32F4のAD変換トラブル(その2)(2013.03.29)
- TrueSTUDIOからEclipseへ乗り換える(拾遺)(2012.07.14)
- TrueSTUDIOからEclipseへ乗り換える(その3)(2012.07.13)
- TrueSTUDIOからEclipseへ乗り換える(その2)(2012.07.07)
« STM32F4 DISCOVERYのGPIOをテストする(実行・デバッグ編) | トップページ | STM32F4 DISCOVERYのSysTick割り込みをテストする »
コメント