应用例程:用外置EEPROM(AT24C32)实现参数保存


基本信息

在STM32F103RCT6核心板最小系统的基础上,添加OLED液晶屏显示,并可以通过按键编辑2个参数:报警压力、报警液位。添加MemIf蓝图,通过时钟与存储模块上的AT24C32保存这两个参数,修改好参数后断电重启,观察参数是否保持不变。

视频下载

暂无

实验硬件

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

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

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

OLED屏SSD1306(1块)[ 购买 ]

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

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

电路参考

  • 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
  • 时钟与存储模块连接STM32F103xC核心板
    时钟与存储模块GND----GNDP3端子STM32F103xC核心板
    VCC----V3
    SDA----PB7P2端子
    SCL----PB6

关键配置说明

添加蓝图MemIf,在蓝图中添加内存存储模块MemIf、外置EEPROM驱动模块AT24_Eep、I2C通讯驱动模块I2c、I2C通讯底层模块I2C1_I2cL、I2C通讯底层实现模块I2C_I2cLI。

在蓝图中选择模块I2C1_I2c,在配置节点中选择Pin,确认使用的单片管脚是否为PB6、PB7。

在蓝图中选择模块I2c,在配置节点Device中,创建通讯设备Device0,使用的通讯底层为I2C1_I2cL。

在蓝图中选择模块AT24_Eep,在配置节点Chip下面添加存储芯片Chip0。选择芯片型号为AT24C32。

在蓝图中选择模块I2c,在配置节点Job下面查看系统自动添加的通讯任务:AT24_Eep_Chip0_I2c。确认通讯设备是Device0,通讯速率时100Kbit/s,占空比为1:1。

在蓝图中选择模块MemIf_Fe,在配置节点Block下面添加用户存储块Block0、Block1。两个存储块对应的底层类型是Eep,操作的芯片是模块AT24_Eep下面的Chip0。Block0的大小是64个字节,Block1的大小是256个字节。

编译系统,MemIf_Fe会在MemIf模块中添加相关的节点。在蓝图中选择模块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屏上的两个参数:报警压力、报警液位。

  • 给核心板断电后再重新上电,观察参数是否保持。

指令说明

补充说明

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

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

使用MemIf模块,依然存在数据失效的下列风险:

  • MemIf不提供数据校验功能,写入和读出的数据总是原始值。
  • MemIf不提供数据冗余的功能,一个存储块对应一个物理地址。
  • 虽然MemIf在写操作时,先进行读比较,从而减少了写数据的次数;但是如果在写数据时发生了掉电,那么存储器中的数据便不是完整的了。MemIf甚至没有校验功能检测这种风险。因此MemIf不适用于数据频繁修改的场合。除非可以在梯形图中检测到掉电信号并在掉电时阻止新的MemIf写操作,同时单片机有足够长的掉电时间处理完正在进行中的MemIf写操作。

如果对数据的有效性有较高的要求,建议使用NvM模块配合MemIf来进行参数的保存。

相关下载