2017-08-02 487 views
1

使用STM32F4xx並想學習編程ST-HAL。 在我嘗試通過中斷髮送/接收SPI的那一刻。STM32 HAL SPI中斷處理

我用下面的函數在INT:

初始化功能,以接收數據:

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 &接收功能,我發送&接收正確。

我的問題是,我不明白我應該如何使用這個功能。 如:我應該在哪裏調用start「功能」,當談到的回調函數,一個我要明確Interruptflags,等等...

目前我在使用‘HAL_SPI_Transmit_IT’&‘HAL_SPI_Receive_IT’ while(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

顯示您的SPI初始化代碼,請。 –

+0

我會建議裸登記方法。 –

+0

嗯......我喜歡中斷處理與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我知道這應該是發表評論,但它是相當困難的放置較長的代碼條評論

+0

嘿!感謝您的回覆!我可以確認中斷觸發。但是,中斷觸發SPI通信的問題對寫入或讀取EEPROM沒有影響。該死的! – TangoOne

+0

現在你必須連接邏輯分析儀。別無退路。檢查是否有正確的時鐘極性和有效邊沿。前段時間我試圖用HAL(我只是好奇)。對於比USB或以太網簡單的任何東西都不值得。 –

+0

是的,我完全同意。基本上我知道ISR應儘可能短。但是如果我看到只有HAL_SPI_IRQHandler()有多少代碼,它似乎不是非常有效。我錯了嗎?無論如何,你認爲混合HAL和自己的裸機ISR處理是不是「好」? – TangoOne