Im en utilisant le STM32F4xx et que vous voulez apprendre à programmer avec le ST-HAL. Dans le moment j'essaie d'envoyer/recevoir SPI sur les interruptions.STM32 HAL SPI Interrupt Handling
J'utilise les fonctions suivantes pour recevoir des données sur INT .:
fonction 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 */
}
fonction de démarrage:
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 (défini dans le fichier principal):
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
volatile uint8_t y = 5;
}
Avant ma question: Utilisation de la "normale" SPI_Transmit & les fonctions de réception, je transmets & recevoir correctement.
Mon problème est que je ne comprends pas comment je devrais utiliser ces fonctions. par exemple: Où dois-je appeler le début « fonction » quand vient la fonction de rappel, un dois-je effacer Interruptflags, et ainsi de suite ...
Au moment où je l'utilise « HAL_SPI_Transmit_IT » & « HAL_SPI_Receive_IT » dans le tandis que (1) boucle. Dans les fonctions de rappel Rx et Tx, j'ai des variables de compteur. Je vois que le tmpCounterRx compte, mais le dosnt tmpCounterTx ???
.: par exemple
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;
}
Rev. 1:
Merci pour la réponse, voici ma fonction SPI init:
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();
}
}
Afficher votre code SPI init s'il vous plaît. –
Je suggère l'approche du registre nu. –
Hm ... J'ai aimé la façon dont la gestion des interruptions fonctionne avec le StdLib. Mais je dois apprendre en utilisant HAL et je ne sais pas s'il est recommandé de mélanger HAL et approche de registre nu ...? – TangoOne