Comment utiliser l'interruption ADC sur la pilule bleue STM32

Sep 29 2020

J'utilise actuellement les cartes STM32F1xx de http://dan.drown.org/stm32duino/package_STM32duino_index.jsonPour programmer ma pilule bleue mais je ne trouve pas comment écrire l'interruption pour l'ADC. J'ai défini les registres pour générer une interruption à la fin, mais je ne trouve pas comment écrire le code de l'interruption.

J'ai essayé la fonction "ISR (ADC_vect)" qui fonctionne pour Arduino, mais le compilateur se plaint que "ISR" n'est pas reconnu. J'ai essayé de rechercher la documentation pour le STM32duino, mais le peu que j'ai pu trouver ne mentionnait même pas l'ADC ou les routines d'interruption. J'ai cherché sur le forum STM32duino sans aucune chance. Si quelqu'un sait comment résoudre ceci ou où trouver des informations sur le code d'interruption pour les cartes STM32, je serais très heureux :)

Réponses

1 SoreDakeNoKoto Oct 03 2020 at 08:45

Comme vous l'avez déjà constaté, la fonction à remplacer est __irq_adc()définie faiblement ici et liée à la table des vecteurs d'interruption ici .

Si vous l'avez défini et que cela ne fonctionne pas, c'est probablement parce que vous vous êtes attachInterrupt()complètement débarrassé de l' appel, ce qui fait plus que simplement assigner un gestionnaire d'interruption; il active également l'interruption pour cet ADC. Donc:

myADC.calibrate();
myADC.setSampleRate(ADC_SMPR_1_5);
adc_enable_irq(ADC1, ADC_EOC);
myADC.setPins(&pin, 1);

extern "C" void __irq_adc() {
// handle the interrupt
// make sure to check statuses and clear flags as shown in the default handler
}

Je ne sais pas si le extern "C"sera nécessaire, le sera probablement, vous devrez vérifier et découvrir.

1 BeaconofWierd Sep 30 2020 at 16:59

Je n'ai pas pu trouver la fonction appelée directement, mais il existe un bon exemple expliquant comment attacher des interruptions à l'ADC qui fonctionne bien: https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/master/STM32F1/libraries/STM32ADC/examples/SingleConversionInterrupt/SingleConversionInterrupt.ino

Si quelqu'un connaît la fonction réelle appelée directement, ce serait formidable d'ajouter ici, mais d'ici là, cet exemple fait ce dont j'ai besoin et, espérons-le, aidera d'autres personnes ayant le même problème.

TirdadSadriNejad Sep 30 2020 at 04:09

vous devez d'abord activer l'interruption (je ne sais pas si le wrapper stm32 pour arduino le fait ou non):

NVIC_EnableIRQ(ADC1_IRQn);

alors vous devez écrire ISR comme l'a dit gerben:

extern "C" void ADC1_IRQHandler()
{
    //clear ADC flag
}

extern "C" parce que [pour autant que je sache] les projets arduino sont en C ++.