应用例程:用两片外置EEPROM(AT24C32)实现参数的冗余保存


基本信息

在STM32F103RCT6核心板最小系统的基础上,添加OLED液晶屏显示,并可以通过按键编辑两个参数:报警压力、报警液位。通过NvM模块,将这两个参数保存在两块不同的AT24C32芯片上。修改好参数后断电重启,观察参数是否保持不变。断开其中任意一块AT24C32的通讯线(模拟通讯故障),然后重新上电,观察参数是否依然保持不变

视频下载

暂无

实验硬件

STM32F103RCT6核心板(1块)[ 购买 ]

CH340E通讯小板(1块)[ 购买 ]

Micro-USB通讯线(1根)[ 购买 ]

OLED屏SSD1306(1块)[ 购买 ]

8输入独立按键模块(1块)[ 购买 ]

时钟与存储模块(2块)[ 购买 ]

电路参考

  • CH340E通讯小板通过Micro-USB通讯线到连接电脑。
  • CH340E通讯小板连接STM32F103xC核心板
    CH340E通讯小板GND----GNDP4端子STM32F103xC核心板
    +5V----5V
    TXD----RX
    RXD----TX
  • OLED屏插入STM32F103xC核心板的P5端子。
    OLED屏SSD1306GND----GNDP5端子STM32F103xC核心板
    VCC----V3
    D0----PB3
    D1----PB5
    RES----PD2
    DC----PA15
    CS----PC12
  • 8输入独立按键模块连接STM32F103xC核心板
    8输入独立按键模块G----GNDP1端子STM32F103xC核心板
    K7----PA4
    K5----PA5
    K3----PA6
    K1----PA7
  • 时钟与存储模块A连接STM32F103xC核心板
    时钟与存储模块AGND----GNDP3端子STM32F103xC核心板
    VCC----V3
    SDA----PB7P2端子
    SCL----PB6
  • 时钟与存储模块B连接STM32F103xC核心板
    时钟与存储模块BGND----GNDP3端子STM32F103xC核心板
    VCC----V3
    SDA----PB11P1端子
    SCL----PB10

关键配置说明

添加NvM蓝图,然后在蓝图中分别添加以下模块:

  • NvM_Fe:NvM的用户接口,提供梯形图指令与系统块配置(PLC变量的掉电保持)。
  • NvM:非易失存储管理,可以为每个需要保存的数据块创建若干冗余块,在每个冗余块中指定需要保存的位置和保存的份数。
  • MemIf:内存存储接口,NvM需要在MemIf中分配冗余块空间,并调用MemIf的接口完成冗余块的读取和写入。
  • AT24_Eep:这里虽然使用两个AT24C32芯片来保存数据,因为都是AT24系列的芯片,因此MemIf后面只需要管理本模块即可。
  • I2c:I2C通讯驱动,管理若干I2C通讯设备和负责通讯任务的调度。因为两个时钟与存储模块的硬件完全一致,因此EEPROM芯片AT24C32的I2C从机地址也是一样的,这里只能分别将模块挂在不同的I2C总线上。
  • I2C1_I2cL:单片机I2C1的底层驱动。
  • I2C2_I2cL:单片机I2C2的底层驱动。
  • I2C_I2cLI:I2C通讯的底层实现。

在蓝图中选择模块I2C1_I2cL,确定I2C通讯管脚为PB6、PB7。

在蓝图中选择模块I2C2_I2cL,确定I2C通讯管脚为PB10、PB11。

在蓝图中选择模块I2c,在配置节点Device下面添加I2C通讯设备Device0和Device1,对应的底层分别为I2C1_I2cL、I2C2_I2cL。

在蓝图中选择模块AT24_Eep,在配置节点Chip下面添加两个存储芯片Chip0和Chip1。两个芯片的配置完全一样,芯片型号都是AT24C32,芯片地址都是0xA0。

在蓝图中重新选择模块I2c,查看系统自动生成的两个通讯任务:AT24_Eep_Chip0_I2c和AT24_Eep_Chip1_I2c。通讯速率都是100KHz,占空比是1:1。不同的是,Chip0使用的通讯设备是Device0,Chip1使用的通讯设备是Device1。

在蓝图中选择模块NvM_Fe,在配置节点Block下面添加一个用户可操作的数据块Block0。

在蓝图中选择模块NvM,查看系统自动生成的存储块NvM_Fe_Block0,修改大小为64字节。

在配置节点NvM_Fe_Block0下面,创建两个数据冗余块R0和R1。使用的底层都是Eep,模块都是AT24_Eep,每次写数据的份数为1,历史记录保留的份数为1。不同点在于,R0存放的存储芯片是Chip0,而R1存放的存储芯片是Chip1。

重新编译系统,在蓝图中选择模块MemIf,配置节点选择Block,查看系统生成的存储空间与地址分配。

输入输出和OLED屏的配置可参考下面的例程:

应用程序

梯形图

NETWORK 0 将参数编辑按键信息送入OLED液晶屏

NETWORK 1 启动时,利用启动信号SM0.1进行内存块的读操作,初始化变量VW100和VW102

NETWORK 2 M0.0每过200毫秒闭合一次

NETWORK 3 用M0.0触发数据保存操作,将VB100 ~ VB163写入存储块Block0

液晶屏配置

实验步骤

  • 将配置上传到服务器,固件下载到STM32F103xC核心板。
  • 通过按键(K7:上、K5:下,K3:修改,K1:确认),修改OLED屏上的两个参数:报警压力、报警液位。
  • 给核心板断电后再重新上电,观察参数是否保持。
  • 断开时钟与存储模块A或者是B的通讯,再给核心板重新上电,观察参数是否保持。

指令说明

补充说明

使用MemIf模块,在数据有效性上提供了下列支持:

  • AT24_Eep模块通过SPI总线读取数据时,可重读一次,两次数据一致,才认为读取数据没有发生干扰。
  • AT24_Eep模块通过SPI总线写入数据时,可回读一次,回读数据与写入数据一次,才认为写入数据没有发生干扰。
  • AT24_Eep模块写入数据时,会按照最小写入单元先读取数据,比较写入数据与读取数据是否一致,如果一致,则忽略此单元的操作。

使用NvM模块,在数据有效性上提供了下列支持:

  • NvM为每个数据块在MemIf中创建了数据头和数据体,数据头记录数据的新旧和校验,确保数据的有效性。
  • NvM为每个数据块提供数据冗余的功能,数据可以在不同的存储介质中保存多份,以备不测。
  • NvM为每个数据块提供历史记录的功能,即使最后的存储发生了问题,NvM依然能够在记录中找到最新的有效数据。

相关下载