BK3432 BLE芯片
我看几款手指机器人都是采用BK3432
方案,决定深入了解一下,结果在网上找到的资料甚少,按照我的印象一个堂堂国际公司不应该这么保守呢,结果该芯片原厂是上海博通(Beken)和博通(Broadcom)并没有任何关系,只是重名,着实令人汗颜,不过开头的疑惑就说得通了,国产IC厂商资料都相对封闭。
LYBB1S3模组
![]() |
![]() |
---|---|
模组 | 唯一资料 |
在淘宝上购买过这个模组,卖家居然说没有任何资料,根据标签上的名称搜索到了一个引脚图,我真感觉我误入了某个神秘领域,这么多年少有购买一个模块完全0资料提供的。
资料仓库
资料都在Gitee这个仓库中:https://gitee.com/shenzhen_bo_core/BK3432_BLE_SDK_public
类别 | 文件名 | 说明 | 备注 |
---|---|---|---|
串口烧录软件 | bk_uart_writer_v1.57.rar | ||
HID烧录软件 | BekenProgramV2.5.4.exe | Hid Download Tool | |
数据手册 | BK3432使用快速入门 .pdf | ||
烧录说明 | BK3432 Download By UART User’s Guide.pdf |
串口烧录
Gitee仓库中给的烧录工具是1.57,但是一直烧录失败,同一个Bin文件换成1.45就可以烧录了。
![]() |
![]() |
---|---|
1.45 | 1.57 |
![]() |
![]() |
---|---|
烧录成功 | 烧录成功 |
烧录地址到底是0x00002010
还是0x00001010
呢?串口更新手册上写的是前者,但是网上搜索到视频教程《bk3432最小系统_博通蓝牙BLE开发》是后者,而我成功烧录+并能正常运行
的地址确实也是后者。
![]() |
![]() |
---|---|
烧录成功 | 启动日志 |
经人指点,这两个地址都没有错,因为都是不同的boot指定的地址,不同的boot烧录地址不同,如下:
![]() |
---|
不同的烧录地址 |
SPI烧录
![]() |
![]() |
---|---|
硬件链接 | 硬件链接 |
![]() |
---|
选择带merge的bin,因为其带bootloader否则启动不起来 |
![]() |
---|
配置信息 |
![]() |
---|
烧录中… |
![]() |
---|
烧录成功 |
此时拔掉SPI烧录器,按RESET启动即可。
烧录板载例子ble_app_gpio_key_led
固件路径
bk3432_system_sw_v1.2/projects/ble_app_gpio_key_led/output/app/bk3432_ble_app_stack.bin
BLE连接控制
![]() |
![]() |
![]() |
---|---|---|
根据MAC地址确认搜索到该设备 | 连接 | App控制数据示例 |
注:App控制数据示例8E000B00090A0A1E016443211234B3
![]() |
---|
接收代码部分 |
启动日志
app_sec_env.bonded = 0
motor_init
led_init
button_init
beep_pwm_init
beep_pwm_close
date:Mar 16 2025
time:11:25:22
system start
power on or system reset
read_system_restart_num
system_restart_num_ have save to flash
now system_restart_num=3
RESTART_NUM_FLASH:
ff:ff:ff:ff:03:00:00:00:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:
app_oad_add_oads
app_oad_add_oads d = 9,s = 5
create_db status = 0
EnQueue value=1
sysState=LED_TEST
DeQueue eventType=STATE_CHANGE_EVENT
sysState:LED_TEST
appm_start_advertising_begin
appm_start_advertising_success
info.host.adv_data:
03ffff00
info.host.adv_data_len:4
info.host.adv_intv:100
ke_msg_send(cmd);
wdt_enable
16383
[21:25:41.550]收←◆app_test_and_printf_handler
EnQueue value=5
DeQueue eventType=TIMEOUT
led_open
h:17 ,m:9 ,s:0 ,w:4
烧录例子app_wechat
固件路径
BK3432_DesignKit_V17_0C0A\SDK\projects\ble_app_wechat\output\app\bk3432_ble_app_stack.bin
其它路径的不能启动,看来必须带stack
。
![]() |
![]() |
---|---|
串口启动日志 | App搜索到该设备 |
烧录例子ble_app_gatt_scan_advertising
固件路径
BK3432_DesignKit_V17_0C0A\SDK\projects\ble_app_gatt_scan_advertising\output\app\bk3432_ble_app_stack.bin
没有任何反应,启动不起来的样子。
关于MAC地址
采用SPI方式烧录时,因为默认会擦除所有空间,导致MAC地址变成默认的36:34:24:62:A2:6B
,如果采用以下方式烧录程序可以保留Mac地址。
![]() |
---|
保留Mac地址烧录方式 |
至于默认Mac地址为何是36:34:24:62:A2:6B
,目前还没有找到原因,只是观察到了这种现象。
我最终采用提自动烧录MAC地址:
![]() |
---|
烧录MAC地址方式 |
至于27ff0
的来历,从串口烧录软件和代码中找出端倪
![]() |
---|
烧录MAC地址方式 |
Armino
估计能频繁看到这个词汇,但是还是故意装作看不到吧,因为它不支持BK3432。Armino 是博通集成推出的物联网开发框架,旨在支持博通集成 2022 年之后推出的各种物联网芯片, 同时兼容各种主流物联网操作系统,如 RT-Thread,AliOS,HarmoneyOS 等,Armino 默认支持 FreeRTOS。
PWM3
例子中启动了PWM0,这里是启动PWM3的改动内容
diff --git a/fml/fml_beep.c b/fml/fml_beep.c
index 425818e..c93353d 100644
--- a/fml/fml_beep.c
+++ b/fml/fml_beep.c
@@ -65,7 +65,7 @@
PWM_DRV_DESC timer_desc;
-
+#define PWM_CH 3// 0 for p10 3 for p13
void beep_pwm_init(void)
{
@@ -77,21 +77,22 @@ void beep_pwm_init(void)
// icu_set_sleep_mode(1);
rwip_prevent_sleep_set(BK_DRIVER_TIMER_ACTIVE);
- timer_desc.channel = 0; //p10
+ timer_desc.channel = PWM_CH; //p10
timer_desc.mode = 1<<0 | 1<<1 | 0<<2 | 0<<4;
timer_desc.pre_divid = 0;
timer_desc.end_value = 16;//32; 2k
- timer_desc.duty_cycle = 8;// 占空比50%
+ timer_desc.duty_cycle = timer_desc.end_value/2;// 占空比 50%
// timer_desc.end_value = 8;//32; 2k
// timer_desc.duty_cycle = 4;// 占空比50%
// timer_desc.p_Int_Handler = user_timer_cb;
- REG_AHB0_ICU_PWMCLKCON |= (1<<1);
- REG_AHB0_ICU_PWMCLKCON &= ~(7<<12);
- REG_AHB0_ICU_PWMCLKCON |= (8<<12);
+ // ??PWM3??
+ REG_AHB0_ICU_PWMCLKCON |= (1<<3);
+ REG_AHB0_ICU_PWMCLKCON &= ~(7<<18);
+ REG_AHB0_ICU_PWMCLKCON |= (8<<18);
}
void beep_pwm_open(void)
@@ -108,7 +109,7 @@ void beep_pwm_close(void)
UART_PRINTF("%s\r\n",__func__);
rwip_prevent_sleep_clear(BK_DRIVER_TIMER_ACTIVE);
- pwm_disable(0);//p10
+ pwm_disable(PWM_CH);//p10
gpio_config(BEEP_PIN, OUTPUT, PULL_HIGH);
gpio_set(BEEP_PIN, 1); //蜂鸣器关闭时,设置引脚为上拉输出高电平,消除嗓音
diff --git a/fml/fml_beep.h b/fml/fml_beep.h
index 312e839..e9c613c 100644
--- a/fml/fml_beep.h
+++ b/fml/fml_beep.h
@@ -6,7 +6,7 @@
#define BEEP_H_
-#define BEEP_PIN 0x10//p10
+#define BEEP_PIN 0x13//p10
#define BEEP_EN 1