EEPROM 是 8051 嵌入式开发中非常常见的非易失性存储器件,可以用于保存配置参数、计数值、设备状态等数据。
本次 HRTOS 基础示例增加24C02 EEPROM + 4位数码管显示案例,通过 24C02 保存一个计数值,并使用 HRTOS 任务完成 EEPROM 数据读取、加1、写回以及数码管显示。
这个示例还可以直观体现 EEPROM 的一个重要特点:
数据掉电后仍然能够保存。
一、示例实现的功能
程序使用 24C02 的0x00地址保存数据。
系统运行后:
读取 EEPROM 数据 ↓ 数据 +1 ↓ 写回 EEPROM ↓ 数码管显示当前数据 ↓ 等待 ↓ 继续下一次显示范围为:
0000 ~ 0255例如 EEPROM 当前保存50,数码管显示:
0050重新上电后,程序再次读取 EEPROM 中的数据,之前保存的数据不会因为断电而消失。
二、EEPROM读写任务
EEPROM 的读写由task_eeprom()独立完成。
首先读取 24C02 中保存的数据:
eeprom_value = eeprom_24c02_read(0x00);随后等待一段时间,再将数据加 1:
eeprom_value++;然后写回 EEPROM:
eeprom_24c02_write(0, eeprom_value);最后再次延时,然后开始下一轮操作。
因此,程序会不断对 EEPROM 中保存的数值进行递增。
这里使用os_delay()让任务在读写操作之间进行等待,也体现了 HRTOS 在外设操作场景中的基本使用方式。
三、为什么需要考虑EEPROM写入间隔
EEPROM 与普通 RAM 不同。
写入 EEPROM 是一个实际的非易失性存储操作,因此在应用设计中通常需要考虑写入周期以及写入频率。
本示例在 EEPROM 操作之间加入了:
os_delay(100);避免连续进行过于紧密的写入操作。
对于实际项目而言,如果 EEPROM 用于保存配置参数或者运行数据,还可以进一步根据具体器件特性设计更加完善的写入策略,例如减少不必要的重复写入。
本示例主要用于展示 24C02 的基本读写流程,因此保持了代码结构的简单性。
四、数码管显示任务
另一个 HRTOS 任务负责显示当前 EEPROM 数据。
程序获取当前的:
eeprom_value然后将数据拆分为四位,通过数码管进行显示。
例如:
0 → 0000 1 → 0001 50 → 0050 100 → 0100 255 → 0255对应代码通过:
drv_seg_display()分别控制四位数码管。
这样 EEPROM 中保存的数据变化过程就能够直观地显示出来。
五、两个任务进行功能分工
整个示例依然采用 HRTOS 的任务化结构:
HRTOS │ ├── task_eeprom │ ├── 读取24C02 │ ├── 数据+1 │ ├── 写入24C02 │ └── 延时 │ └── task_seg_display └── 显示当前数据EEPROM 任务负责数据存储。
数码管任务负责数据显示。
两个任务分别完成不同功能,由 HRTOS 负责统一调度。
这种结构也方便后续继续扩展功能。
六、断电后数据仍然存在
这个示例最直观的实验现象就是掉电保存。
例如第一次运行时:
EEPROM = 0000程序读取后加 1:
EEPROM = 0001再次运行:
EEPROM = 0002继续运行:
0003 0004 0005 ...如果此时关闭开发板电源,再重新上电,程序不会从0000重新开始,而是会读取 24C02 中之前保存的数据继续运行。
这也是 EEPROM 与 RAM 最明显的区别之一。
七、这个示例可以用于哪些实际场景
虽然本例只是一个简单的计数实验,但它对应的技术在实际 8051 项目中非常常见。
例如:
保存设备配置参数;
保存设备地址;
保存运行模式;
保存校准参数;
保存累计运行次数;
保存设备状态;
保存掉电需要保留的数据。
因此,通过这个简单示例,可以进一步理解 HRTOS 与非易失性存储器结合使用的基本方式。
八、HRTOS基础示例持续完善
目前 HRTOS 的基础示例正在持续扩充。
这些示例并不是单纯为了展示代码数量,而是尽量覆盖 8051 开发中经常使用的基础外设和功能。
目前已经可以围绕不同硬件逐步构建:
GPIO PWM 继电器 数码管 EEPROM 传感器 串口 通信 ...同时结合 HRTOS 的:
任务 延时 调度 同步 消息 驱动 Shell形成更加完整的实际应用案例。
对于开发者而言,可以直接从基础示例入手,逐步了解 HRTOS 在真实 8051 项目中的使用方式。
HRTOS 也会继续对这些基础示例进行维护、整理和实际硬件验证。
持续维护,持续验证,持续完善。