Écriture dans la mémoire flash STM32L4x1 en C

J’essaie d’écrire dans la mémoire flash du STM32L476 à l’aide d’un JTAG ST-Link / V2 sous Windows 7. Aucun logiciel ne doit être téléchargé, il me suffit d’écrire des données dans un emplacement non volatile où elles peuvent être lues et supprimées.

En tant que débutant en ce qui concerne le matériel et n’est efficace que pour la programmation de C standard non intégré, j’ai peur de nuire ou de modifier de manière irrévocable la mémoire flash. De plus, je ne suis pas vraiment sûr de ce que je peux ou ne peux pas faire.

J’ai compris en lisant le manuel que écrire dans un emplacement mémoire 0x08000000 semblait être une bonne idée. Utilisation du code C pour passer des appels à ST-Link_Utility :

const char CMD_ACCESS_ST_UTILITY[] = "cd C:/Program Files (x86)/STMicroelectronics/STM32 ST-LINK Utility/ST-LINK Utility&&ST-LINK_CLI.exe "; bool STLINKWriteSystemCalls(void) { char cmd[200] = ""; strcpy(cmd, CMD_ACCESS_ST_UTILITY); // cmd to access utility strcat(cmd, "-c"); // Then connect with ST-Link if (system(cmd) != 0) return false; // If failed exit strcpy(cmd, CMD_ACCESS_ST_UTILITY); strcat(cmd, "-r8 0x08000000 0x100"); // Read to check if there is data already // I haven't managed yet how I'll compare the result of read // To FFFF but that's not the main issue if (system(cmd) != 0) return false; // If failed exit strcpy(cmd, CMD_ACCESS_ST_UTILITY); strcat(cmd, "-w8 0x08000000 0x00"); // Write data into 0x080000000 if (system(cmd) != 0) return false; // If failed exit return true; } 

Y a-t-il une meilleure façon de faire cela en ce qui concerne l’endroit où écrire et comment écrire ( vérification des erreurs, ressource utilisée, etc. ) ?

Principales choses à savoir sur les mémoires flash:

  1. Les mémoires flash sont des pages effaçables, dans le format de votre cas si 2K . Qu’est-ce que ça veut dire? Vous devez être sûr que votre code ne réside pas dans la plage de pages de 2k .
  2. Après avoir effacé l’état de tous les octets en mémoire est 0xFF.
  3. Écrire dans un octet flash signifie, au niveau brut, modifier les bits définis entre 1 et 0 . Si vous souhaitez modifier un bit de 0 à 1 vous devez effacer une page entière.

ST-Link_Utility fait de manière intégrée. Ainsi, lorsque vous écrivez en flash, cela efface tout un secteur et écrivez des données. Même chose si votre code est nécessaire pour faciliter les données après leur utilisation.


Par défaut, votre mCU utilise au démarrage l’adresse 0x0000 0000 de 0x0800 0000 au démarrage.

Les premiers mots doivent contenir le vecteur de réinitialisation et le tableau de vecteurs par défaut. Le vecteur de réinitialisation est toujours la première instruction à exécuter. Le vecteur de réinitialisation de cette table contiendra une twig vers une adresse qui contiendra le code de réinitialisation.

Ainsi, en d’autres termes, au moment de la mise sous tension, le processeur saute à l’emplacement fixe 0x0 , ce qui signifie qu’il saute à 0x0800 0000 . De toute évidence, l’adresse que vous avez sélectionnée n’est pas correcte;)

Bonnes nouvelles! Puisque vous utilisez l’utilitaire ST Link, vous ne pouvez pas détruire la puce. Il refusera simplement d’écrire s’il n’y a pas de mémoire accessible.

La seule façon de vous verrouiller définitivement hors de la puce consiste à activer la protection en lecture au niveau maximal 2 . Pour ce faire, vous devez écrire dans les octets d’option. Et vous n’écrivez pas accidentellement 0xCC33 dans les octets de locking.

Une chose à considérer est que la puce écrit uniquement des demi-mots (16 bits) et uniquement lorsque le FLASH est toujours 0xFFFF (état effacé). Sinon, l’erreur d’écriture sera renvoyée.

Mise à jour: extrait manuel de RDP. Protection de lecture de code.

Niveau 2: Pas de débogage
A ce niveau, le niveau de protection 1 est garanti.
De plus, le port de débogage Cortex®-M4, le démarrage à partir de la RAM ( mode démarrage RAM ) et le démarrage à partir de la mémoire système (mode chargeur de démarrage ) ne sont plus disponibles .
En mode d’exécution utilisateur (mode FLASH de démarrage), toutes les opérations sont autorisées dans la mémoire flash principale. …
Le niveau 2 ne peut pas être supprimé du tout: c’est une opération irréversible.

En bref: n’écrivez pas dans 0x1FFF7800.