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

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

image.png

应该是512K,flash.

1.准备工具

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

image.png

image.png

2.软件工具

keil arm,版本V5.12以上

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

image.png

二、编译

1.keil的安装

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

2.编译工程

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

image.png

三、烧录

1.烧录接口

硬件SPI接口

image.png


2.烧录程序

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

image.png

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

image.png

选择SIP CHIP页面

image.png

下载成功显示

image.png

四、运行

image.png

用BLE Tool工具调试

image.png

五,调试


1.蓝牙名称在哪里修改


user_config.h里面有两个宏定义


APP_DFLT_DEVICE_NAME


APP_SCNRSP_DATA


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


2.UUID怎么修改?


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

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

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

//广播参数配置
/// 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)
————————————————
版权声明:本文为CSDN博主「心跳包」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dop102/article/details/106997922

5.连接间隔参数修改

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

1//最小连接间隔
#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
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接收数据后,并打印出来

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打勾即可打开。


image.png


目录
相关文章
|
11月前
|
传感器 机器学习/深度学习 数据采集
AI在环保中的角色:污染监测与防治
【10月更文挑战第6天】AI在环保领域的应用,不仅提升了污染监测的精准度和防治效率,还推动了环保技术的创新和升级。作为未来环保事业的重要力量,AI正以其独特的优势,为构建更加绿色、可持续的生态环境贡献着智慧与力量。我们有理由相信,在AI的助力下,我们的地球将变得更加美好。
|
11月前
|
缓存
CORS 报错的常见原因
【10月更文挑战第6天】
|
11月前
|
Java API 网络安全
Java 发送邮件示例
本示例展示了如何使用Java编程语言发送电子邮件。通过利用JavaMail API,这段代码实现了从配置SMTP服务器,设置邮件属性,到发送邮件的全过程,为开发者提供了实用的参考。
797 12
|
存储 API 调度
OpenStack核心组件Cinder
【8月更文挑战第4天】
581 9
|
负载均衡 安全 网络虚拟化
CCE集群VPC网络模式下几种访问场景
【8月更文挑战第13天】在CCE(Cloud Container Engine)集群的VPC网络模式下,支持多样化的访问场景:容器应用可直接利用VPC访问外部资源;通过ELB负载均衡或VPN/专线配置,实现外部网络对容器应用的安全访问;容器间通过内部IP或服务发现机制相互通信;跨VPC访问则可通过VPC对等连接或云连接服务实现。这些方案确保了应用内外部通信的安全与高效。
474 3
|
XML Android开发 数据格式
Android 中如何设置activity的启动动画,让它像dialog一样从底部往上出来
在 Android 中实现 Activity 的对话框式过渡动画:从底部滑入与从顶部滑出。需定义两个 XML 动画文件 `activity_slide_in.xml` 和 `activity_slide_out.xml`,分别控制 Activity 的进入与退出动画。使用 `overridePendingTransition` 方法在启动 (`startActivity`) 或结束 (`finish`) Activity 时应用这些动画。为了使前 Activity 保持静止,可定义 `no_animation.xml` 并在启动新 Activity 时仅设置新 Activity 的进入动画。
495 12
【植物大战僵尸杂交版】致敬传奇游戏玩家——一个普通人的六年坚持
【植物大战僵尸杂交版】致敬传奇游戏玩家——一个普通人的六年坚持
|
JSON JavaScript 定位技术
Echarts自定义地图显示区域,可以显示街道,小区,学校等区域
Echarts自定义地图显示区域,可以显示街道,小区,学校等区域
|
存储 Unix C语言
STM32--RTC实时时钟
STM32--RTC实时时钟
515 0
|
数据安全/隐私保护
智能家电设备连接网络配置
智能家电设备连接网络配置
556 5