استخدم flash لمحاكاة تجربة المستخدم من eeprom
void ee_flashInit() : Format Flash ، يمكن فقط للميض المنسق استخدام وظيفتي API التالية.ee_uint8 ee_readDataFromFlash() : اقرأ البياناتee_uint8 ee_writeDataToFlash(); : كتابة البياناتvariableLists الجدول المتغير enum لقراءة البيانات وكتابةها في هذا الجدولأدخل أولاً ملف الرأس واملأ وحدات الماكرو الأربعة بالكامل وفقًا للتعليقات
SECTOR_SIZE : حجم سعة القطاع (الحد الأدنى لوحدة التخزين في الفلاش) في حاضر فلاشee_flashWrite : فلاش كتابة عملية تشغيل اسم وظيفة برنامج تشغيلee_flashRead : اسم وظيفة برنامج تشغيل القراءة فلاشee_flashEraseASector : فلاش يمحو قطاعًا (وحدة ذاكرة أدنى لذاكرة فلاش) اسم وظيفة برنامج التشغيلوحدات الماكرو القابلة للملء (لا يوجد حشوة لا تؤثر على تشغيل الوظيفة)
BLOCk_SECTOR_NUM : كم عدد القطاعات الموجودة في كتلة من الفلاش؟وحشيتان خاصتان:
SECTORS(x) : إرجاع الحجم الإجمالي للقطاع xBLOCKS(x) : إرجاع الحجم الإجمالي للكتلة x . لاستخدام هذا الماكرو ، تحتاج إلى ملء macro BLOCk_SECTOR_NUM مقدمًا. تُستخدم وحدات الماكرو أعلاه بشكل أساسي لنقل معلمات وظيفة ee_flashInit() لتسهيل استخدام عناوين الفلاش.
مثال:
// 首先在flash_MemMang.h枚举类型中添加数据名,用于管理数据
typedef enum
{
// 用户将变量名添加到下面
G_MYSENSORDATA ,
G_FLOAT ,
// DATA_NUM用于标识flash中一共存了多少个数据(不允许删改)
DATA_NUM ,
} variableLists ;
//------------------主函数-------------
/* 创建flash管理句柄 */
ee_flash_t g_fm ;
/* 想要存入flash中的变量 */
int g_mySensorData = 16 ;
float g_float = 3.14 ;
char g_txt [ 20 ] = "change data test" ;
int main ( void )
{
int dataTmp = 0 ;
float ftmp = 0 ;
char tt [ 20 ];
/* 格式化传入地址的格式 */
ee_flashInit ( & g_fm , /* 管理句柄 */
SECTORS ( 0 ), /* 索引区起始地址 */
SECTORS ( 2 ), /* 交换索引区起始地址 */
2 , /* 总索引区大小(单位:扇区) */
1 , /* 索引区大小(详见README图例,indexRegionSize) */
SECTORS ( 4 ), /* 数据区起始地址 */
SECTORS ( 5 ), /* 交换数据区起始地址 */
1 ); /* 数据区大小(单位:扇区) */
/* 数据写入顺序错误,写入失败 */
ee_writeDataToFlash ( & g_fm , & g_float , sizeof ( g_float ), G_FLOAT );
ee_writeDataToFlash ( & g_fm , & g_mySensorData , sizeof ( g_mySensorData ), G_MYSENSORDATA );
/* 正确将数据写入flash */
ee_writeDataToFlash ( & g_fm , & g_mySensorData , sizeof ( g_mySensorData ), G_MYSENSORDATA );
ee_writeDataToFlash ( & g_fm , & g_float , sizeof ( g_float ), G_FLOAT );
/* 将数据读出 */
ee_readDataFromFlash ( & g_fm , & dataTmp , G_MYSENSORDATA );
ee_readDataFromFlash ( & g_fm , & ftmp , G_FLOAT );
/* 将G_FLOAT管理的数据改成g_txt */
ee_writeDataToFlash ( & g_fm , g_txt , strlen ( g_txt ) + 1 , G_FLOAT );
/* 再读取一次数据 */
dataTmp = 0 ;
ee_readDataFromFlash ( & g_fm , & dataTmp , G_MYSENSORDATA );
ee_readDataFromFlash ( & g_fm , & tt , G_FLOAT );
}يمكن أن يتحول الفلاش إلى 1 إلى 0 فقط ، ويمكنه فقط تحويل 0 إلى 1 عن طريق محو قطاع بأكمله (الحد الأدنى لهيكل التخزين من الفلاش). لذلك ، إذا تمت كتابة عنوان مكتوب ، إذا تمت كتابته مرة أخرى ، فسوف يتسبب حتماً في أن يصبح البت الذي أصبح 0 1 ، مما يؤدي إلى إبطال البيانات.
فكرة هذا البرنامج هي كتابة البيانات التي تريد إعادة كتابتها إلى المنطقة التي لم تتم كتابتها لاحقًا. سيتم إبطال البيانات المكتوبة من قبل وسيتم اعتبار أحدث البيانات المكتوبة صالحة. انتظر حتى تصبح المنطقة بأكملها ممتلئة ، وقم بنقل البيانات الصالحة إلى منطقة أخرى ، ثم محو جميع المساحة الحالية.
مخطط الهيكل الداخلي للفلاش التي ينفذها البرنامج:

بعد إجراء فلاش تنسيق void ee_flashInit() ، يتم عرض تخطيط فلاش منسق في الشكل أعلاه.
إجمالي مساحة الفهرس: يحتوي على منطقتين ومنطقة المؤشر ومنطقة إعادة الكتابة
منطقة الفهرس : بنية الفهرس المستخدمة لتخزين كل بيانات. يتم إصلاح موضع عنوان كل بنية فهرس. على سبيل المثال ، عنوان البيانات رقم 1 هو 0x00 ، ثم عنوان البيانات رقم 2 هو 0x08. يمكن للمستخدم تحديد حجم منطقة الفهرس. بالنسبة لمواصفات الحجم ، يرجى الرجوع إلى الصيغة التالية: عدد البيانات التي يمكن تخزينها في منطقة الفهرس = إجمالي عدد البايتات في منطقة الفهرس/8
/* 数据索引结构 */
typedef struct
{
/* 当前数据状态 */
ee_uint16 dataStatus ;
/* 当前数据大小 */
ee_uint16 dataSize ;
/* 当前数据在数据区的地址(相对于dataStartAddr的偏移地址) */
ee_uint16 dataAddr ;
/* 当前数据被重写的地址(相对于overwriteAddr的偏移地址),默认为0xFFFF */
ee_uint16 dataOverwriteAddr ;
} ee_dataIndex ;منطقة إعادة كتابة : عند إعادة كتابة البيانات الموجودة في منطقة فهرس البيانات ، يتم حفظ بنية فهرس إعادة الكتابة في المنطقة الحالية
إعادة كتابة منطقة العد : تلقائيًا تلقائيًا من قبل البرنامج ، ولا يحتاج المستخدم إلى العناية. تسجل هذه المنطقة عدد المرات التي تمت فيها كتابة منطقة إعادة الكتابة الحالية ، وتستخدم لتحديد الموقع المجاني لمنطقة إعادة الكتابة.
منطقة البيانات: احفظ القيمة الفعلية التي نقوم بتخزينها في Flash. يتم إدارة الحجم والقراءة والكتابة عنوان الإزاحة لكل قيمة بواسطة بنية الفهرس لمنطقة الفهرس.
منطقة التبادل : عندما تكون منطقة النشاط ممتلئة ، يتم نقل جميع فهارس البيانات الصالحة لمنطقة النشاط إلى هذه المنطقة كمنطقة نشاط ، وفي الوقت نفسه ، قم بمسح منطقة النشاط السابقة واستخدامها كمنطقة النشاط التالية.
إدارة الحالة :
تُستخدم إدارة الدولة للتعامل مع العديد من الظواهر غير الطبيعية لمرتبات متحكم ، مثل انقطاع التيار الكهربائي للموكاء الدقيق عند تشغيل فلاش.