2017年01月06日

UART受信について

今回はSTM32でのUART受信処理について紹介します。


環境はこれまで同様、
・STM32F303K8
 +SW4STM32(System Workbench for STM32)
 +STM32CubeMX(F3_1.6.0)
です。


STM32F3系でなかなかUartの受信ができず、
DMAを使うしかないかなと諦めかけていましたが、
原因が分かったため、紹介します。
(This report is wrote about
  not called HAL_UART_RxCpltCallback probrem)


CubeMXのUart設定でNVIC Settingの
USART Global InterruptをEnableにするとUART受信で
HAL_UART_RxCpltCallback
という関数が呼び出されます。


uart.png

ただ、HALライブラリのバグで呼び出せないという不具合がありました。
不具合ではなく、最終的に関数の呼び出しが必要と判明しました。
対処方法#1で受信できるようになります。

対処方法#1は下記の通りです。
(The coping process #1 is following)

@HAL_UART_RxCpltCallbackを追加。
  (ADD HAL_UART_RxCpltCallback func.)

char UART1_Data;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
     if(UartHandle->Instance==USART1){
          HAL_UART_Receive_IT(&huart1, (uint8_t*) &UART1_Data, 1);      
    }
 }

Amain関数内の初期化後にUartの設定と割り込み有効化
 (Set Uart variable and enable interrupt after init.)

HAL_UART_Receive_IT(&huart1, (uint8_t*) &UART1_Data, 1);

while(1)
{
~~~



以上の設定を行うことで
1文字受信毎にHAL_UART_RxCpltCallbackが呼び出されました。

uart2.png



【参考 reference】
対処方法#2は下記の通りです。
(The coping process #2 is following)


@HAL_UART_RxCpltCallbackを追加。
  (ADD HAL_UART_RxCpltCallback func.)

char UART1_Data;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
     if(UartHandle->Instance==USART1){
          HAL_UART_Receive_IT(&huart1, (uint8_t*) &UART1_Data, 1);      
    }
 }

Amain関数内の初期化後にUartの設定と割り込み有効化
 (Set Uart variable and enable interrupt after init.)

 //Initially pointer is not set!
  huart1.pRxBuffPtr=(uint8_t *)&UART1_Data;  //IMPORTANT!!
 huart1.RxXferCount=1;  //IMPORTANT!!
  huart1.Mask=255;  //If not set, lost first string.
  __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);

while(1)
{
~~~


Bstm32f3xx_it.c内のUSART1_IRQHandler関数を修正
 (Fix USART1_IRQHandler func in stm32f3xx_it.c)

void USART1_IRQHandler(void)
{
  huart1.RxState=HAL_UART_STATE_BUSY_RX;  //IMPORTANT!!
  HAL_UART_IRQHandler(&huart1);
}
posted by Crescent at 00:00| Comment(0) | TrackBack(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック