Respostas:
Sim você pode. Eu já fiz isso muitas vezes.
No entanto, existem algumas desvantagens em relação ao uso de EEPROM separado:
Muitos PIC18 têm memória EEPROM, com até 1 K de tamanho. Infelizmente, o PIC18F46J50 que você faz referência não. Se a EEPROM estiver disponível, é uma escolha muito melhor se for grande o suficiente para os seus dados, pois a EEPROM possui um mínimo de 1.000.000 de ciclos de apagamento / gravação e o flash é de apenas 10.000.
O PIC18, como a maioria dos outros microcontroladores, usa o que é chamado de arquitetura de Harvard, o que significa que existem áreas endereçáveis fisicamente separadas para programas e dados (ou seja, você pode ter um endereço de programa 4 e um endereço de dados 4, e eles não são os mesmos). Portanto, você não pode ler ou gravar memória flash usando os métodos normais em linguagem C ou assembly.
Em vez disso, na família PIC18, você configura um endereço inicial em um registro de 22 bits chamado TBLPTR. Para ler bytes do flash, use uma instrução TBLRD. Há uma opção para incrementar ou diminuir automaticamente o endereço após uma leitura. Você não precisa fazer isso manualmente.
Para gravar na memória flash, é necessário apagar primeiro um ou mais blocos de 64 bytes da memória flash que serão gravados. Depois de configurar o endereço inicial novamente em TBLPTR e os valores em alguns outros registradores para inicializar a operação de apagamento, as interrupções são desativadas e você deve gravar 0x55 imediatamente seguido por 0xAA em um registro; isso desbloqueia o comando apagar e é necessário para impedir que códigos errados acidentalmente apagem a memória. Finalmente, o comando para realmente apagar é executado, seguido pela reativação das interrupções.
Gravar na memória flash é semelhante a apagar, exceto que o tamanho do bloco é menor. A gravação é realmente executada usando uma instrução TBLWT, que também permite incremento / decremento automático como a instrução TBLRD.
Além de salvar os dados de configuração, a gravação na memória flash permite atualizar o firmware no campo usando o que é chamado de "firmware over the air". Você precisa de um bloco fixo de firmware, geralmente no início da memória do programa, que possa receber a atualização de um módulo Bluetooth, Wi-Fi, módulo de celular ou até uma conexão com fio e atualizar o flash acima de um determinado ponto em o programa (por exemplo, uma "cerca") com novo código. Após a conclusão da atualização, uma redefinição é iniciada e o novo código é colocado em uso.
Muitos outros microcontroladores, além da família PIC, podem atualizar sua memória flash; a maioria usa alguma combinação de registradores de configuração, um ponteiro de endereço e instruções especiais para executar a tarefa.