Understanding EEPROM vs. Flash in PIC Microcontrollers

Data storage is often critical in embedded systems, especially when you need to preserve data across resets or power cycles. PIC microcontrollersIntroduction to PIC: Exploring the Basics of Microcontroller ArchitectureIntroduction to PIC: Exploring the Basics of Microcontroller ArchitectureExplore the core principles of PIC microcontroller architecture, including Harvard design, RISC processing, and efficient memory organization. typically provide two main types of non-volatile memory for this purpose: EEPROM (Electrically Erasable Programmable Read-Only Memory) and Flash program memoryPIC Memory Architecture: Program Memory, Data Memory, and SFRsPIC Memory Architecture: Program Memory, Data Memory, and SFRsExplore the PIC microcontroller’s memory architecture, covering Program, Data, and Special Function Registers for improved embedded system performance.. Understanding how to work with these memories allows you to store configuration values, calibration parameters, logging information, and more without losing data when power is removed.

In this tutorial, we will explore:

1. EEPROM vs. Flash Program MemoryPIC Memory Architecture: Program Memory, Data Memory, and SFRsPIC Memory Architecture: Program Memory, Data Memory, and SFRsExplore the PIC microcontroller’s memory architecture, covering Program, Data, and Special Function Registers for improved embedded system performance.

2. Common Use Cases and Design Considerations

3. Reading and Writing to EEPROM

4. Storing and Retrieving Data in Flash

5. Code Examples with MPLAB XC8Getting Started with MPLAB X and the XC8 CompilerGetting Started with MPLAB X and the XC8 CompilerSet up MPLAB X IDE and XC8 compiler for PIC programming with our comprehensive guide detailing installation, configuration, and debugging techniques.

6. Best Practices for Data Storage

EEPROM vs. Flash Program Memory🔗

EEPROM and Flash are both forms of non-volatile memory, but they serve slightly different roles in PIC microcontrollersIntroduction to PIC: Exploring the Basics of Microcontroller ArchitectureIntroduction to PIC: Exploring the Basics of Microcontroller ArchitectureExplore the core principles of PIC microcontroller architecture, including Harvard design, RISC processing, and efficient memory organization.:

Common Use Cases and Design Considerations🔗

Non-volatile memory usage scenarios often include:

When deciding whether to use EEPROM or Flash, consider:

FeatureEEPROMFlash Program Memory
EnduranceHigher erase/write enduranceLower endurance
Write GranularityByte or word-levelTypically page-level
Memory SizeUsually smaller (tens or hundreds of bytes)Larger but shared with program code
Access ComplexityEasier to write using dedicated registersMore complex; requires erase/write sequences

Reading and Writing to EEPROM🔗

Many PIC microcontrollersIntroduction to PIC: Exploring the Basics of Microcontroller ArchitectureIntroduction to PIC: Exploring the Basics of Microcontroller ArchitectureExplore the core principles of PIC microcontroller architecture, including Harvard design, RISC processing, and efficient memory organization. include data EEPROM that can be read and written at runtime. Below is a general approach for PIC16Understanding PIC Family Variants: PIC12, PIC16, PIC18, and BeyondUnderstanding PIC Family Variants: PIC12, PIC16, PIC18, and BeyondExplore PIC microcontroller families: learn how PIC12’s compact design, PIC16’s balanced features, and PIC18’s robust performance for innovative projects. or PIC18Understanding PIC Family Variants: PIC12, PIC16, PIC18, and BeyondUnderstanding PIC Family Variants: PIC12, PIC16, PIC18, and BeyondExplore PIC microcontroller families: learn how PIC12’s compact design, PIC16’s balanced features, and PIC18’s robust performance for innovative projects. devices when using XC8Getting Started with MPLAB X and the XC8 CompilerGetting Started with MPLAB X and the XC8 CompilerSet up MPLAB X IDE and XC8 compiler for PIC programming with our comprehensive guide detailing installation, configuration, and debugging techniques.:

1. Configure the EEPROM Module: Make sure interruptsImplementing Interrupt-Driven Systems for Real-Time ApplicationsImplementing Interrupt-Driven Systems for Real-Time ApplicationsLearn to configure and optimize PIC microcontroller interrupts for real-time performance. Enhance responsiveness and efficiency using best practices. are disabled or handled properly to avoid corruption during write operations.

2. Select the Address: Each byte in EEPROM has an address, often handled by a register such as EEADR.

3. Load Data: Place the data you want to write in a register like EEDATA.

4. Initiate Write: Set control bits (WREN, EECON2 sequence, WR) to begin the write.

5. Wait for Completion: Monitor flags (EEIF) or status bits to confirm the operation’s success.

Example: Writing a Byte to EEPROM

Below is a simplified code snippet in C using MPLAB XC8Getting Started with MPLAB X and the XC8 CompilerGetting Started with MPLAB X and the XC8 CompilerSet up MPLAB X IDE and XC8 compiler for PIC programming with our comprehensive guide detailing installation, configuration, and debugging techniques. for a typical PIC:

#include <xc.h>
#define EEPROM_START_ADDRESS 0x00
void eeprom_write(unsigned char address, unsigned char data) {
    // Wait for any previous writes to complete
    while(WR) {
        ; // do nothing
    }
    // Point to the correct address
    EEADR = address;
    // Load the data
    EEDATA = data;
    // Access data memory
    EECON1bits.EEPGD = 0;
    // Enable writes
    EECON1bits.WREN = 1;
    // The required sequence to allow write
    INTCONbits.GIE = 0;     // Disable interrupts
    EECON2 = 0x55;
    EECON2 = 0xAA;
    EECON1bits.WR = 1;      // Start the write
    INTCONbits.GIE = 1;     // Re-enable interrupts
    // Disable writes
    EECON1bits.WREN = 0;
}
unsigned char eeprom_read(unsigned char address) {
    EEADR = address;
    // Access data memory
    EECON1bits.EEPGD = 0;
    // Start the read
    EECON1bits.RD = 1;
    // Return the read data
    return EEDATA;
}
void main(void) {
    // Write 0x33 to the first address in EEPROM
    eeprom_write(EEPROM_START_ADDRESS, 0x33);
    // Read the value back
    unsigned char val = eeprom_read(EEPROM_START_ADDRESS);
    while(1) {
        // main loop
    }
}

In the example, we carefully follow the timing sequence recommended by Microchip. We also disable interruptsImplementing Interrupt-Driven Systems for Real-Time ApplicationsImplementing Interrupt-Driven Systems for Real-Time ApplicationsLearn to configure and optimize PIC microcontroller interrupts for real-time performance. Enhance responsiveness and efficiency using best practices. during the critical write unlock sequence to prevent unexpected behavior.

Storing and Retrieving Data in Flash🔗

Some PIC microcontrollersIntroduction to PIC: Exploring the Basics of Microcontroller ArchitectureIntroduction to PIC: Exploring the Basics of Microcontroller ArchitectureExplore the core principles of PIC microcontroller architecture, including Harvard design, RISC processing, and efficient memory organization. allow you to store and retrieve data in the Flash program memoryPIC Memory Architecture: Program Memory, Data Memory, and SFRsPIC Memory Architecture: Program Memory, Data Memory, and SFRsExplore the PIC microcontroller’s memory architecture, covering Program, Data, and Special Function Registers for improved embedded system performance.. While this provides more space than the dedicated EEPROM, the write/erase cycles are typically more limited, and the process is more complex:

1. Reserve a Section of Program MemoryPIC Memory Architecture: Program Memory, Data Memory, and SFRsPIC Memory Architecture: Program Memory, Data Memory, and SFRsExplore the PIC microcontroller’s memory architecture, covering Program, Data, and Special Function Registers for improved embedded system performance.: Often done by placing special compiler directives or memory qualifiers.

2. Use Table Write Instructions: For mid-range and high-end PIC MCUsMastering Digital I/O on PIC MCUs with Practical ExamplesMastering Digital I/O on PIC MCUs with Practical ExamplesLearn hands-on techniques for configuring and using digital I/O pins on PIC microcontrollers to control LEDs, sensors, and more in practical projects., writing to Flash involves table pointer registers (TBLPTR) and table latch registers.

3. Erase Before Writing: Flash memoryPIC Memory Architecture: Program Memory, Data Memory, and SFRsPIC Memory Architecture: Program Memory, Data Memory, and SFRsExplore the PIC microcontroller’s memory architecture, covering Program, Data, and Special Function Registers for improved embedded system performance. must be erased in pages before you can program it.

4. Follow Exact Timing Routines: The datasheet provides specific sequences that must be executed to safely write to or erase Flash.

Example Considerations

  • PIC18F devices often use TBLPTR (Table Pointer) and instructions like TBLRD, TBLWT.
  • Ensure that the segment of Flash you are using is not overlapping your application code.
  • Use Microchip’s provided library functions or create your own routines based on the datasheet if you need custom memory management.

Code Examples with MPLAB XC8🔗

Microchip typically offers library functions (#include <xc.h>) that handle most of the write steps for you. If your device supports specific Flash self-write libraries, consider using them:

// Pseudo-code for PIC18 with Flash self-write support
#include <xc.h>
// Example buffer to be written to Flash
unsigned char flashBuffer[64];
void writeToFlash(unsigned long address, unsigned char* data, int length) {
    // Implement page erase, block write, and error checking
    // ...
}
void main(void) {
    // Initialize your custom data
    for(int i = 0; i < 64; i++) {
        flashBuffer[i] = i; // sample data
    }
    // Write data to a reserved Flash location
    writeToFlash(0x2000, flashBuffer, 64);
    while(1) {
        // main loop
    }
}

When working with Flash, carefully follow documentation for erase page size, write page size, and the required unlocking sequences to enable self-write operations.

Best Practices for Data Storage🔗

Below are some recommendations to maximize reliability and maintain data integrity:

1. Minimize Writes: Every erase/write cycle wears out the memory cell. Only write what’s necessary and consider techniques like wear-leveling.

2. Use Checksums: To prevent corruption due to unexpected resets or power loss, store a checksum or CRC with your data.

3. Ensure Proper Power Supply: If voltage drops during a write, data corruption is likely. Consider brown-out detection and robust power design.

4. Plan Your Memory Layout: Reserve adequate memory for future expansion of stored data.

5. Take Lock Bits Into Account: In some devices, Lock bits protect certain memory regions from unintended writes.

Conclusion🔗

Working with EEPROM and Flash on PIC microcontrollersIntroduction to PIC: Exploring the Basics of Microcontroller ArchitectureIntroduction to PIC: Exploring the Basics of Microcontroller ArchitectureExplore the core principles of PIC microcontroller architecture, including Harvard design, RISC processing, and efficient memory organization. is a crucial skill for any embedded developer who wants to store persistent data or implement reconfigurable features. By understanding the differences between these two memory types, their endurance, and their programming mechanisms, you can leverage them effectively in building robust applications-whether you’re logging sensor data, preserving user settings, or creating calibration routines.

Use EEPROM for small, frequently updated data and Flash for larger, less frequently updated data. Always refer to your specific PIC’s datasheet for exact register names, memory sizes, and timing sequences to ensure reliable data storage.

Tip: Practice on a development board with demonstration code or small test applications to gain confidence in reading and writing data. Thorough testing in various power and reset conditions is recommended to guarantee data integrity under real-world scenarios.
Author: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Share article