Lorsque vous incluez le code suivant dans une source AVR C, vous pouvez apparemment directement programmer les fusibles, sans avoir besoin d'une commande supplémentaire ou d'un fichier .hex:
#include <avr/io.h>
FUSES = {
.low = LFUSE_DEFAULT ,
.high = HFUSE_DEFAULT ,
.extended = EFUSE_DEFAULT ,
};
Existe-t-il une astuce similaire pour programmer les valeurs en EEPROM?
J'ai vérifié /usr/lib/avr/include/avr/fuse.h
où je peux trouver des commentaires sur une macro, mais je ne trouve pas de commentaire similaire dans /usr/lib/avr/include/avr/eeprom.h
et interpréter les trucs du préprocesseur est un peu hors de ma ligue.
Ce serait vraiment pratique si je pouvais inclure des valeurs EEPROM par défaut dans le code source C. Quelqu'un sait comment accomplir cela?
edit1:
Cette astuce FUSES n'est exécutée qu'au moment du FAI, pas au moment de l'exécution. Il n'y a donc pas de fusibles programmés dans le code d'assemblage résultant dans le contrôleur. Au lieu de cela, le programmeur parcourt automatiquement un cycle de programmation FUSES supplémentaire.
edit2:
J'utilise la chaîne d'outils avr-gcc et avrdude sous Linux.
Réponses:
Avec avr-gcc, la
EEMEM
macro peut être utilisée sur la définition d'une variable, voir lalibc
documentation et un exemple ici :déclare que le tableau de caractères doit résider dans une section nommée ".eeprom" qui, après compilation, indique au programmeur que ces données doivent être programmées dans l'EEPROM. En fonction de votre logiciel de programmation, vous devrez peut-être donner explicitement le nom du fichier ".eep" créé au cours du processus de génération au programmeur, ou il pourra le trouver implicitement par lui-même.
la source
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 ihex $(src).elf $(src).eeprom.hex
avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U eeprom:w:$(src).eeprom.hex
Oui, vous pouvez écrire manuellement les données par défaut dans l'EEPROM dans le code source. Tout d'abord, consultez ce guide génial sur l'EEPROM avec AVR: le didacticiel AVR EEPROM de Dean. En outre, je dois ajouter qu'il est préférable de créer un fichier .eep contenant les données EEPROM à l'aide du makefile qui sera programmé pour l'appareil avec le code source. Cependant, si vous n'êtes pas familier avec les diverses opérations de makefile et de l'éditeur de liens, cela peut toujours être fait à partir de votre fichier de code source - cela se produira juste dès que le circuit sera alimenté, bloquant l'opération initiale du programme.
Au début du programme (avant toute sorte de boucle principale), vous pouvez faire quelque chose comme ceci:
La fonction "mise à jour" vérifie d'abord si cette valeur est déjà là, pour économiser sur les écritures inutiles, en préservant la durée de vie de l'EEPROM. Cependant, cela peut prendre beaucoup de temps pour de très nombreux sites. Il pourrait être préférable de vérifier un seul emplacement. S'il s'agit de la valeur souhaitée, les autres mises à jour peuvent être ignorées complètement. Par exemple:
Si vous cherchez à mettre à jour de grandes quantités de données, essayez d'utiliser les autres fonctions telles que
eeprom_update_block(...)
. Et lisez certainement ce tutoriel; c'est bien écrit.Vous pouvez placer toutes les instructions de mise à jour EEPROM dans une seule instruction conditionnelle de préprocesseur. C'est très simple à faire:
Ce morceau de code ne sera même pas compilé sauf si vous effectuez les opérations suivantes:
Vous pouvez y laisser un commentaire, puis décommenter si vous devez modifier les valeurs EEPROM par défaut. Pour plus d'informations sur le préprocesseur C, consultez ce manuel en ligne . Je pense que vous pouvez être plus intéressé par les sections sur les macros et les instructions conditionnelles.
la source
Ch. 7 Setting Initial Values
.EEMEM
variables, le compilateur se charge de gérer quelle variable réside où dans l'EEPROM. De cette façon, vous n'opérez sur des pointeurs (constants, générés par le compilateur) vers des variables que lorsque vous accédez aux données. Si, d'autre part, vous définissez explicitement l'adresse où réside chaque variable, vous devrez vous occuper de ces adresses vous-même, notamment en vous assurant qu'aucune variable n'occupe accidentellement la même adresse, en vous écrasant; ou recalculer toutes les adresses au cas où la taille de stockage d'une variable changerait à l'avenir, etc.