Analyse des problèmes d'échec de lecture et d'écriture FLASH à l'intérieur du micro-ordinateur monopuce

Suivez le compte officiel + star , ne manquez pas de contenu passionnant

06a78ff009bcf7c8b2734acfb876ed35.gif

Transfert depuis | STM32

FLASH, faisant référence à Flash Memory, est une mémoire non volatile (mémoire flash), qui peut enregistrer des données normalement lorsque l'alimentation est coupée.

Désormais, le Flash interne de la plupart des micro-ordinateurs monopuce peut être lu, écrit et programmé, mais parfois l'opération échoue pour diverses raisons. Aujourd'hui, je vais partager avec vous les problèmes courants combinés avec STM32.

La mémoire du STM32 comprend généralement une SRAM interne, un FLASH interne et certaines séries incluent également une EEPROM. Parmi eux, FLASH est généralement utilisé pour stocker du code ou des données, accessibles en lecture et en écriture.

Contenu de base du FLASH STM32

La structure organisationnelle FLASH du STM32 peut être légèrement différente en raison des différentes séries et modèles. Par exemple, la taille de page familière de petite et moyenne capacité du STM32F1 n'est que de 1 Ko, tandis que la page F1 de grande capacité a 2 Ko.

Par exemple, certaines séries utilisent le secteur comme plus petite unité, certains secteurs ont un minimum de 16 Ko et d'autres vont de 128 Ko.

Cet article décrit principalement le contenu pertinent sur FLASH en conjonction avec la série F4.

1. Structure Flash

Habituellement Flash se compose de plusieurs blocs, voici un exemple de F40x :

  • Mémoire principale : utilisée pour stocker le code utilisateur ou les données.

  • Mémoire système : utilisée pour stocker le programme d'usine, généralement le code du programme de démarrage.

  • Zone OTP : une petite zone programmable une seule fois permettant aux utilisateurs de stocker des données spécifiques.

  • Octet d'option : stocke les informations de configuration liées aux ressources ou aux attributs de la puce.

df74d2a43b9b2da01d34956ce038173b.jpeg

2. Opération de routine Flash 

Lecture Flash, écriture (programme), effacement :

  • Lecture de données d'une largeur de 128 bits

  • Écriture de données en octets, demi-mots, mots et mots doubles

  • Effacement de secteur et effacement complet

(Indice : il peut y avoir des différences selon les séries, telles que la lecture d'octets, l'effacement de page, etc.)

Protection Flash en lecture et écriture : réalisée en configurant les octets d'option.

3. Capacité du flash 

La capacité Flash du STM32 a été déterminée en usine, et la capacité peut être connue selon le modèle.

f6b41feb15210871261121cb3da3afd4.jpeg

4. Formatage côté mémoire

Actuellement, la structure d'organisation de la mémoire STM32 utilise par défaut le format petit-boutiste : l'octet de poids faible des données est stocké à l'adresse basse de la mémoire.

Pour plus d'informations, veuillez vous référer au manuel de référence correspondant de la puce.

 Octet d'option FLASH

Le Flash interne du STM32 a la fonction de protection en lecture et en écriture. Si vous souhaitez lire et écrire le Flash, vous devez d'abord supprimer la protection en lecture et en écriture. La protection en lecture et en écriture est complétée par la configuration de l'octet d'option.

Il existe deux manières courantes de configurer les octets d'options : 1. Codage logiciel, 2. Outils de programmation, 1. Codage logiciel, 2. Outils de programmation, 1. Codage logiciel, 2. Outils de programmation, 1. Codage logiciel, 2. Outils de programmation, 1. Codage logiciel, 2. Outils de programmation.

1. Codage du logiciel

Par exemple, la bibliothèque de bibliothèques de périphériques standard de la série STM32F4 fournit les fonctions :

void         FLASH_OB_Unlock(void);
void         FLASH_OB_Lock(void);
void         FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState);
void         FLASH_OB_WRP1Config(uint32_t OB_WRP, FunctionalState NewState);
void         FLASH_OB_PCROPSelectionConfig(uint8_t OB_PcROP);
void         FLASH_OB_PCROPConfig(uint32_t OB_PCROP, FunctionalState NewState);
void         FLASH_OB_PCROP1Config(uint32_t OB_PCROP, FunctionalState NewState);
void         FLASH_OB_RDPConfig(uint8_t OB_RDP);
void         FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY);
void         FLASH_OB_BORConfig(uint8_t OB_BOR);
void         FLASH_OB_BootConfig(uint8_t OB_BOOT);
FLASH_Status FLASH_OB_Launch(void);
uint8_t      FLASH_OB_GetUser(void);
uint16_t     FLASH_OB_GetWRP(void);
uint16_t     FLASH_OB_GetWRP1(void);
uint16_t     FLASH_OB_GetPCROP(void);
uint16_t     FLASH_OB_GetPCROP1(void);
FlagStatus   FLASH_OB_GetRDP(void);
uint8_t      FLASH_OB_GetBOR(void);

Le codage logiciel peut configurer les octets d'options en appelant ces interfaces de fonction.

2. Outils de programmation

Par exemple, l'outil de programmation STM32CubeProg :

e321654f2fac91a7272baa0be0d77d4a.png

La configuration de l'octet d'option STM32 peut également être configurée via l'utilitaire ST-LINK, STVP et d'autres outils similaires.

Astuce : les octets d'option STM32 des différents modèles peuvent être légèrement différents.

 Opérations de lecture et d'effacement FLASH

Le Flash interne du STM32 est similaire aux autres Flash externes et prend en charge les opérations de routine telles que la lecture, l'écriture et l'effacement. Des opérations telles que le déverrouillage et la déprotection sont généralement nécessaires avant d'utiliser le Flash interne.

Par exemple:

FLASH_OB_Lock();
FLASH_OB_WRPConfig(OB_WRP_Sector_All, ENABLE);
FLASH_OB_PCROPConfig(OB_PCROP_Sector_All, ENABLE);

1. Lire les données

Il existe généralement deux manières de lire les données Flash internes :

  • Lecture par programme (encodage)

  • Lecture par un outil (de programmation) externe

Le programme (encodage) se lit comme suit :

uint32_t uwData32 = 0;
uint32_t uwAddress = 0x08001000;
uwData32 = *(__IO uint32_t*)uwAddress;

L'outil de programmation externe lit :

Condition de lecture : pas de protection en lecture, définissez l'adresse de lecture, la longueur, la largeur des données, etc.

31ffe7658ac175f0ab766d5cb473fe62.png

2. Écrire des données

L'écriture de données sur le Flash interne du STM32 est similaire à la lecture de données, mais l'adresse d'écriture des données ne peut pas contenir de données, c'est-à-dire que les données doivent être effacées avant l'écriture.

Par conséquent, par rapport à la lecture des données, certaines opérations supplémentaires sont généralement nécessaires avant l'écriture, telles que :

FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | 
                FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);

L'écriture de données via des outils est ce que nous appelons le téléchargement de données lors d'une production de masse. Plus formellement, cela s'appelle la programmation.

3. Effacer les données

L'effacement des données est généralement divisé en pages, secteurs et blocs entiers à effacer, et le temps d'effacement varie selon les modèles et les vitesses.

Astuce : Il est recommandé de se référer à la Démo officielle pour cette partie du contenu (la bibliothèque de périphériques standard et HAL ont des routines de base)

Questions fréquemment posées sur FLASH

L'objectif principal du Flash interne STM32 est de stocker le code et les données du programme. Soyez prudent lorsque vous utilisez le Flash interne, sinon le programme entier pourrait être détruit s'il n'est pas utilisé correctement.

Problème 1 : les adresses de programmation (écriture de données) ne sont pas alignées

Lors de l'écriture des données, nous devons spécifier l'adresse à écrire. Si l'adresse d'écriture n'est pas alignée, une erreur d'alignement de programmation se produira.

Par exemple:

Après un alignement d'adresse de 32 bits (4 octets), votre adresse ne peut être qu'un multiple de 4. 0x08001000 est correct, 0x08001001 est faux.

Astuce : Différents modèles peuvent avoir des largeurs d'alignement différentes, certains sont en 32 bits, d'autres en 128 bits, etc.

Solution : juger l'adresse par le "reste".

Problème 2 : les données de l'adresse de programmation ne sont pas effacées

Avant d'écrire des données, vous devez effacer les données d'adresse correspondantes pour écrire normalement, sinon cela échouera.

Les données que nous effaçons sont généralement une page ou un secteur. L'écriture de données à une certaine adresse peut affecter les données à d'autres adresses. Si elles sont directement écrasées, il y aura des problèmes.

Solution : La méthode habituelle consiste à lire l'intégralité des données de la page (ou du secteur) et à les mettre en cache, puis à effacer la page entière, puis à écrire.

Question 3 : Lecture des données lors de l'effacement

Lorsque le Flash interne du STM32 effectue une opération d'écriture ou d'effacement, le bus est bloqué et la lecture des données Flash échouera à ce moment-là. 【Sauf mode double banque】

Solution : utilisez des indicateurs pour déterminer si l'opération d'écriture/effacement est terminée.

Question 4 : l'écriture échoue en raison d'une tension instable

Dans un environnement avec d'importantes interférences externes, l'alimentation peut chuter soudainement. Lors du fonctionnement du Flash interne STM32, si elle est inférieure à une tension spécifique, un échec de programmation se produira.

La tension minimale pour le fonctionnement du Flash est liée à la fois à la fréquence de fonctionnement et au modèle STM32 (voir la fiche technique pour plus de détails).

Solution : assurez la stabilité de la tension en améliorant le circuit matériel. Une tension d'alimentation insuffisante ou instable entraîne des dangers cachés, souvent difficiles à détecter ! !

------------  FIN  ------------

794b5fe449448e307bff05fd81bc83da.gif

●Colonne "Outils embarqués "

●Colonne "Développement embarqué"

●Colonne "Tutoriel Keil"

●Tutoriels sélectionnés dans la colonne intégrée

Faites attention au compte officiel et répondez « Jiagroup » pour rejoindre le groupe d'échange technique selon les règles, et répondez « 1024 » pour voir plus de contenu.

613ec1a9821a5f8fa6212531e1ce494d.jpeg

d8853d4ea226ebe9b86d18767e06a2fc.png

Cliquez sur « Lire le texte original » pour voir plus de partage.

Je suppose que tu aimes

Origine blog.csdn.net/ybhuangfugui/article/details/132331664
conseillé
Classement