La mémoire flash du programme du microcontrôleur peut-elle être utilisée pour stocker la configuration utilisateur?

9

De nombreux microcontrôleurs, par exemple PIC18F , ont une mémoire de programme Flash: "La mémoire de programme Flash est lisible et inscriptible pendant le fonctionnement normal". Est-ce à dire que je peux stocker certaines configurations utilisateur dans la mémoire du programme?

étudiant1
la source

Réponses:

12

Oui, vous pouvez. Je l'ai fait plusieurs fois.

Cependant, il existe certains inconvénients par rapport à l'utilisation d'EEPROM distincte:

  1. Le nombre d'écritures à vie pour programmer la mémoire flash est nettement inférieur à celui des données EEPROM.

  2. Le processeur sortira pour déjeuner pendant les heures d'effacement et d'écriture.

  3. Le flash du programme est effacé par blocs. Vous ne pouvez pas simplement mettre à jour un seul octet. J'utilise généralement un schéma de mise en cache de blocs pour gérer cela.

Olin Lathrop
la source
Parfait, vous semblez savoir en quelque sorte que ma question est vraiment "pourquoi le besoin d'EEPROM alors que vous pouvez utiliser la mémoire de programme pour les données de programme et d'utilisateur" :)
student1
Olin, est-ce que tout le Flash est effacé quand une nouvelle version du firmware est gravée dans le PIC? Existe-t-il un bon moyen d'empêcher la configuration utilisateur (ou les données d'étalonnage) dans le Flash d'être effacées lors du téléchargement du firmware? Il s'agit de commodité lors du développement du firmware. J'imagine que la configuration utilisateur serait stockée dans le tout dernier bloc ou Flash.
Nick Alexeev
6
@ Nick: Cela dépend du programmeur PIC que vous utilisez. Beaucoup, y compris tous les miens, font un effacement en masse, de sorte que les données d'étalonnage seraient effacées. J'ai à quelques reprises écrit une application de programmation spéciale qui lit les données d'étalonnage, a fait l'effacement en masse, puis a écrit les données d'étalonnage dans le cadre du processus de programmation normal. Certains programmeurs Microchip peuvent mettre à jour uniquement certaines parties de la mémoire du programme. Notez que si vous avez activé la protection du code, le programmeur doit effectuer un effacement en masse.
Olin Lathrop
Sur les processeurs non Harvard (je pense au MSP430), vous pouvez copier du code dans la RAM, sauter dans la RAM et exécuter pendant l'écriture / l'effacement flash. Je l'ai utilisé pour un chargeur de démarrage, pour écrire et recevoir simultanément de nouvelles données d'une radio.
markrages
@mark: Oui, cela fonctionne également sur PIC32, où il est également possible d'exécuter à partir de la RAM. En fait, c'est plus rapide.
Olin Lathrop
6

De nombreux PIC18 ont une mémoire EEPROM, jusqu'à 1 Ko. Malheureusement, le PIC18F46J50 auquel vous faites référence ne le fait pas. Si l'EEPROM est disponible, c'est un bien meilleur choix si elle est suffisamment grande pour vos données, car l'EEPROM a un minimum de 1000000 de cycles d'effacement / écriture et le flash n'est que de 10000.

Le PIC18, comme la plupart des autres microcontrôleurs, utilise ce qu'on appelle une architecture Harvard, ce qui signifie qu'il existe une zone adressable physiquement distincte pour les programmes et les données (c'est-à-dire que vous pouvez avoir une adresse de programme 4 et une adresse de données 4, et ce ne sont pas les mêmes). Par conséquent, vous ne pouvez pas lire ou écrire de mémoire flash à l'aide des méthodes normales en langage C ou en assembleur.

Au lieu de cela, sur la famille PIC18, vous configurez une adresse de départ dans un registre 22 bits appelé TBLPTR. Pour lire les octets du flash, vous utilisez une instruction TBLRD. Il existe une option pour incrémenter ou décrémenter automatiquement l'adresse après une lecture, vous n'avez pas à le faire manuellement.

Pour écrire dans la mémoire flash, vous devez d'abord effacer un ou plusieurs blocs de mémoire flash de 64 octets qui seront écrasés. Après avoir configuré à nouveau l'adresse de départ dans TBLPTR et les valeurs dans certains autres registres pour initialiser l'opération d'effacement, les interruptions sont désactivées, puis vous devez écrire 0x55 immédiatement suivi de 0xAA dans un registre; cela déverrouille la commande d'effacement et est nécessaire pour empêcher un code erroné d'effacer accidentellement la mémoire. Enfin, la commande pour réellement effacer est exécutée, suivie de la réactivation des interruptions.

L'écriture dans la mémoire flash est similaire à l'effacement, sauf que la taille du bloc est plus petite. L'écriture est en fait exécutée à l'aide d'une instruction TBLWT, qui permet également une incrémentation / décrémentation automatique comme l'instruction TBLRD.

En plus d'économiser les données de configuration, l'écriture dans la mémoire flash permet de mettre à jour leur micrologiciel sur le terrain à l'aide de ce qu'on appelle un "micrologiciel en direct". Vous devez avoir un bloc fixe de micrologiciel, généralement au début de la mémoire du programme, qui peut recevoir la mise à jour d'un module Bluetooth, Wi-Fi, module cellulaire ou même d'une connexion filaire, et mettre à jour le flash au-dessus d'un certain point dans le programme (par exemple une "clôture") avec un nouveau code. Une fois la mise à jour terminée, une réinitialisation est lancée et le nouveau code est mis en service.

De nombreux autres microcontrôleurs en plus de la famille PIC ont la possibilité de mettre à jour leur mémoire flash; la plupart utilisent une combinaison de registres de configuration, un pointeur d'adresse et des instructions spéciales pour effectuer la tâche.

tcrosley
la source
Cette méthode du «firmware over the air» semble très intéressante. Cela supprime-t-il le besoin de programmation système intégrée (FAI)?
student1
@ student1 Cela ne supprime pas la nécessité d'une programmation initiale de la puce via une interface ISP, car vous devez mettre un firmware sur la puce pour pouvoir gérer les mises à jour plus tard. Les microcontrôleurs ATmega utilisés sur les cartes Arduino ont déjà ce type de firmware, appelé Bootloader, c'est pourquoi vous n'avez pas besoin d'utiliser une interface ISP pour télécharger des croquis sur un Arduino. Cependant, si vous souhaitez mettre à jour le chargeur de démarrage lui-même, cela nécessite une interface ISP. Ce Bootloader ne gère que les mises à jour via USB, ce n'est donc pas vraiment un "firmware over the air".
tcrosley