2016-12-21 2 views
0

Je travaille avec la carte STM32F4Discovery, génère le code à partir du Cube, SYSCLK est 168MHz, APB1 Minuterie 42 MHz, TIM6 a prescaler 1000, et compte jusqu'à 62. Je fais l'expérience suivante.STM32F4 Interruption TIM6 ne se produit pas pendant le fonctionnement DMA

Activer l'interruption de TIM6 par

__HAL_TIM_ENABLE_IT(&htim6, TIM_IT_UPDATE); 
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); 

Démarrer DAC_DMA en mode normal avec tableau de 30 éléments.

Compter le nombre d'interruptions de minuterie se produisent

void TIM6_DAC_IRQHandler(void) { 

HAL_TIM_IRQHandler(&htim6); 
tim6Counter++; 
} 

Définir point d'arrêt dans cette fonction:

void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef *hdac) { 
    conversionCounter++; 
} 

Ce que j'attends:

1) HAL_DAC_ConvCpltCallbackCh1 est appelé une fois (à cause du mode non circulaire) . C'est vrai.

2) quand elle est appelée tim6Counter doit être égal à 30, en tant que longueur de mémoire tampon de données DAC est 30. Dans l'expérience tim6Counter est 1.

3) Après DAC est terminée, régler des points d'arrêt de gestionnaire TIM6, et principal tandis que (1) boucle. Le problème est, qu'il se bloque dans le gestionnaire TIM6.

Questions:

1) DMA fonctionne même si les interruptions TIM6 ne sont pas activés. Mais si activé, pourquoi cela arrive-t-il une seule fois, au lieu de chaque demande DMA?

2) Pourquoi se bloque-t-il dans le gestionnaire de minuterie?

3) Le registre TIM6 SR n'est pas effacé, soit par les macros HAL, soit par HAL_TIM_IRQHandler. J'utilise eclipse avec openOCD. Est-ce un problème d'outils? Ou en raison de la pendaison dans le gestionnaire?

Répondre

1

Le problème est que la minuterie compte toujours pendant la pause de débogage. Après avoir basculé la minuterie en mode de débogage par

__HAL_DBGMCU_FREEZE_TIM6(); 

cela fonctionne correctement. La section 20.3.4 du manuel de référence a été manquée par moi en lisant.