2017-06-02 2 views
-1

Je veux transmettre des données d'onde sinusoïdale sur une broche (une possible), de sorte que mon programme serait capable de le lire lorsqu'il est exécuté dans un émulateur. Comment puis-je transmettre des données sous la forme de (temps: valeur) ou simplement passer une fonction float generatorForPinX(int time); pour agir comme générateur de signal dans GNU ARM Eclipse (j'utilise QEMU mais si un autre émulateur est requis, je suis prêt à migrer) émulateur de carte?GNU ARM Eclipse: comment simuler une entrée de broche?

+1

Quelle cible utilisez-vous? Cette branche QEMU pour STM32 inclut l'émulation ADC avec un modèle sinusoïdal: https://beckus.github.io/qemu_stm32/ – Tim

+0

@Tim: oui, STM32! Merci beaucoup! Veuillez poster une réponse étendue avec une courte explication de comment avoir un projet QEMU STM32 compilable et exécutable pour ajouter une telle émulation (c'est juste ajouter un fichier source dans le répertoire src du projet)? – DuckQueen

Répondre

2

Ces instructions concernent l'émulation d'un kit de développement Olimex STM32 P103.

Téléchargez et construire

d'abord télécharger et construire Qemu STM32, qui comprend des correctifs pour émulant le périphérique ADC sur le STM32:

wget https://github.com/beckus/qemu_stm32/archive/stm32.tar.gz 
tar xf stm32.tar.gz 
cd qemu_stm32-stm32 
./configure --target-list="arm-softmmu" 
make 
cd .. 

Si l'étape de configuration échoue, installez les exigences manquantes. Voir le fichier README pour plus d'informations.

télécharger ensuite le Olimex STM32 P103 Development Kit Demos:

wget https://github.com/beckus/stm32_p103_demos/archive/master.tar.gz 
tar xf master.tar.gz 

Rechercher dans stm32_p103_demos-master/demos/adc_single/main.c pour un exemple de programme qui utilise l'ADC.

Lancez l'application de démonstration

Pour construire et exécuter la démo adc_single:

cd stm32_p103_demos-master 
QEMU_ARM_DIR=../qemu_stm32-stm32/arm-softmmu/ make adc_single_QEMURUN_TEL 
(from another terminal) telnet localhost 7777 

UART2 est connecté au serveur telnet sur le port 7777, que vous devriez voir la sortie de. Consultez le fichier README pour plus d'informations sur la création et l'exécution des applications de démonstration.

regardant le source for the adc_single demo application, il dispose de 3 modes différents:

  • Mode 1 (valeur par défaut) seront lues à partir du capteur de température sur le canal ADC 16
  • mode 2 va lire la valeur Vdd du canal ADC 16
  • mode 3 sera lu à partir du canal ADC 8.

les modes peuvent être sélectionnés à l'aide d'un bouton, mais puisque nous émulant le matériel avec QEMU, le bouton est pas t disponible. J'ai basculé entre les modes en changeant la valeur int mode = 1; et en recompilant le programme.

émulation ADC

La méthode QEMU utilise pour émuler chaque canal ADC est visible dans la fonction stm32_adc_start_conv dans hw/arm/stm32_adc.c:

static void stm32_adc_start_conv(Stm32Adc *s) 
{ 
    uint64_t curr_time = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); 
    int channel_number=stm32_ADC_get_channel_number(s,1); 
    // Write result of conversion 
    if(channel_number==16){ 
     s->Vdda=rand()%(1200+1) + 2400; //Vdda belongs to the interval [2400 3600] mv 
     s->Vref=rand()%(s->Vdda-2400+1) + 2400; //Vref belongs to the interval [2400 Vdda] mv 
     s->ADC_DR= s->Vdda - s->Vref; 
    } 
    else if(channel_number==17){ 
     s->ADC_DR= (s->Vref=rand()%(s->Vdda-2400+1) + 2400); //Vref [2400 Vdda] mv 
    } 
    else{ 
     s->ADC_DR=((int)(1024.*(sin(2*M_PI*qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)/1e9)+1.))&0xfff); 
    } 
    s->ADC_SR&=~ADC_SR_EOC; // jmf : indicates ongoing conversion 
    // calls conv_complete when expires  
    timer_mod(s->conv_timer, curr_time + stm32_ADC_get_nbr_cycle_per_sample(s,channel_number)); 
} 

Comme vous pouvez le voir, le canal ADC 16 va émuler une entrée Vdd aléatoire , Le canal ADC 17 émulera une entrée de température aléatoire, et tous les autres canaux suivront une onde sinusoïdale de 0 à 2048.Voici un graphique des valeurs ADC retour de tous les 3 modes:

ADC value graph

Si vous voulez avoir un canal ADC utiliser un modèle d'émulation différente, vous pouvez modifier stm32_adc_start_conv et reconstruire QEMU suivant les étapes ci-dessus.