A memória flash do programa do microcontrolador pode ser usada para armazenar a configuração do usuário?

9

Muitos microcontroladores, por exemplo, PIC18F , possuem memória flash de programa: "A memória do programa Flash é legível e gravável durante a operação normal". Isso significa que posso armazenar algumas configurações do usuário na memória do programa?

student1
fonte

Respostas:

12

Sim você pode. Eu já fiz isso muitas vezes.

No entanto, existem algumas desvantagens em relação ao uso de EEPROM separado:

  1. O número de gravações vitalícias na memória flash do programa é significativamente menor que a EEPROM de dados.

  2. O processador sai para almoçar durante os tempos de apagar e gravar.

  3. O flash do programa é apagado em blocos. Você não pode simplesmente atualizar um único byte. Eu costumo usar um esquema de cache de bloco para lidar com isso.

Olin Lathrop
fonte
Perfeito, você parece de alguma forma sei que a minha pergunta é realmente "por isso a necessidade de EEPROM, enquanto você pode usar a memória de programa para ambos os programas e dados do usuário" :)
student1
Olin, todo o Flash é apagado quando uma nova versão do firmware é gravada no PIC? Existe uma boa maneira de impedir que a configuração do usuário (ou dados de calibração) no Flash seja apagada durante o download do firmware? Trata-se de conveniência durante o desenvolvimento do firmware. Eu imaginaria que a configuração do usuário seria armazenada no último bloco ou Flash.
Nick Alexeev
6
@ Nick: Isso depende do programador PIC que você está usando. Muitos, incluindo todos os meus, apagam em massa, para que os dados de calibração sejam apagados. Em algumas ocasiões, escrevi um aplicativo de programação especial que lia os dados de calibração, apagava o volume e depois escrevia os dados de calibração novamente como parte do processo normal de programação. Alguns programadores de microchip podem conseguir atualizar apenas partes da memória do programa. Observe que, se você ativou a proteção de código, o programador deve fazer uma exclusão em massa.
Olin Lathrop
Em processadores que não são da Harvard (estou pensando no MSP430), você pode copiar o código para a RAM, pular para a RAM e executar enquanto a gravação / exclusão em flash ocorre. Eu usei isso para um carregador de inicialização, para escrever e receber simultaneamente novos dados de um rádio.
markrages
@mark: Sim, isso também funciona no PIC32, onde também é possível executar a partir da RAM. De fato, isso é mais rápido.
amigos estão dizendo sobre
6

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.

tcrosley
fonte
Esse método de "firmware over the air" parece muito interessante. Remove a necessidade de In System Programming (ISP)?
student1
@ student1 Não elimina a necessidade de programação inicial do chip por meio de uma interface ISP, porque você precisa colocar algum firmware no chip para poder lidar com as atualizações mais tarde. Os microcontroladores ATmega usados ​​nas placas Arduino já possuem esse tipo de firmware, chamado Bootloader, e é por isso que você não precisa usar uma interface ISP para baixar esboços para um Arduino. No entanto, se você deseja atualizar o próprio Bootloader, isso requer uma interface ISP. Este Bootloader lida apenas com atualizações via USB, portanto, não é realmente "firmware over the air".
tcrosley