中科蓝讯平台读写 flash 操作方法介绍

本篇博文介绍的是在中科蓝讯平台下,针对一些需要掉电记忆的数据,我们要如何操作相应的接口函数以及变量,使得再次上电时能够读取到前一次我们保存的数据值。

首先是找到 bsp_param.h 该文件,文件中定义的是一些需要掉电保存到 flash 中的宏,可在此处自定义增加相关宏。需要注意的是地址值不要设置冲突,需要几个 byte 就选用几个 byte。

#define PARAM_MSC_NUM_SD            0
#define PARAM_MSC_NUM_USB 2
#define PARAM_SYS_VOL 4
#define PARAM_HSF_VOL 5
#define PARAM_LANG_ID 6
#define PARAM_RANDOM_KEY 7 //4Byte随机数
#define PARAM_BT_XOSC_CAP 0x0b //1Byte xosc value
#define PARAM_SYS_MODE 0x0c //系统模式记忆
#define PARAM_MSC_NUM_SD1 0x0d //2BYTE

#define PARAM_MSC_BRKPT_SD 0x10 //10BYTE = frame_count(4byte) + file_ptr(4byte) + fname_crc(2byte)
#define PARAM_MSC_BRKPT_USB 0x1a //10BYTE = frame_count(4byte) + file_ptr(4byte) + fname_crc(2byte)
#define PARAM_MSC_BRKPT_SD1 0x24 //10BYTE = frame_count(4byte) + file_ptr(4byte) + fname_crc(2byte)

#define PARAM_FMRX_CHCUR 0x30
#define PARAM_FMRX_CHCNT 0x31
#define PARAM_FMRX_CHBUF 0x32 //26Byte
#define PARAM_FMTX_FREQ 0x4C //FM TX freq 2 Byte
#define PARAM_ECHO_LEVEL 0x4E //echo level 1 Byte
#define PARAM_ECHO_DELAY 0x4F //echo delay 1 Byte

#define PARAM_MASTER_ADDR_VALID 0x50 //用于记录主耳的地址是否有效
#define PARAM_MASTER_ADDR 0x51 //6BYTE
#define PARAM_NEW_LOCAL_NAME 0x57 //64byte=len+sum+62BYTE

#define PARAM_ANC_MIC0_VAL 0x97 //1Byte,anc mic0 gain
#define PARAM_ANC_MIC1_VAL 0x98 //1Byte,anc mic1 gain
#define PARAM_ANC_NR_STA 0x99 //1Byte,anc nr sta

#define PARAM_VHOUSE_CH_VALID 0x9F //智能充电仓固定耳机声道
#define PARAM_TKEY_PARAM 0xa0 //tkey param 2byte

#define PARAM_FOT_ADDR 0xa2 //4BYTE
#define PARAM_FOT_REMOTE_VER 0xa6 //2BYTE
#define PARAM_FOT_HEAD_INFO 0xa8 //8BYTE
#define PARAM_FOT_HASH 0xb0 //4BYTE

#define RTCRAM_PWROFF_FLAG 63 //软关机的标识放在RTCRAM的最后一BYTE

#define PARAM_QR_ADDR_VALID 0xb4 //用于记录是否有修改过蓝牙地址
#define PARAM_QR_ADDR 0xb5 //使用修改后的蓝牙地址6byte
#define PARAM_BT_NAME_LEN 0xbb //记录蓝牙长度最大值32
#define PARAM_BT_NAME 0xbc //使用新的蓝牙名字32 byte
#define PARAM_RST_FLAG 0xdc //复位标志 1byte

#define PARAM_MIC_ANL_FLG 0xde //用于记录mic的模拟增益值1byte
#define PARAM_MIC_DIG_FLG 0xdf //用于记录mic的数字增益值1byte

#define PARAM_VUART_POPUP_FLAG 0xe5 //用于记录是否打开广播功能 1byte
#define PARAM_ANC_TP_MIC0_VAL 0xe6 //1Byte,anc_tansparency mic0 gain
#define PARAM_ANC_TP_MIC1_VAL 0xe7 //1Byte,anc_tansparency mic1 gain
#define PARAM_QCHECK_CODE 0xe8 //4Byte,程序的快捷校验码

  此外我们需要注意的是 FLASH 和参数区的 SIZE,

#define CM_SIZE            0x5000     //参数区至少 20k

#define CM_START        (FLASH_SIZE - CM_SIZE)

  然后就是如何写 flash 和读 flash 了,在 bsp_param.c 文件中就是相关的接口函数了,有 8\16\32 位的数据读写方式。

#if SYS_PARAM_RTCRAM

#define param_read8(a, b) rtcram_read(a, (u8 *)&b, 1)
#define param_write8(a, b) rtcram_write(a, (u8 *)&b, 1)
#define param_read16(a, b) rtcram_read(a, (u8 *)&b, 2)
#define param_write16(a, b) rtcram_write(a, (u8 *)&b, 2)
#define param_read32(a, b) rtcram_read((a, (u8 *)&b, 4)
#define param_write32(a, b) rtcram_write(a, (u8 *)&b, 4)
#define param_read(a, b, c) rtcram_read(a, b, c)
#define param_write(a, b, c) rtcram_write(a, b, c)
#define param_sync_do()
#else
#define param_read8(a, b) b = cm_read8(PAGE0(a))
#define param_write8(a, b) cm_write8(PAGE0(a), b)
#define param_read16(a, b) b = cm_read16(PAGE0(a))
#define param_write16(a, b) cm_write16(PAGE0(a), b)
#define param_read32(a, b) b = cm_read32(PAGE0(a))
#define param_write32(a, b) cm_write32(PAGE0(a), b)
#define param_read(a, b, c) cm_read(a, PAGE0(b), c)
#define param_write(a, b, c) cm_write(a, PAGE0(b), c)
#define param_sync_do() cm_sync()
#endif

下面介绍其中一种单字节的用法:

写 flash 操作:

  cm_write8(u32 addr, u8 val);    //注意:write 只是写入 cache;

  addr 是待写入的地址值,val 是需要写入的值;

  cm_sync();   //将 write 写入 cache 的内容同步到 spiflash 中;

  注意此接口函数在写入操作后进行调用是必须的,否则写入操作不会生效。

 

读 flash 操作:

  cm_read8(u32 addr);

  addr 是准备读取的地址值,函数返回值是我们读取到的结果值。

  最后再介绍一下中科蓝讯的芯片框架结构:

  芯片内部一般会封装一颗 512K 或 1M SpiFlash,用于存放代码及资源文件/参数记忆等。SpiFlash 和芯片之间通过 spi 接口进行通信。

首先,代码不会直接在 SpiFlash 上运行,SpiFlash 中所有程序及数据均需要先通过 spi 接口加载到芯片 RAM 中,CPU 再从 RAM 中取指令或数据运行。

 

以上就是中科蓝讯平台 FLASH 相关内容的介绍,单字节的读写方法就如上所述,其它类型的操作与之类似。更多的技术问题欢迎大家一起留言探讨,谢谢大家!

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论