na gravacao de dados e definir um segmento de memoria para isso. O CodeWarrior cria, para cada projeto, um arquivo "project.prm" com informacoes de segmentos de memoria para o Linker. Por default, sao criados os seguintes segmentos, na secao "SEGMENTS" desse arquivo: Z_RAM = READ_WRITE 0x0080 TO 0x00FF; RAM = READ_WRITE 0x0100 TO 0x017F; ROM = READ_ONLY 0xF000 TO 0xFFAD;Cuidado!! O "0xF000" mostrado acima e o inicio da memoria Flash do microcontrolador utilizado! Isto vai variar para cada modelo!Temos que criar um novo segmento, no inicio da Flash, do tamanho desejado, para armazenar dados (eu o chamei de "FLASH"), e alterar o endereco inicial do segmento "ROM" (memoria de codigo), da seguinte forma: FLASH = READ_WRITE 0xF000 TO 0xF1FF; ROM = READ_ONLY 0xF200 TO 0xFFAD;Reparem que o novo segmento ocupa os primeiros 0x200 (512) bytes da Flash, e o inicio do segmento "ROM" foi alterado para o fim desse novo segmento.Da mesma forma, na secao "PLACEMENT" do arquivo deve ser criada uma nova linha: FLASH_VAR INTO FLASH;O segundo passo e programar o controlador da Flash. Costumo utilizar o "Device Initialization", mas isso pode ser tambem feito manualmente. No "Device Initialization" basta acessar o periferico "intFLASH" e programar o "Clock Divider" para obter a frequencia de operacao necessaria. Essa frequencia, segundo informado no manual e tambem nesta tela do CodeWarrior, deve ficar entre 150kHz e 200kHz. O divisor depende, portanto, da frequencia de barramento que estamos utilizando. Sem esta programacao a gravacao na Flash nao ira funcionar!Feito isso, podemos agora utilizar esse novo segmento, "FLASH_VAR", em nosso programa. Foi entao criado um modulo de programa que chamei de "iFLash.c", e um modulo header, "iFlash.h".Esses modulos estao disponiveis aqui: iFLash.c e iFlash.h.Reproduzo aqui o header iFlash.h para melhor examinarmos seu conteudo:// **************************************************************// internal Flash Erase/Write for Data Storage// (C) d'Avila, 2012// **************************************************************#include "derivative.h" /* include peripheral declarations */#define iFLashByteProg 0x20#define iFLashBurstProg 0x25#define iFLashPageErase 0x40#pragma DATA_SEG FLASH_VARextern byte iFlash [512];#pragma DATA_SEG __SHORT_SEG MY_ZEROPAGEvoid iFlashComm (char Comm, char *Add, char Data); // Command Functionvoid iFlashBurst (char Size, char *Add, char *Buf); // Burst FunctionAs tres definicoes (#define) acima sao os codigos de comandos para a Flash. O vetor iFlash [512] e a area da Flash a ser utilizada para dados. Reparem que ele esta alocado no segmento FLASH_VAR, sobre o qual falamos acima ao descrever o arquivo de comandos do Linker. As funcoes disponiveis sao iFlashComm e iFlashBurst. A primeira e utilizada para apagar a pagina e para gravar um byte de dados. A segunda grava varios bytes em sequencia, de forma bem mais rapida do que se utilizassemos a gravacao de um byte varias vezes.IMPORTANTE!! A Flash nao suporta varias gravacoes no mesmo endereco, sem que a pagina seja apagada entre as gravacoes. Apos apagar a pagina (comando iFLashPageErase), pode-se gravar todos os bytes da pagina, mas cada byte apenas uma vez!Para apagar ou gravar um byte, executa-se a funcao iFlashComm, passando como parametros o comando desejado, um pointer para o endereco a ser agagado/gravado, e o valor a ser gravado. Para apagar a pagina qualquer endereco dentro da pagina e valido, e o valor