芯科蓝牙BG27开发笔记8-片上Flash读写

目标

熟悉片上Flash的特点,知道如何使用,最好找到示例代码,有完整例程那是最好的

查找参考手册

除了768K的主空间,还包含:

1. USERDATA区域,用户定义数据,可以读写。大小只有1K。

2. 设备特性和识别信息的DEVINFO空间

3. 内部生产测试和校准信息的CHIPCONFIG。


RAM有两个部分:

RAM0:共64K,0x20000000 - 0x2000FFFF

SEQRAM:应该是RF状态机需要的,如果不使用RF,可以用作其他。

主flash,768K:

最小擦除单元1页,8K大小。

10K擦除寿命。

查找蓝牙api.h

目前不知道这该如何使用,暂且不考虑。


/*** @addtogroup sl_bt_nvm NVM* @{** @brief NVM** Provide an interface to manage user data objects (key/value pairs) in the* flash memory. User data stored within the flash memory is persistent across* reset and power cycling of the device. Because Bluetooth bondings are also* stored in the flash area, in addition to the flash storage size, the space* available for user data also depends on the number of bondings the device has* at the time.** On EFR32[B|M]G1x devices, either PS Store or NVM3 data storage driver can be* used. PS Store is supported by the Bluetooth stack only. Using NVM3 is* recommended if the device needs to support Dynamic Multiple Protocol (DMP).* On EFR32[B|M]G2x devices, only NVM3 is supported. When NVM3 is used,* applications can also use the NVM3 APIs directly.** In PS Store, the flash storage size is fixed at 2048 bytes. The maximum data* object size associated to a key is 56 bytes. A Bluetooth bonding uses at* maximum 138 bytes for secure connections and 174 bytes for legacy pairing.** In NVM3, the flash store size is configurable and the minimum is 3 flash* pages. The maximum data object size is configurable up to 4096 bytes. A* Bluetooth bonding uses maximum 110 bytes for secure connections and 138 bytes* for legacy pairing. For more details, see AN1135 "Using Third Generation* NonVolatile Memory (NVM3) Data Storage".*//* Command and Response IDs */
#define sl_bt_cmd_nvm_save_id                                        0x020d0020
#define sl_bt_cmd_nvm_load_id                                        0x030d0020
#define sl_bt_cmd_nvm_erase_id                                       0x040d0020
#define sl_bt_cmd_nvm_erase_all_id                                   0x010d0020
#define sl_bt_rsp_nvm_save_id                                        0x020d0020
#define sl_bt_rsp_nvm_load_id                                        0x030d0020
#define sl_bt_rsp_nvm_erase_id                                       0x040d0020
#define sl_bt_rsp_nvm_erase_all_id                                   0x010d0020/*** @addtogroup sl_bt_nvm_keys Defined Keys* @{** Define keys*//** Crystal tuning value override */
#define SL_BT_NVM_KEY_CTUNE 0x32      /** @} */ // end Defined Keys/***************************************************************************//**** Store a value into the specified NVM key. Allowed NVM keys are in range from* 0x4000 to 0x407F. At most, 56 bytes user data can be stored in one NVM key.* The error code 0x018a (command_too_long) is returned if the value data is* more than 56 bytes.** @param[in] key NVM key* @param[in] value_len Length of data in @p value* @param[in] value Value to store into the specified NVM key** @return SL_STATUS_OK if successful. Error code otherwise.*******************************************************************************/
sl_status_t sl_bt_nvm_save(uint16_t key,size_t value_len,const uint8_t* value);/***************************************************************************//**** Retrieve the value of the specified NVM key.** @param[in] key NVM key of the value to be retrieved* @param[in] max_value_size Size of output buffer passed in @p value* @param[out] value_len On return, set to the length of output data written to*   @p value* @param[out] value The returned value of the specified NVM key** @return SL_STATUS_OK if successful. Error code otherwise.*******************************************************************************/
sl_status_t sl_bt_nvm_load(uint16_t key,size_t max_value_size,size_t *value_len,uint8_t *value);/***************************************************************************//**** Delete a single NVM key and its value from the persistent store.** @param[in] key NVM key to delete** @return SL_STATUS_OK if successful. Error code otherwise.*******************************************************************************/
sl_status_t sl_bt_nvm_erase(uint16_t key);/***************************************************************************//**** Delete all NVM keys and their corresponding values.*** @return SL_STATUS_OK if successful. Error code otherwise.*******************************************************************************/
sl_status_t sl_bt_nvm_erase_all();/** @} */ // end addtogroup sl_bt_nvm

在ssv5的文档中搜索“flash”:

找到两篇文档:

ug103-07-non-volatile-data-storage-fundamentals-断电存储

an1135-using-third-generation-nonvolatile-memory-NVM3使用方法

上图有多个flash操作库,但是BG27只能选择NVM3。如何使用NVM3在文档中有说明,不过为什么就没有一个简单的例程直接开箱即用呢???

查阅文档:

NVM3 - NVM Data Manager - v3.1 - Gecko Platform API Documentation Silicon Labs

结合A1115文档阅读;

以上文档说明已很充足,上图examples中也有少量代码:

【Example 1 shows initialization, usage of data objects and repacking.】#include "nvm3.h"
#include "nvm3_hal_flash.h"// Create a NVM area of 24kB (size must equal N * FLASH_PAGE_SIZE, N is integer). Create a cache of 10 entries.
NVM3_DEFINE_SECTION_STATIC_DATA(nvm3Data1, 24576, 10);// This macro creates the following:
// 1. An array to hold NVM data named nvm3Data1_nvm
// 2. A section called nvm3Data1_section containing nvm3Data1_nvm. The application linker script must place this section correctly in memory.
// 3. A cache array: nvm3Data1_cachevoid nvm3_example_1(void)
{// Declare a nvm3_Init_t struct of name nvm3Data1 with initialization data. This is passed to nvm3_open() below.NVM3_DEFINE_SECTION_INIT_DATA(nvm3Data1, &nvm3_halFlashHandle);nvm3_Handle_t handle;Ecode_t status;size_t numberOfObjects;unsigned char data1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };unsigned char data2[] = { 11, 12, 13, 14, 15 };uint32_t objectType;size_t dataLen1;size_t dataLen2;status = nvm3_open(&handle, &nvm3Data1);if (status != ECODE_NVM3_OK) {// Handle error}// Get the number of valid keys already in NVM3numberOfObjects = nvm3_countObjects(&handle);// Skip if we have initial keys. If not, generate objects and store// persistently in NVM3 before proceeding.if (numberOfObjects < 2) {// Erase all objects and write initial data to NVM3nvm3_eraseAll(&handle);nvm3_writeData(&handle, 1, data1, sizeof(data1));nvm3_writeData(&handle, 2, data2, sizeof(data2));}// Find size of data for object with key identifier 1 and 2 and read outnvm3_getObjectInfo(&handle, 1, &objectType, &dataLen1);if (objectType == NVM3_OBJECTTYPE_DATA) {nvm3_readData(&handle, 1, data1, dataLen1);}nvm3_getObjectInfo(&handle, 2, &objectType, &dataLen2);if (objectType == NVM3_OBJECTTYPE_DATA) {nvm3_readData(&handle, 2, data2, dataLen2);}// Update and write back datadata1[0]++;data2[0]++;nvm3_writeData(&handle, 1, data1, dataLen1);nvm3_writeData(&handle, 2, data2, dataLen2);// Do repacking if neededif (nvm3_repackNeeded(&handle)) {status = nvm3_repack(&handle);if (status != ECODE_NVM3_OK) {// Handle error}}
}【Example 2 shows initialization and usage of counter objects. The counter object uses a compact way of storing a 32-bit counter value while minimizing NVM wear.】#include "nvm3.h"
#include "nvm3_hal_flash.h"// Create a NVM area of 24kB (size must equal N * FLASH_PAGE_SIZE, N is integer). Create a cache of 10 entries.
NVM3_DEFINE_SECTION_STATIC_DATA(nvm3Data2, 24576, 10);#define USER_KEY        1// This macro creates the following:
// 1. An array to hold NVM data named nvm3Data2_nvm
// 2. A section called nvm3Data2_section containing nvm3Data2_nvm. The application linker script must place this section correctly in memory.
// 3. A cache array: nvm3Data2_cachevoid nvm3_example_2(void)
{// Declare a nvm3_Init_t struct of name nvm3Data2 with initialization data. This is passed to nvm3_open() below.NVM3_DEFINE_SECTION_INIT_DATA(nvm3Data2, &nvm3_halFlashHandle);nvm3_Handle_t handle;Ecode_t status;uint32_t counter = 1;status = nvm3_open(&handle, &nvm3Data2);if (status != ECODE_NVM3_OK) {// Handle error}// Erase all objectsnvm3_eraseAll(&handle);// Write first counter value with key 1nvm3_writeCounter(&handle, USER_KEY, counter);// Increment the counter by 1 without reading out the updated valuenvm3_incrementCounter(&handle, USER_KEY, NULL);// Read the counter valuenvm3_readCounter(&handle, USER_KEY, &counter);
}

找到现成的示例

可以通过检索关键词来查找使用到nvm3接口的代码,是否有一个完整例程存在?

检索词可以用,nvm3_open,nvm3_readData

但是前提是,要有例程源码存在。

一般情况,如nordic,提供了例程包,例程分为两部分:

1. 裸机例程

2. 蓝牙应用例程

在此之前,我认为芯科的例程是在ssv5 IDE中,需要自己创建才会自动生成;还有技术支持(第三方)发了一个裸机驱动包,这个我知道都是芯科官方github上有的。

经过查找,参考本帖《补充资料》,可知两个包的地址:

GitHub - SiliconLabs/bluetooth_applications: Bluetooth wireless applications. Go to https://github.com/SiliconLabs/application_examples

GitHub - SiliconLabs/peripheral_examples: Simple peripheral examples for Silicon Labs EFM32/EFR32 Series 0, Series 1, and Series 2 devices

在蓝牙例程文件夹检索关键词,选定蓝牙温控器这个例程继续阅读:

补充资料

SDK的API文档:

Gecko Platform - v3.1 - Gecko Platform API Documentation Silicon Labs

蓝牙协议栈API文档:

General Overview - v4.0 - Bluetooth API Documentation Silicon Labs

这两份文档内容很多,也很系统,有助于理解一些基本的概念。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/133278.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国际版腾讯云/阿里云:全站加快有哪些功用?有哪些优势?适用于什么场景?

腾讯云全站加快有哪些功用&#xff1f;有哪些优势&#xff1f;适用于什么场景&#xff1f; 产品功用 全站加快 ECDN 经过在全球各区域部署加快节点&#xff0c;有用下降跨国拜访推迟&#xff0c;保证全球加快作用。 最优链路 各加快节点两两相连&#xff0c;实时勘探&#xff0…

初识操作系统

1.操作系统的概念 操作系统(Operating System&#xff0c;OS&#xff09;是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配; 以提供给用户和其他软件方便的接口和环境; 它是计算机系统中最基本的系统软件。 操作系统的特…

1-FPGA硬件加速-YUV_YCbCr

这是对《基于Matlab与FPGA的图像处理教程》的学习笔记&#xff0c;代码和内容摘取自书中。 心得&#xff1a; 使用FPGA进行硬件加速的重点是消除或者减少浮点数运算&#xff0c;转换为定点运算&#xff0c;然后通过pipeline流水设计转为并行实现加速。 原理和方法 RGB与&…

【Spring面试】四、Bean的生命周期、循环依赖、BeanDefinition

文章目录 Q1、Bean有哪些生命周期回调方法&#xff1f;有哪几种实现方式&#xff1f;Q2、Spring在加载过程中Bean有哪几种形态Q3、解释下Spring框架中Bean的生命周期Q4、Spring是如何解决Bean的循环依赖的Q5、Spring是如何帮我们在并发下避免获取不完整的Bean的&#xff1f;Q6、…

基于springboot+vue的大学生智能消费记账系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

【电源专题】案例:异常样机为什么只在40%以下电量时与其他样机显示电量差异10%,40%以上电量差异却都在5%以内。

本案例发生在一个量产产品的测试中,因为产品带电池,所以需要测试产品对于电池电量显示的精确程度。产品使用的是最简单的开路电压查表法进行设计。 案例测试报告的问题在于不同样机之间电量百分比存在差异,大部分是在3%~4%之间。但在7.2V电压时,能够差异10%左右。 在文章:…

ESIM实战文本匹配

引言 今天我们来实现ESIM文本匹配&#xff0c;这是一个典型的交互型文本匹配方式&#xff0c;也是近期第一个测试集准确率超过80%的模型。 我们来看下是如何实现的。 模型架构 我们主要实现左边的ESIM网络。 从下往上看&#xff0c;分别是 输入编码层(Input Ecoding) 对前…

【Android知识笔记】进程通信(二)

一、Binder对象是如何跨进程传递的 binder传递有哪些方式?binder在传递过程中是怎么存储的?binder对象序列化和反序列化过程?binder对象传递过程中驱动层做了什么?总结 Binder 对象的跨进程传递主要靠 Parcel 的两个关键方法 writeStrongBinder() 和

nvm 一个nodejs版本管理工具

nvm 一个nodejs版本管理工具 NVM是什么 nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm和n都是node.js版本管理工具&#xff0c;为了解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js NVM下载 可在点此在…

vueshowpdf 移动端pdf文件预览

1、安装 npm install vueshowpdf -S2、参数 属性说明类型默认值v-model是否显示pdf--pdfurlpdf的文件地址String- scale 默认放大倍数 Number1.2 minscale 最小放大倍数 Number0.8 maxscale 最大放大倍数 Number2 3、事件 名称说明回调参数closepdf pdf关闭事件-pdferr文…

jmeter接口测试及详细步骤以及项目实战教程

在接口测试项目实战中&#xff0c;JMeter是一款非常强大和流行的自动化测试工具&#xff0c;它可以测试各种类型的应用程序&#xff0c;并通过采样和报告来识别性能瓶颈和API的问题。本文将为你提供一个基于实际项目的JMeter接口测试项目实战教程&#xff0c;指导你如何使用JMe…

潍坊科技学院图书馆藏《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

潍坊科技学院图书馆藏《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

金融行业的软件测试分析

随着金融行业的业务不断增加&#xff0c;金融交易模式的不断变化&#xff0c;金融机构对信息化的要求也越来越高&#xff0c;高质量的金融软件对于金融机构来说显得尤为重要。如何保证金融行业软件的质量&#xff0c;对金融行业软件的测试人员来说&#xff0c;也提出了更高的要…

Python进阶教学——多线程高级应用

目录 一、线程间的通讯机制 二、线程中的消息隔离机制 三、线程同步信号量 四、线程池和进程池 一、线程间的通讯机制 1、Queue消息队列 消息队列是在消息的传输过程中保存消息的容器&#xff0c;主要用于不同线程间任意类型数据的共享。消息队列最经典的用法就是消费者和…

Lua脚本

基本语法 注释 print(“script lua win”) – 单行注释 – [[ 多行注释 ]] – 标识符 类似于&#xff1a;java当中 变量、属性名、方法名。 以字母&#xff08;a-z,A-Z&#xff09;、下划线 开头&#xff0c;后面加上0个或多个 字母、下划线、数字。 不要用下划线大写字母…

变压器寿命预测(python代码,Logistic Regression模型预测效果一般,可以做对比实验)

1.数据来源官网&#xff1a;Data for: Root cause analysis improved with machine learning for failure analysis in power transformers - Mendeley Data 点Download All 10kb即可下载数据 2.下载下来后是这样 每一列的介绍&#xff1a; Hydrogen 氢气&#xff1b; Oxyge…

01目标检测-问题引入

目录 一、目标检测问题定义 二、目标检测过程中的常见的问题 三、目标检测VS图像分类区别 目标检测&#xff1a; 图像分类&#xff1a; 总结&#xff1a; 四、目标检测VS目标分割 目标分割&#xff1a; 目标检测是计算机视觉领域的一个重要任务&#xff0c;旨在从图像或…

DBeaver 下载、安装与数据库连接(MySQL)详细教程【超详细,保姆级教程!!!】

本文介绍DBeaver 下载、安装与数据库连接&#xff08;MySQL&#xff09;的详细教程 一、DBeaver 下载 官网下载地址&#xff1a;https://dbeaver.io/download/ 二、安装 1、双击下载的安装包&#xff0c;选择中文 2、点击下一步 3、点击我接受 4、如下勾选&#xff0c;…

Linux中使用Docker安装ElasticSearch7.10.x集群

使用Docker安装ElasticSearch7.10.x单节点请访问这里 一、集群环境说明 服务器IP地址192.168.137.1&#xff0c;192.168.137.2&#xff0c;192.168.137.3 二、前期准备 1. 拉取镜像 docker pull elasticsearch:7.10.12. 首先需要创建一个用于生成秘钥的初始容器&#xff0…

面试官:我们深入聊聊Java虚拟机吧

哈喽&#xff01;大家好&#xff0c;我是奇哥&#xff0c;一位专门给面试官添堵的职业面试员 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】更有我为大家准备的福利哟&#xff01; 文章目录 前言面试Java虚拟机内存模型垃圾收集器…