2017-08-02 60 views
1

Im STM32F4xxを使用していて、ST-HALを使用してプログラムを学習する必要があります。 私はSPIを割り込みで送受信しようとしています。STM32 HAL SPI割り込み処理

私はINT:

Init関数を介してデータを受信するために、以下の機能を使用:

void HAL_MspInit(void) 
{ 
    /* USER CODE BEGIN MspInit 0 */ 

    /* USER CODE END MspInit 0 */ 

    HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0); 

    /* System interrupt init*/ 
    /* MemoryManagement_IRQn interrupt configuration */ 
    HAL_NVIC_SetPriority(MemoryManagement_IRQn, 0, 0); 
    /* BusFault_IRQn interrupt configuration */ 
    HAL_NVIC_SetPriority(BusFault_IRQn, 0, 0); 
    /* UsageFault_IRQn interrupt configuration */ 
    HAL_NVIC_SetPriority(UsageFault_IRQn, 0, 0); 
    /* SVCall_IRQn interrupt configuration */ 
    HAL_NVIC_SetPriority(SVCall_IRQn, 0, 0); 
    /* DebugMonitor_IRQn interrupt configuration */ 
    HAL_NVIC_SetPriority(DebugMonitor_IRQn, 0, 0); 
    /* PendSV_IRQn interrupt configuration */ 
    HAL_NVIC_SetPriority(PendSV_IRQn, 0, 0); 
    /* SysTick_IRQn interrupt configuration */ 
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); 

    /* USER CODE BEGIN MspInit 1 */ 
    /* Peripheral interrupt init */ 

    HAL_NVIC_SetPriority(SPI1_IRQn, 1, 1); //<-------------------- 
    HAL_NVIC_EnableIRQ(SPI1_IRQn);   //<-------------------- 

    /* USER CODE END MspInit 1 */ 
} 

スタート機能:

void main(void) 
{ 
    HAL_SPI_Receive_IT(&hspi1, buff, size);//Start the receiving process? 

    while(1) 
    { 
    . . . 
    } 
} 

Interrputhandler:

void SPI1_IRQHandler(void) 
{ 
    /* USER CODE BEGIN SPI1_IRQn 0 */ 

    /* USER CODE END SPI1_IRQn 0 */ 
    HAL_SPI_IRQHandler(&hspi1); 
    /* USER CODE BEGIN SPI1_IRQn 1 */ 

     /* USER CODE END SPI1_IRQn 1 */ 
} 

Callb (メインファイルで定義されている)ackfunction:私の質問の前に

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) 
{ 
    volatile uint8_t y = 5; 
} 

:SPI_Transmit &は受信機能を "ノーマル" を使用して、私は&が正しく受信送信します。

私の問題は、この機能をどのように使うべきか理解できていないことです。 例:現時点ではそうでコールバック関数、IはInterruptflagsをクリアする必要がありますか、と...

を来るとき、私はスタート「機能」と呼ぶべきではどこに 『HAL_SPI_Transmit_IT』 & 『HAL_SPI_Receive_IT』を使用一方、(1)ループ。 RxとTxのコールバック関数には、カウンタ変数があります。私はtmpCounterRxがカウントアップすることを知っているが、tmpCounterTx dosnt ???

例えば:

while (1) 
{ 
    HAL_SPI_Transmit_IT(&hspi1, buff, size); 
    HAL_Delay(500); 
    HAL_SPI_Receive_IT(&hspi1, buff, size); 
} 
} 

void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) 
{ 
    tmpCounterTx++; 
    volatile uint8_t x = 5; 
} 

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) 
{ 
    tmpCounterRx++; 
    volatile uint8_t y = 5; 
} 

牧師1:返信用

おかげで、ここに私のSPIの初期化機能:

void MX_SPI1_Init(void) 
{ 
    hspi1.Instance = SPI1; 
    hspi1.Init.Mode = SPI_MODE_MASTER; 
    hspi1.Init.Direction = SPI_DIRECTION_2LINES; 
    hspi1.Init.DataSize = SPI_DATASIZE_8BIT; 
    hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; 
    hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; 
    hspi1.Init.NSS = SPI_NSS_SOFT; 
    hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; 
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; 
    hspi1.Init.TIMode = SPI_TIMODE_DISABLE; 
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; 
    hspi1.Init.CRCPolynomial = 10; 

    if (HAL_SPI_Init(&hspi1) != HAL_OK) 
    { 
     Error_Handler(); 
    } 
} 
+0

に長いコードの断片を配置することは非常に困難です。 –

+0

私は裸の登録アプローチを提案します。 –

+0

Hm ... StdLibで割り込み処理が動作する方法が好きでした。しかし、私はHALを使用して学ぶ必要があり、私はそれがHALと裸の登録アプローチを混ぜることを推奨するかどうかを知りません...? – TangoOne

答えて

1

はこれを試してみてください。カウンターはvolatileと仮定します。少なくとも、どの割り込みがトリガされているのか、HALコールバックの設定に問題があるのか​​がわかります。

volatile uint32_t tmpCounterRx1 = 0, tmpCounterTx1 = 0; 

void SPI1_IRQHandler(void) 
{ 
    if((SPI1 -> SR & SPI_SR_RXNE)) 
    { 
    tmpCounterRx1++; 
    } else // intentional else do not remove 
    if((SPI1 -> SR & SPI_SR_TXE)) 
    { 
    tmpCounterTx1++; 
    } 
    /* USER CODE BEGIN SPI1_IRQn 0 */ 

    /* USER CODE END SPI1_IRQn 0 */ 
    HAL_SPI_IRQHandler(&hspi1); 
    /* USER CODE BEGIN SPI1_IRQn 1 */ 

     /* USER CODE END SPI1_IRQn 1 */ 
} 

PS私はそれがコメントする必要があります知っているが、あなたのSPIのinitコードが表示してくださいコメント

+0

ねえ!お返事をありがとうございます!私は割り込みトリガーを確認することができます。しかし、SPI通信が中断されるという問題は、私のEEPROMの書き込みや読み出しには影響しません。くそー! – TangoOne

+0

今すぐロジックアナライザを接続する必要があります。他に方法はありません。クロックの極性とアクティブエッジが正しいかどうかを確認してください。いくつかの時間前に私はHAL(私はちょうど興味があった)を使用しようとしました。 USBやイーサネットよりも複雑でないものは価値がありません。 –

+0

はい私は合計が同意します。基本的に私はISRができるだけ短くなることを学びました。しかし、HAL_SPI_IRQHandler()だけのコードの数がわかると、あまり効率的ではないようです。私が間違っている?とにかく、あなたはHALと自分のベアメタルISRのハンドリングを混ぜることはないと思いますか? – TangoOne

関連する問題