2024年6月
            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            

カテゴリー

ブログパーツ

無料ブログはココログ

« STM32F4 DISCOVERYのSysTick割り込みをテストする | トップページ | STM32F4 DISCOVERYでラジコンサーボを動かす »

2011年12月16日 (金)

STM32F4 DISCOVERYのシリアル通信を割り込みで実装する

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

割り込みの使い方がわかってきたところで、以前、ポーリングで実装したシリアル通信のエコーバックを、割り込みを使った実戦的な形で実装してみます。

割り込みを使うので、stm32f4xx_it.cにハンドラを追加します。これは雛形には用意されていません。

void USART2_IRQHandler(void)
{
uint16_t i;
//送信終了(今回は使っていない)
if(USART_GetITStatus(USART2, USART_IT_TXE) == SET)
{

}
//受信終了
if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET)
{
i=USART_ReceiveData(USART2); //受信したデータ読み込み
USART_SendData(USART2, i); //そのデータを送信
}
}

送信終了や1キャラクタ受信などの割り込み要因を設定しておくと、それらが発生したときにこのハンドラが実行されます。上の例では、送信終了と、受信終了(1キャラクタ受信)への対応が記述されています。ただし、送信終了のアクションは、このプログラムでは使用しないので空になっています。

さて、main.cのmain関数はこうです。

int main(void)
{
//GPIOAとUSART2にクロック供給
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

//グローバル割り込み初期化の構造体を作る
NVIC_InitTypeDef NVIC_InitStructure;

//USART2のグローバル割り込みを設定する
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

//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);

//受信割り込みを設定する
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

//USART2を有効化
USART_Cmd(USART2, ENABLE);

//無限ループ(ダイナミックストップ)
while (1)
{

}
}

割り込みの設定は2箇所でやっています。
まず最初のほう、「USART2のグローバル割り込みを設定する」でグローバル割り込みコントロールに、USART2の割り込みを許可するよう設定します。
次に、最後のほう「受信割り込みを設定する」のあと1行で、USART2の割り込み設定に受信割り込みを設定します。

たったコレだけで、割り込み設定ができました。ややこしいレジスタのビット操作なしなので助かります。一時的に割り込み禁止にしたいときは、USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);とやればよいようです。

次はタイマーを使ってラジコンサーボを動かしてみたいと思います。ようやくロボットのブログらしくなってきました。

« STM32F4 DISCOVERYのSysTick割り込みをテストする | トップページ | STM32F4 DISCOVERYでラジコンサーボを動かす »

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

コメント

コメントを書く

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

トラックバック


この記事へのトラックバック一覧です: STM32F4 DISCOVERYのシリアル通信を割り込みで実装する:

« STM32F4 DISCOVERYのSysTick割り込みをテストする | トップページ | STM32F4 DISCOVERYでラジコンサーボを動かす »