Le STM32F103C8 et l'horloge LSE

Bonjour à toutes et à tous,

Pour avoir une horloge précise avec le STM32F103C8, j'utilise le mode LSE.

Avant d'y arriver, j'ai utilisé le mode LSI et j'ai pu constater une dérive notoire avec l'horloge de mon PC par exemple.

Je suis passé en mode LSE et j'ai relancé mes tests : je n'ai pas noté d'amélioration.

J'ai lu quelque part que, pour activer ce mode, il fallait appuyer sur le bouton reset du STM32F103C8 après avoir téléchargé le programme.

Dés lors, j'ai pu constater que l'horloge du STM32F103C8 suivait l'horloge de mon PC à une ou deux secondes près sur une journée.

Je n'arrive pas à retrouver ce fait d'appuyer sur le bouton reset pour activer l'horloge LSE.

Alors :

  • j'ai rêvé,
  • c'est une coïncidence,
  • c'est la réalité ?

Cordialement.

Pierre.

Normalement il faut écrire dans les registres pour modifier l’arbre d’horloge, qui sur les STM32 est assez complexe.

Le programme actuellement chargé fait-il ces écritures ?

Mon programme ne touche à aucun registre, il exécute seulement cette instruction :

rtc.setClockSource(STM32RTC::LSE_CLOCK); // Par défaut le mode LSI est choisi. Il faut sélectionner le mode LSE qui est le plus précis.

En remontant la piste des librairies, je suis arrivé au fin fond des répertoires :

C:\Users\prcha\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.8.1\libraries\SrcWrapper\inc

y trouver un fichier "clock.h" puis au fond de :

C:\Users\prcha\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.8.1\libraries\SrcWrapper\src\stm32

pour y trouver un fichier "clock.c" dans lequel je trouve :

    case LSE_CLOCK:
      __HAL_RCC_LSE_CONFIG(RCC_LSE_ON);
      if (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) {
#ifdef __HAL_RCC_LSEDRIVE_CONFIG
#ifdef RCC_LSEDRIVE_LOW
        __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
#else
        __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_MEDIUMLOW);
#endif
#endif
        RCC_OscInitStruct.OscillatorType =  RCC_OSCILLATORTYPE_LSE;
        RCC_OscInitStruct.LSEState = RCC_LSE_ON;
      }
      break;

Je ne vais pas plus loin, je pense que ces instructions agissent sur les registres.

Pour en revenir à mon problème relatif au changement d'horloge, je suis repassé en mode LSI (sans appuyer sur le bouton "reset") où j'ai pu constater un énorme écart entre cette horloge et l'horloge de mon PC.

Je suis alors revenu au mode LSE (toujours sans appuyer sur le bouton "reset") et mon horloge STM32 est revenu sagement suivre l'horloge de mon PC.

Bon, j'ai dû rêver cette histoire d'appuyer sur le bouton "reset" pour valider le changement de mode d'horloge.

Cordialement .

Pierre.

L'écart que tu constate est du à la mauvaise qualité du quartz qui équipe la carte.
Si je me souvient il y a deux quartz sur cette carte :
un quartz 8 MHz pour la PLL
un quartz "horloger"

Tu utilises la version STM32duino, il faudrait poser ta question sur le forum :
https://www.stm32duino.com/

Bonjour ChPr

Voilà ce que ChaGPT répond à ton interrogation.

Ou question tournée différemment:
Avec un STM32F103C8, pourquoi faut il presser le bouton reset pour activer le mode LSE.

Cordialement
jpbbricole

Je l'ai posée. Mais ils ont été moins loquace que vous : 0 réponses.

Cordialement.

Pierre.

Dis-moi, ChatGPT, ce n'est pas une application normande :wink: ?

Bon, allez, un p'tit coup de "reset" n'a jamais fait de mal à personne.

Cordialement.

Pierre".

C'est sérieux ?
A chaque démarage il y a une RAZ (reset) automatique et obligatoire !!!!!!!!!!!!!!

J'ai lu le "machin" chat gpt.
Il est bien précisé qu'il faut reconfigurer les registres au préalable.

Et c'est tout ce qu'il y a de plus normal qu'une fois les registres modifiés il faille redémarer le micro sur sa nouvelle configuration.

Inutile de faire appel a de l'intelligence artificielle pour ça, la simple intelligence naturelle suffi.

Le problème de @ChPr c'est que les registres sont soit mal configurés, soit ils ne conservent pas les modifications.
Je me dois d'ajouter que lors de mes essais de cette plateforme, j'ai tué plusieurs cartes sans comprendre pourquoi.
Je n'ai jamais tué de carte avec micro Atmel ou Espressif.
Les STM32F103 me paraissent "chatouilleux".

Je ne comprends pas bien ce que tu veux dire.

La modification des registres ne peut être faite que suite à un téléversement. Dès lors, ils sont modifiés ... lors de la séquence de démarrage.

Ce que tu dis sous entendrait que ces modifications iraient se placer dans des cases mémoires qui ne seraient lues et appliquées qu'après un redémarrage ??

Cordialement.

Pierre.

Bonjour Pierre
J'ai interprété ChatGPT ainsi:
Une fois le programme de paramétrage téléchargé, le redémarrage provoqué par le téléchargement n'est pas suffisant pour activer les nouvelles options, un reset "bouton" est nécessaire, après plus, c'est d'ailleurs ce que tu as constaté.

Cordialement
jpbbricole

C'est ce que je pense.
Un principe qui ressemble aux "fuses" des avr, c'est-à-dire une mémoire eprom ou dans une zone particulière de la flash.

Comment expliquer que cela a fonctionné et que cela ne fonctionne plus ?

Avant de laisser tomber les pilules bleues j'avais été jusqu'à utiliser CubeMx pour voir comment s'établissent les différentes fréquence d'horloge à l'intérieur de la puce.

On dit que la puce tourne à 72 MHz, mon oeil !
La pll tourne à 72 MHz.
L'usb tourne avec une fréquence de 48 MHz, les périphériques (gpio, timer, pwm, etc) tournent à 36 MHz, je m'arrête là car la liste est plus longue.

C'est d'ailleurs pour cette raison que les temps d'exécution entre un digitalWrite_Fast et un digitalWrite STM32 ou ESP32 ne sont pas dans le rapport des horloges annoncées "commercialement"
Entre un atmega328p à 16 MHz et un STM32F103 à 72 MHz il n'y a en réalité qu'un rapport 2 sur le périphérique GPIO.

Tous ces réglages me paraissent permanents.

Ceci dit, je ne suis pas un spécialiste des microcontrôleurs et ce que je pense avoir compris avec ma petite intelligence naturelle peut être faux.