使用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();
}
}
顯示您的SPI初始化代碼,請。 –
我會建議裸登記方法。 –
嗯......我喜歡中斷處理與StdLib協同工作的方式。但我必須學習使用HAL,我不知道它是否推薦混合HAL和裸註冊方法......? – TangoOne