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でラジコンサーボを動かす »
「ロボット作ろう」カテゴリの記事
- 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のSysTick割り込みをテストする | トップページ | STM32F4 DISCOVERYでラジコンサーボを動かす »
コメント