前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >蓝牙芯片----BK3431开发笔记------快速入门(2)

蓝牙芯片----BK3431开发笔记------快速入门(2)

作者头像
心跳包
发布于 2021-09-26 08:37:40
发布于 2021-09-26 08:37:40
2.1K00
代码可运行
举报
运行总次数:0
代码可运行

应该是512K,flash.

1.准备工具

BK3431Q开发板、通用联机下载器

2.软件工具

keil arm,版本V5.12以上

通用联机下载器上位机软件Beken_ProgramVer4

二、编译

1.keil的安装

需要在keil官网下载安装support for ARM7/9支持包。

2.编译工程

编译成功后在目录\output\app下,会生成几个bin文件,用联机下载器烧录带CRC的bin文件,如图的bin

三、烧录

1.烧录接口

硬件SPI接口

2.烧录程序

打开联机下载器上位机软件Beken_ProgramVer4.此时界面是灰色的

插上连机下载器后,识别下载器,界面正常

选择SIP CHIP页面

下载成功显示

四、运行

用BLE Tool工具调试

五,调试

1.蓝牙名称在哪里修改

user_config.h里面有两个宏定义

APP_DFLT_DEVICE_NAME

APP_SCNRSP_DATA

修改这两个宏,可以修改蓝牙名称

2.UUID怎么修改?

GATT的用户自定义UUID,是FFF0服务,在fff0s.h下修改一下的三个宏定义,可以修改UUID值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ATT_USER_SERVER_FFF0=ATT_UUID_16(0xFFF0),
ATT_USER_SERVER_CHAR_FFF1=ATT_UUID_16(0xFFF1),
ATT_USER_SERVER_CHAR_FFF2=ATT_UUID_16(0xFFF2),

3.修改UUID读写属性

修改fff0s.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const struct attm_desc fff0_att_db[FFF0S_IDX_NB] =
{
    // FFF0 Service Declaration
    [FFF0S_IDX_SVC]            =   {ATT_DECL_PRIMARY_SERVICE, PERM(RD, ENABLE), 0, 0},

	[FFF0S_IDX_FFF2_LVL_CHAR]  =   {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), 0, 0},
    //  Characteristic Value
    [FFF0S_IDX_FFF2_LVL_VAL]   =   {ATT_USER_SERVER_CHAR_FFF2,PERM(WRITE_COMMAND, ENABLE), PERM(RI, ENABLE), FFF0_FFF2_DATA_LEN *sizeof(uint8_t)},

	// fff1 Level Characteristic Declaration
	[FFF0S_IDX_FFF1_LVL_CHAR]  =   {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), 0, 0},
    // fff1 Level Characteristic Value
    [FFF0S_IDX_FFF1_LVL_VAL]   =   {ATT_USER_SERVER_CHAR_FFF1, PERM(WRITE_COMMAND, ENABLE) , PERM(RI, ENABLE), FFF0_FFF1_DATA_LEN * sizeof(uint8_t)},

	// fff1 Level Characteristic - Client Characteristic Configuration Descriptor
	[FFF0S_IDX_FFF1_LVL_NTF_CFG] = {ATT_DESC_CLIENT_CHAR_CFG,  PERM(RD, ENABLE)|PERM(WRITE_REQ, ENABLE), 0, 0},

};/// Macro used to retrieve permission value from access and rights on attribute.

4.广播间隔修改

修改user_config.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//广播参数配置
/// Advertising channel map - 37, 38, 39
#define APP_ADV_CHMAP           (0x07)
/// Advertising minimum interval - 100ms (160*0.625ms)
#define APP_ADV_INT_MIN         (80)
/// Advertising maximum interval - 100ms (160*0.625ms)
#define APP_ADV_INT_MAX         (80)
/// Fast advertising interval
#define APP_ADV_FAST_INT        (32)

5.连接间隔参数修改

连接间隔关系到蓝牙功耗,广播间隔越大,功耗越小

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//最小连接间隔
#define BLE_UAPDATA_MIN_INTVALUE		10
//最大连接间隔 
#define BLE_UAPDATA_MAX_INTVALUE		10
//连接Latency
#define BLE_UAPDATA_LATENCY				0
//连接超时
#define BLE_UAPDATA_TIMEOUT				600

6.蓝牙连接成功的回调函数

连接成功回调函数是gapc_connection_req_ind_handler,程序运行到这里,说明蓝牙连接成功。

7.蓝牙断开连接回调函数

蓝牙断开回调函数是gapc_disconnect_req_ind_handler,程序运行到这里,说明蓝牙已经断开。

8.蓝牙设备如何发数据到手机端?

以GATT工程为例,FFF0服务中,FFF1为nodify属性,用nodify发送数据到手机。函数app_fff1_send_lvl可以发送数据到手机端。

在app_fff0.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static int fff1_level_upd_handler(ke_msg_id_t const msgid,
                                      struct fff0s_fff1_level_upd_rsp const *param,
                                      ke_task_id_t const dest_id,
                                      ke_task_id_t const src_id)
{
	if(param->status == GAP_ERR_NO_ERROR)
	{
		//uint8_t buf[128];
		//memset(buf, 0xcc, 128);
		//app_fff1_send_lvl(buf, 128);
		app_fff0_env.send_status=0;
	}
	
    return (KE_MSG_CONSUMED);
}

9.如何接受手机发下来的数据?

以GATT工程为例,FFF0的服务中,FFF2为write属性,用write从手机发数据到蓝牙设备

函数接口fff2_writer_req_handler接收数据后,并打印出来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static int fff2_writer_req_handler(ke_msg_id_t const msgid,
                                     struct fff0s_fff2_writer_ind *param,
                                     ke_task_id_t const dest_id,
                                     ke_task_id_t const src_id)
{
    // Drop the message
	UART_PRINTF("FFF2 param->value = 0x ");
	
	for(uint8_t i = 0;i < param->length;i++)
	{
		UART_PRINTF("%02x ",param->fff2_value[i]);
	}
	UART_PRINTF("\r\n");
		
    return (KE_MSG_CONSUMED);
}

10.如何打开芯片的sleep模式

打开芯片的sleep模式,可以大大降低芯片的功耗,但是由于芯片频繁休眠,可能对某些外部响应不及时,比如GPIO中断响应慢,按键检测不及时,UART数据漏数据等等。

在keil工程中,打开rwip_config.h文件,在configuration wizard页面中,把CFG_SLEEP打勾即可打开。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/06/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
K8s源码分析(4)-Resource Model
在上一篇文章中我们主要介绍了 kubernetes 世界中的各种 resource 的 version,其中包括了资源的内部 internal version 和外部非 internal version,以及引入 internal version 来方便各种 resource 持续渐进演化的设计初衷。另外也从源码的角度分析了其中各个资源 group 的对外 version 和 internal version 都定义在哪些源文件之中,在这里我们主要介绍 kubernetes 中各种 resource 的基本定义 model。
TA码字
2021/10/08
5740
深入 kubernetes API 的源码实现
很多同学应该像我一样,第一次打开 Github 上面 kubernetes 项目源码的时候就被各种仓库搞晕了,kuberentes 组织下有很多个仓库,包括 kubernetes、client-go、api、apimachinery 等,该从哪儿仓库看起?kubernetes 仓库应该是 kubernetes 项目的核心仓库,它包含 kubernetes 控制平面核心组件的源码;client-go 从名字也不难看出是操作 kubernetes API 的 go 语言客户端;api 与 apimachinery 应该是与 kubernetes API 相关的仓库,但它们俩为啥要分成两个不同的仓库?这些代码仓库之间如何交互?apimachinery 仓库中还有 api、apis 两个包,里面定义了各种复杂的接口与实现,清楚这些复杂接口对于扩展 kubernetes API 大有裨益。所以,这篇文章就重点关注 api 与 apimachinery 这两个仓库。
米开朗基杨
2021/04/02
1.2K0
Operator示例:通过Operator+CRD实现部署自动化
在上一篇通过Operator自动暴露集群内部服务中,遗留了一个问题:开发人员or业务上游是需要关注k8s内建资源,例如deployment如何定义,这和K8S自动化的目标背道而驰。 本篇文章将采用CRD(CustomResourceDefinition)来屏蔽底层K8S资源,让开发人员只需要按照我们制定的规则来定义CR即可。至于创建deployment,service,ingress等操作就可以交给Operator来完成,从而实现部署自动化。 而自动化就可以对接业务系统,使其实现业务价值。例如根据授权信息,创建租户购买的产品服务,当授权到期时,自动删除对应资源。
Yuyy
2024/01/22
7630
Operator示例:通过Operator+CRD实现部署自动化
图解K8s源码 - k8s核心数据结构
在上一章中阿巩和大家分享了k8s组件之一kube-apiserver,在我自己阅读代码时发现k8s整体结构复杂,而且由于参与的开发者众多代码结构不免有些混乱,我往往容易陷入到某个细节而无法从整体视角梳理流程。在查阅官网文档及相关书籍后,我决定换个思路,先理解k8s核心数据结构设计,这样能够在阅读源码时做到事半功倍。好的,日拱一卒,我们开始吧!
才浅Coding攻略
2022/12/12
1K0
图解K8s源码 - k8s核心数据结构
Kubernetes对象深入学习之二:细说schema.ObjectKind
程序员欣宸
2023/07/10
3390
Kubernetes对象深入学习之二:细说schema.ObjectKind
Controller Runtime 的四种使用姿势
随着云原生生态的不断发展,目前大多数基于 Kubernetes 的云原生技术,几乎都采用了 CRD + Controller 的模式。即使没有自定义 CRD,也会有需要 Controller 来检测自己感兴趣的资源,在其状态发生变更时,做一些业务所需工作。
CS实验室
2022/04/27
3K0
Controller Runtime 的四种使用姿势
Kubernetes对象深入学习之三:对象属性
程序员欣宸
2023/07/24
3010
Kubernetes对象深入学习之三:对象属性
kubebuilder实战之五:operator编码
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章链接 kubebuilder实战之一:准备工作 kubebuilder实战之二:初次体验kubebuilder kubebuilder实战之三:基础知识速览 kubebuilder实战之四:operator需求说明和设计 kubebuilder实战之五:operator编码 kubebuilder实战之六:构建部署运行 kubebuilder实战之七
程序员欣宸
2022/05/06
5310
kubebuilder实战之五:operator编码
kubebuilder实战之四:operator需求说明和设计
Spec是用来保存用户的期望值的,也就是小欣手里的三个参数(docker镜像、单个pod的QPS、总QPS),再加上端口号:
程序员欣宸
2022/05/06
4850
kubebuilder实战之四:operator需求说明和设计
使用code-generator创建crd controller
在 pkg/apis/{GROUP}/{VERSION}/types.go中使用,使用 // +genclient标记对应类型生成的客户端, 如果与该类型相关联的资源不是命名空间范围的(例如PersistentVolume), 则还需要附加 // + genclient:nonNamespaced标记,
有点技术
2020/07/13
3.5K0
k8s自定义controller三部曲之二:自动生成代码
本文是《k8s自定义controller三部曲》的第二篇,上一篇我们在k8s环境注册了API对象Student,此时如果创建Student对象就会在etcd保存该对象信息;
程序员欣宸
2019/05/29
1.3K0
k8s自定义controller三部曲之二:自动生成代码
mac 上学习k8s系列(20)CRD (part II)
Kubernetes目前常使用CRD+Controller的方式扩展API,官方提供了CRD代码的自动生成器code-generator。
golangLeetcode
2022/08/02
7500
mac 上学习k8s系列(22)rbac 源码学习(part II)
kubernetes中角色分为Role和ClusterRole,Role是namespace级别的,ClusterRole是集群级别的。回想下mac 上学习k8s系列(17)rbac 源码学习(part I)中的类图:
golangLeetcode
2022/08/02
3350
mac 上学习k8s系列(22)rbac 源码学习(part II)
快速上手 K8S Operator
如果你想要对 K8S 做二次开发或者说在原有的基础上封装一些功能让开发者更加好用,那么 Operator 的用法你可必须掌握。
LinkinStar
2023/10/18
2.6K1
Operator3-设计一个operator
前置知识Operator-1初识Operator,Operator-2从pod开始简单operator。
对你无可奈何
2022/07/28
8100
【k8s开发必备技能】使用client-go包访问Kubernetes CRD
Kubernetes API服务器可通过自定义资源定义轻松扩展。但是,用client-go库访问这些资源有点麻烦,官方也没有完整的文档。如kubebuilder operator-framework都能很方便的帮助我们去创建实现一个controller,但是封装的过于好导致我们并不清楚内部是怎么调用client-go的,很多场景我们是需要自己去调用接口操作CRD的而不是在controller中去访问CRD。
sealyun
2019/09/18
6.7K0
【k8s开发必备技能】使用client-go包访问Kubernetes CRD
利用 CRD 实现一个 mini-k8s-proxy
实现一个可以通过配置 host 拦截到匹配的请求域名,将流量代理转发到具体的 service 中(通过配置 serviceName,namespace,port,scheme)的极简网络代理工具。其中,配置通过 CRD 创建,代理程序可以通过控制器监听配置变化,动态更新,无需重启。(PS:其实就是简单模拟了 Traefik IngressRoute 的实现)
gopher云原生
2021/10/18
6180
kubernetes-api-machinery
http server 或者 rpc server 要解决的一个问题是:如何解析用户的请求数据,并把他反序列化为语言中的一个具体的类型。反序列化的程序需要知道具体的类型(这在收到请求的时候就已经知道一些信息了,比如 用户访问的是 EchoService,那么请求肯定是 EchoRequest,不管是 EchoRequestV1,还是 EchoRequestV2), 同时反序列化程序即 decode 程序,还需要知道 他对应的语言里面的具体结构的信息,以便新建这个结构,填充数据,提交给上层处理。以一个 EchoService 为例,decode 程序需要从用户请求(如 post http://echo ) 文本或者二进制数据中创建出 EchoRequestV1,提供给上层处理,同时这个 decode 函数需要足够通用,他返回的是可能是一个 Message Interface, 里面是 EchoRequestV1,decode 相关的细节要么通过代码生成的技术提供给 decoder,要么在 二进制或者文本请求数据(或者 header等元数据)中携带这部分信息。
王磊-字节跳动
2019/10/12
4K0
Kubernetes CRD 自定义控制器
上文我们学习了如何使用 code-generator 来进行代码自动生成,通过代码自动生成可以帮我们自动生成 CRD 资源对象客户端访问的 ClientSet、Informer、Lister 等工具包,接下来我们来了解下如何编写一个自定义的控制器。
我是阳明
2020/10/26
2.3K0
Kubernetes CRD 自定义控制器
K8s源码分析(3)-Resource Version
在上一篇文章中我们主要介绍了 kubernetes 中的 resource meta,以及相关的定义,在这里我们主要介绍 kubernetes resource 的 version。众所周知,在 kubernetes 中所有的 resource 都是基于 group 分组的,例如 apps group 中定义了我们熟悉并常用的 deployment, statefullset, daemonset 等 resource,rbac group 中定义了我们经常用到的 role, role binding, clusterrole, clusterrolebinding 等等 resource。对于不同的 group 中的 resource 又有不同的 version,例如 apps group 中又分为 v1, v1beta1, v1beta2 等不同版本。所以在 kubernetes 中去定位一种 resource 我们就会需要 group (例如 apps), version (例如 v1),kind (例如 deployment),也就是我们常常说的 GVK,如下图例。
TA码字
2021/09/14
1.1K0
K8s源码分析(3)-Resource Version
相关推荐
K8s源码分析(4)-Resource Model
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档