应用例程:用外置FLASH(W25Q16)实现参数保存


基本信息

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

视频下载

暂无

实验硬件

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

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

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

OLED屏SSD1306(1块)[ 购买 ]

8输入独立按键模块(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

关键配置说明

添加蓝图MemIf,在蓝图中添加内存存储模块MemIf、外置FLASH驱动模块W25Q_Fls。如果已经配置了OLED液晶屏,那么SPI通讯相关的模块已经添加。在电路上,外置FLASH的SPI通讯与OLED液晶屏的SPI通讯是同一路,用不同的片选管脚进行分时复用。

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

在蓝图中选择模块Spi,在配置节点Job下面查看系统自动添加的通讯任务:W25Q_Fls_Chip0_Spi。确认通讯设备是Device0,片选管脚是PC9。

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

编译系统,MemIf_Fe会在MemIf模块中添加相关的节点。在蓝图中选择模块MemIf,配置节点中选择Block,观察是否已经添加了两个存储块。在配置界面可以查看系统生成的存储块地址分配。因为W25Q16的最小擦除单元是4K字节,为了两个块可以独立操作,Block1并没有紧随Block0分配地址,而是分配在了下一个可独立擦除单元上,地址是4K对齐的。

输入输出和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模块,在数据有效性上提供了下列支持:

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

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

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

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

相关下载