[Programmation] Débutant en programmation STM32
Répondre à la discussion
Affichage des résultats 1 à 28 sur 28

Débutant en programmation STM32



  1. #1
    Fabguil

    Débutant en programmation STM32


    ------

    Bonjour,

    Je souhaiterais un peu d'aide pour m'aider à commencer un programme sur une carte Nucleo.

    En fait je voudrais envoyer plusieurs commande à une autre carte nucleo qui me répond par Uart. La première commande c'est SOH en ascii 0x1 et l'autre Nucléo doit me répondre ensuite DC1 (0x11) si elle a bien reçu. Si la nucleo émettrice au bout de 5 s ne reçoit rien doit afficher un message du genre Nucleo 2 non présente.

    Je suis perdu même après avoir cherché pendant plusieurs heures. En ayant un exemple pour la première commande je pourrais m'en sortir pour les suivantes.

    Code HTML:
    include "mbed.h"
    
    Serial pc(SERIAL_TX, SERIAL_RX);
    
    UARTSerial rga(PA_11, PA_12, 115200);// Créer le port série
    
    
    int main()
    Voici le début de mon programme l'autre nucleo sera connecté sur les port PA12 et PA13.

    Je vous remercie

    -----

  2. #2
    Unwanted Ads

    Re : Débutant en programmation STM32

    Tu utilise quelle carte Nucleo-32? 64? 144?

    As tu téléchargé les outils ST?
    -STM32 Cube
    -IDE STM32 workbench

  3. #3
    Unwanted Ads

    Re : Débutant en programmation STM32

    en faitr je viens de voir il suffit de telecharger le nouveau CUBE IDE et tout est integre a l'interieur. Il y a des exemples de code pour l'UART, un package qui permet de selectionner la fonction de chaque pin:

    https://my.st.com/content/my_st_com/...ion=1.3.0.html

  4. #4
    invite03481543

    Re : Débutant en programmation STM32

    Bonjour,

    Cube IDE, le plus récent, n'est pas exempt de bugs, parfois il crash et il est nécessaire de le fermer et de le ré-ouvrir.
    CubeMX est plus stable mais offre un peu moins de fonctionnalités.
    Dans les deux cas ça reste des outils d'assistance donc toujours bien se fier à la datasheet et au release notes du µC qui restent les sources les plus fiables.

  5. A voir en vidéo sur Futura
  6. #5
    Fabguil

    Re : Débutant en programmation STM32

    Bonjour,

    La Nucleo est une 64, la F411RE.

    Par contre je travaille plus sur Mbed. Je ne connais pas du tout cubeMx.

  7. #6
    invite03481543

    Re : Débutant en programmation STM32

    Citation Envoyé par Fabguil Voir le message
    La première commande c'est SOH en ascii 0x1 et l'autre Nucléo doit me répondre ensuite DC1 (0x11) si elle a bien reçu.
    A mon avis c'est plutôt 0x01...
    Pour pouvoir t'aider il faudrait que tu en dises un peu plus sur ton application.
    Pourquoi avoir choisi Mbed qui est destiné à de l'IoT?
    Je ne suis pas convaincu que ce soit le meilleur des choix.
    Dans quel cadre fais-tu ce développement? Perso ou pro?

  8. #7
    Fabguil

    Re : Débutant en programmation STM32

    Je fais cela dans le cadre d'in projet BTS systèmes numérique suite à la reprise de mes études, et avec le confinement c'est d'autant plus compliqué.

    Nous avons pas choisi Mbed c'est imposé par les enseignants.

    Le projet :Le projet est destiné a détecter les fuites de produits à l'intérieur d'un équipement. Pour cela, on utilisait jusque là un chariot portant deux bouteilles d'hélium et système de détente pour*:
    Asperger du gaz hélium pur autour de la machine et détecter sa pénétration dans l'enceinte de la machine. celui qui mesure les fuites est un RGA( analyseur de gaz résiduels). On veut réviser le matériel existant. Pour cela on ajoute des fonctions :
    - IHM clavier/écran graphique/signalisation (contrôle local du flux d’hélium et alerte basse pression).

    L'iHM clavier sera un pc avec un émulateur comme putty pour afficher les messages textes le pc sera connecté par USB.
    Le RGA sera simulé par une deuxième nucleo branché sur l'uart6 de ma nucleo.

    Je dois donc programmer les échanges entre les deux nucleo et l'ihm textuel.

    Le premier échange consiste à demander au RGA s'il est bien connecté. Donc la première nucleo lui envoi SOH et si la seconde nucleo est présente elle répond DC1 et la première nucleo affiche un message texte qu'elle est bien connectée sinon un message texte qu'elle ne l'est pas.


    En espérant que ce soit un peu plus claire.

  9. #8
    umfred

    Re : Débutant en programmation STM32

    En cherchant la carte sur le site de mbed, on peut y trouver un exemple de code de lecture de l'hyperterminal (donc de lire sur le port série) https://os.mbed.com/teams/ST/code/Nu...hyperterminal/

  10. #9
    Fabguil

    Re : Débutant en programmation STM32

    Merci mais on souhaite pas lire l'hyperterminal. On souhaite envoyer une commande avec attente réponse et en fonction de celle ci afficher message sur l'hyperterminal.

    Pour envoyer une commande je peux utiliser putc ?

  11. #10
    umfred

    Re : Débutant en programmation STM32

    Citation Envoyé par Fabguil Voir le message
    Merci mais on souhaite pas lire l'hyperterminal. On souhaite envoyer une commande avec attente réponse et en fonction de celle ci afficher message sur l'hyperterminal.

    Pour envoyer une commande je peux utiliser putc ?
    l'hyperterminal (ou putty) commnunique via le port série donc ça peut servir pour faire des essais, et le code donne donc un exemple de communication sur le port série, c'est pour ça que j'ai mis le lien)
    et donc putc doit pouvoir être utilisé pour envoyer un caractère.

  12. #11
    Fabguil

    Re : Débutant en programmation STM32

    J'ai tenté ce programme mais lors de la compil une petite erreur, après je n'ai pas de carte nucleo chez moi donc difficile de tester.

    Code HTML:
    #include "mbed.h"
    
    Serial pc(USBTX, USBRX);
    Serial rga(PA_11, PA_12);
    
    int main(){
    
    while(1){
        rga.putc(0x01);
    
        if(rga.readable())
    
        pc.putc(rga.getc());
        pc.printf("RGA CONNECTE"); //
        
        if(rga.readable())
        
        rga.getc(0x11);
        pc.printf("RGA NON CONNECTE"); //
    }
    }
    }.

  13. #12
    invite03481543

    Re : Débutant en programmation STM32

    Citation Envoyé par Fabguil Voir le message
    J'ai tenté ce programme mais lors de la compil une petite erreur, après je n'ai pas de carte nucleo chez moi donc difficile de tester.

    Code HTML:
    #include "mbed.h"
    
    Serial pc(USBTX, USBRX);
    Serial rga(PA_11, PA_12);
    
    int main(){
    
    while(1){
        rga.putc(0x01);
    
        if(rga.readable())  // c'est quoi cette façon de gérer un if?
    
        pc.putc(rga.getc());
        pc.printf("RGA CONNECTE"); //
        
        if(rga.readable())  // idem
        
        rga.getc(0x11);
        pc.printf("RGA NON CONNECTE"); //
    }
    }
    }.    // c'est quoi ce point(!!) et il y a une accolade encore en trop....

    ****************************** **

  14. #13
    invite03481543

    Re : Débutant en programmation STM32

    Si tu veux de l'aide alors pense à mettre le message d'erreur que te retourne le compilo...

  15. #14
    Fabguil

    Re : Débutant en programmation STM32

    Je cherche, j'essaye mais avec très peu de bases et seul c'est pas simple.

  16. #15
    umfred

    Re : Débutant en programmation STM32

    Citation Envoyé par Fabguil Voir le message
    J'ai tenté ce programme mais lors de la compil une petite erreur, après je n'ai pas de carte nucleo chez moi donc difficile de tester.
    à mon avis, erreur d'accolade, vu le code. (utilise plutot les balises [ CODE] (bouton #)que html dans ton cas
    Code:
    #include "mbed.h"
    
    Serial pc(USBTX, USBRX);
    Serial rga(PA_11, PA_12);
    
    int main(){
    char rx;
    
        while(1)
        {
            rga.putc(0x01);
    
            if(rga.readable())
             {
                  rx=pc.putc(rga.getc()); // on stocke la valeur lue dans la variable rx
                  if(rx =0x01) // on regarde si rx vaut 0x01
                  {
                        rga.putc(0x11); // si on reçoit 0x01, on envoie alors 0x11
                   }
             }
        }
    }

  17. #16
    Fabguil

    Thumbs up Re : Débutant en programmation STM32

    Merci beaucoup...

    Par contre j'ai rajouté un "=" au niveau de if(rx==0x11) // on regarde si rx vaut 0x01 car j'avais une petite erreur sur le compileur. Par contre on doit pas regarder si rx=0x01.

    C'est on envoi rx=0x01 si l'autre nucleo est connecté elle nous renvoie 0x11 et là on affiche un message comme quoi elle est connecté et si on recoit rien on affiche un message qu'elle est pas connectée.

    Mais merci déjà j'ai une base pour afficher les messages ensuite.

  18. #17
    umfred

    Re : Débutant en programmation STM32

    arf, je me suis mélangé les pinceaux hier, désolé

  19. #18
    Fabguil

    Re : Débutant en programmation STM32

    Pas de soucis au contraire...

    Voilà ce que j'ai fait j'ai pas d'erreurs mais je sais pas ce que ca va donner, j'espère que c'est bon :

    Code HTML:
    #include "mbed.h"
    
    Serial pc(USBTX, USBRX);
    Serial rga(PA_11, PA_12);
    
    int main(){
    char rx;
    
        while(1)
        {
            rga.putc(0x01);
    
            if(rga.readable())
                {
                    rx=pc.putc(rga.getc()); // on stocke la valeur lue dans la variable rx
                    
                    if(rx ==0x11) pc.printf ("RGA CONNECTE");  //on regarde si rx vaut 0x11 alors on affiche message RGA CONNECTE
                  
                    else pc.printf ("RGA NON CONNECTE"); // si on reçoit pas 0x11, alors on affiche message RGA NON CONNECTE
                }
        }
    }

  20. #19
    umfred

    Re : Débutant en programmation STM32

    Code:
     rx=rga.getc(); // on stocke la valeur lue dans la variable rx
    c'est mieux comme code ça (j'avais pas lu/vu ça l'autre soir)

    Code:
    pc.putc(rga.getc());
    ça veut dire que l'on renvoie via pc la valeur lue sur rga
    (on pourra l'écrire pc.putc(rx); si on veut)

  21. #20
    Fabguil

    Re : Débutant en programmation STM32

    Merci beaucoup... sauf que même si la méthode est bon mon prof veut que j'utilise la commande switch. Donc je repart de zero.

  22. #21
    umfred

    Re : Débutant en programmation STM32

    il veut sans doute un fonctionnement en machine d'état (style grafcet)

  23. #22
    Fabguil

    Re : Débutant en programmation STM32

    Je connais pas le grafcet...

    Est-ce que cela ça y ressemble ?
    Code HTML:
    #include "mbed.h"
    
    Serial pc(USBTX, USBRX);
    Serial rga(PA_11, PA_12);
    
    int main()
    {
    
    if(rga.readable())
    {
        char rx;
        rga.putc(0x01);
        rx = rga.getc();
        
        switch(rx)
        {
            case 0x11 : pc.printf ("RGA CONNECTE");  //on regarde si rx vaut 0x11 alors on affiche message RGA CONNECTE
                break;   
            default :
                pc.printf ("RGA NON CONNECTE"); // si on reçoit pas 0x11, alors on affiche message RGA NON CONNECTE
            break;
        }
        rga.putc(0x02);
        rx = rga.getc();
        
        switch(rx)
        {
            case 0x11 : pc.printf ("RGA CONNECTE");  //on regarde si rx vaut 0x11 alors on affiche message RGA CONNECTE
                break;   
            default :
                pc.printf ("RGA NON CONNECTE"); // si on reçoit pas 0x11, alors on affiche message RGA NON CONNECTE
            break;
        }
        
    }
    }
    Après le plus compliqué va être de rajouter des switch à chaque envoi ou réception du rga

  24. #23
    umfred

    Re : Débutant en programmation STM32

    non pas vraiment, le principe (pour faire simple) c'est de décomposer le fonctionnement en étapes (actions) et entre chaque étape, il y a des transitions/conditions qui font passé ou pas à l'étape suivante (ou une autre). et on boucle sur l'état en cours et la transition à tester pour voir si on fait évoluer le fonctionnement.
    Mais ce n'est peut-être pas ce qui est attendu en fait.

    Pour revenir sur ton code, je pense que le test x.readable doit être fait à chaque attente de lecture et ne pas englober le tout.
    Et là il n'y a plus de boucle...
    Dans ton code, tu envoies 0x02 que la réponse soit 0x11 ou pas, c'est bien ce qui doit être fait ?

  25. #24
    Fabguil

    Re : Débutant en programmation STM32

    Non j’envoie 0x02 et si le RGA est connecté il me répond 0x11... et on affiche message. Si il est pas connecté il me répond rien et on affiche message qu’il est pas connecté.

    Après j’aurais d’autres états a envoyé et le RGA devra me répondre aussi et en fonction on affichera d’autres messages

  26. #25
    umfred

    Re : Débutant en programmation STM32

    Citation Envoyé par Fabguil Voir le message
    Non j’envoie 0x02 et si le RGA est connecté il me répond 0x11... et on affiche message. Si il est pas connecté il me répond rien et on affiche message qu’il est pas connecté.

    Après j’aurais d’autres états a envoyé et le RGA devra me répondre aussi et en fonction on affichera d’autres messages
    mais si on lui a envoyé 0x02 c'est parce qu'il était connecté aussi (vu qu'il a aussi répondu 0x11 au 0x01, non ? )

  27. #26
    Fabguil

    Re : Débutant en programmation STM32

    Ah oui je viens de voir que j'ai mal copié le code ue j'ai fait en fait ce qui y avait en bas après c'était pour le deuxième état mais c'était pas finalisé... désolé.

    Le code du premier état
    Code HTML:
    #include "mbed.h"
    
    Serial pc(USBTX, USBRX);
    Serial rga(PA_11, PA_12);
    
    int main()
    {
    
    if(rga.readable())
    {
        char rx;
        rga.putc(0x01);
        rx = rga.getc();
        
        switch(rx)
        {
            case 0x11 : pc.printf ("RGA CONNECTE");  //on regarde si rx vaut 0x11 alors on affiche message RGA CONNECTE
                break;   
            default :
                pc.printf ("RGA NON CONNECTE"); // si on reçoit pas 0x11, alors on affiche message RGA NON CONNECTE
            break;
        }

  28. #27
    Fabguil

    Re : Débutant en programmation STM32

    oui me suis trompé la suite du code n'était pas finalisé avec les mauvais code ascii

  29. #28
    umfred

    Re : Débutant en programmation STM32

    je pense qu'il faut partir sur un truc comme ça (qui est finalement une sorte de machine d'état)
    Code:
    #include "mbed.h"
    
    Serial pc(USBTX, USBRX);
    Serial rga(PA_11, PA_12);
    
    Timeout SerialTimeout;
    bool isTimeout;
    
    // fonction appelé au timeout
    void timeout()
    {
    	isTimeout=true;
    }
    //fonction pour lancere le timer de timeout
    void LancerTimeout(double val_timeout)
    {
    	isTimeout=false;
    	SerialTimeout.attach(&timeout,val_timeout);
    }
    //fonction pour stopper le timeout
    void StopTimeOut()
    {
    	SerialTimeout.detach();
    }
    
    int main()
    {
    	char rx;
    	int Etape;
    	int NextEtape;
    	Etape=0; // Etape intiale
    	NextEtape=0;
    	while(1)
    	{	
    		switch(Etape)
    		{
    			case 0:
    				//envoi 0x01
    				rga.putc(0x01);
    				LancerTimeout(2.0); // timeout de 2s: au bout de 2s, on appelle la fonction timeout qui signale un dépassement de temps 
    				NextEtape=1;
    				break;
    			case 1:
    				// attente
    				if(rga.readable()) // si j'ai quelque chose à lire
    				{
    					StopTimeOut();	// on arrete le timeout
    					NextEtape=2;	// on passe à l'étape suivante, la lecture (on aurait peut etre pu le faire ici)
    				}
    				else if(isTimeout)
    				{
    					NextEtape=20;	// si on a rien reçu au bout du timeout, on va à l'étape indiquant la non connexion
    				}
    				break;
    			case 2:
    				// on a reçu une réponse
    				if(rga.getc() == 0x11)
    				{
    					pc.printf("RGA CONNECTE"); // si la réponse est celle attendue, on le signale
    					rga.putc(0x02);		// on envoie la commande suivante
    					LancerTimeout(2.0); // on relance le timer de timeout
    					NextEtape=3;
    				}
    				else
    				{
    					NextEtape=20; // réponse mauvaise, on va ici à l'étape "non connecté"
    				}
    				break;
    			case 3:
    				//attente suite à étape 2
    				if(rga.readable()) // si j'ai quelque chose à lire
    				{
    					StopTimeOut();	// on arrete le timeout
    					NextEtape=4;	// on passe à l'étape suivante, la lecture (on aurait peut etre pu le faire ici)
    				}
    				else if(isTimeout)
    				{
    					NextEtape=20;	// si on a rien reçu au bout du timeout, on va à l'étape indiquant la non connexion
    				}
    				break;
    			case 4:
    				//action suivante
    				break;
    			//...
    			case 20:
    				// si pas de réponse
    				pc.printf("RGA NON CONNECTE");
    				NextEtape=21;
    				break;
    			case 21:
    				// que fait-on si rga non connecté ? 
    				//...
    			///...
    		}
    		Etape=NextEtape;
    	}
    
    }

Discussions similaires

  1. [Programmation] Programmation STM32
    Par Fabguil dans le forum Électronique
    Réponses: 1
    Dernier message: 02/04/2020, 10h44
  2. [Programmation] programmation du stm32 avec Keil et cubemx
    Par Leond95 dans le forum Électronique
    Réponses: 0
    Dernier message: 13/06/2019, 18h23
  3. Débutant en programmation
    Par Ulricksday dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 25/02/2018, 20h35
  4. Débutant en programmation
    Par Grey76 dans le forum Programmation et langages, Algorithmique
    Réponses: 27
    Dernier message: 29/08/2016, 09h06
  5. programmation avec stm32
    Par siwar14 dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 22/09/2014, 18h53
Découvrez nos comparatifs produits sur l'informatique et les technologies.