2017-08-02 2 views
1

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(); 
    } 
} 
+0

Afficher votre code SPI init s'il vous plaît. –

+0

Je suggère l'approche du registre nu. –

+0

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

Répondre

1

essayer. Je suppose que les compteurs sont volatile. Au moins, vous saurez quelles alarmes sont déclenchées et s'il s'agit d'un problème de configuration de callback 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 Je sais que ce devrait être le commentaire, mais il est assez difficile de placer plus des morceaux du code dans les commentaires

+0

Hey! Merci pour votre réponse! Je peux confirmer que le déclenchement d'interruption. Mais le problème que cette interruption a déclenché la communication SPI n'a aucun effet sur l'écriture ou la lecture de ma mémoire EEPROM. Zut! – TangoOne

+0

maintenant vous devez connecter l'analyseur logique. Pas d'autre chemin. Vérifiez si vous avez la bonne polarité d'horloge et le bord actif. Il y a quelque temps, j'ai essayé d'utiliser HAL (j'étais juste curieux). Pour tout ce qui est moins complexe que l'USB ou l'Ethernet ne vaut tout simplement pas. –

+0

Oui, je suis entièrement d'accord. Fondamentalement, j'ai appris que l'ISR doit être aussi court que possible. Mais si je vois combien de code seulement le HAL_SPI_IRQHandler() a, cela ne semble pas très efficace. Ai-je tort? Quoi qu'il en soit, pensez-vous qu'il est "ok" de mélanger HAL et de manipuler les ISR en métal nu? – TangoOne