跳到主要内容

内部Flash读写

一、基本概念介绍

Core 在电路板上的单片机芯片中开辟了一块 Flash 区域,专门用来给用户存储一些必要的参数信息。这样您开发的产品如果需要存储的数据量不是太大(仅仅是一些关键的参数)就可以考虑直接用 Core 内部的 Flash,从而省掉 TF 存储卡的成本。

Core 提供 64 个 Number 区域 (Number0 ~ Number63) 和 4 个 String 区域 (String0 ~ String3) 作为存储区域:

  • 每个 Number 区域可以存 1 个 4 字节的 int 型数据。
  • 每个 String 区域可以存 1 个长度在 64 字节内的字符串。

注意1:Core 的 Flash 区域只能写一万次,这是由芯片内的 Flash 特性所决定,所以 Number 区域和 String 区域写入的次数总和不能超过一万次。对于大多数应用而言一万次已经足够,毕竟参数型的信息不会经常修改。

注意2:目前如果 C1 的 Ble蓝牙(C2 无需考虑)功能开启时暂不支持对 Flash 的读写操作,因为 Flash 读写操作会影响蓝牙协议栈的执行。

二、本例程所实现的功能描述

  • 当 BTN1 按键短按后,开始向所选的 Number 区域和 String 区域写入信息。
  • 当 BTN2 按键短按后,开始读出刚刚在对应的 Number 区域和 String 区域写入的信息。

本例中所选择的 Number(0 ~ 2),Number(61 ~ 63), String0,String3,为任意选的,您也可以修改成其他区域来验证。

三、完整代码

--配置USB以虚拟串口模式工作,波特率115200
LIB_UsbConfig("CDC")
--设置按键1(占用D10口)以低电平有效的方式检测按键动作
LIB_ButtonConfig("BTN1","D10","L")
--设置按键2(占用D10口)以低电平有效的方式检测按键动作
LIB_ButtonConfig("BTN2","D11","L")
--开始大循环
while(GC(1) == true)
do
--处理按键事件
btn1_val = LIB_ButtonQuery("BTN1")
--查询按键1是否短按过
if btn1_val == 1 then
print("Start writing flash...\r\n")
--write NumberN
LIB_FlashWriteNumber("0",-12345)
LIB_FlashWriteNumber("1",-1234567)
LIB_FlashWriteNumber("2",-123456789)
LIB_FlashWriteNumber("61",12345)
LIB_FlashWriteNumber("62",1234567)
LIB_FlashWriteNumber("63",123456789)
--write StringN
LIB_FlashWriteString("0","www.shineblink.com")
LIB_FlashWriteString("3","ABC123")
print("Write flash end.\r\n")
end
--处理按键事件
btn2_val = LIB_ButtonQuery("BTN2")
--查询按键2是否短按过
if btn2_val == 1 then
print("Start reading flash...\r\n")
--read NumberN
num = LIB_FlashGetNumber("0")
print(string.format("Number0 = %d\r\n", num))
num = LIB_FlashGetNumber("1")
print(string.format("Number1 = %d\r\n", num))
num = LIB_FlashGetNumber("2")
print(string.format("Number2 = %d\r\n", num))
num = LIB_FlashGetNumber("61")
print(string.format("Number61 = %d\r\n", num))
num = LIB_FlashGetNumber("62")
print(string.format("Number62 = %d\r\n", num))
num = LIB_FlashGetNumber("63")
print(string.format("Number63 = %d\r\n", num))
--read StringN
str = LIB_FlashGetString("0")
print(string.format("String0 = %s\r\n", str))
str = LIB_FlashGetString("3")
print(string.format("String3 = %s\r\n", str))
print("Read flash end.\r\n")
end
end
如果感兴趣,上面代码中出现的LIB开头的库函数可以在 API文档 中通过Ctrl+F查询。

四、代码运行结果

在电脑端运行的调试助手上,我们可以看到如下打印输出信息:

result