【Microchip WBZ451 Curiosity】-4- 从0创建简易BLE广播
本帖最后由 慕容雪花 于 2023-8-17 12:00 编辑<p><span style="font-size:18px;"><strong>简介:</strong></span></p>
<p>作为一个BLE外部设备,想要被发现就需要按一定时间间隔发送广播报文,本文主要涉及BLE的GAP协议部分,该协议是保证BLE设备能互相发现和连接的规范</p>
<p>GAP定义了蓝牙设备如何发现和建立与其他设备的安全或不安全连接。它处理一些一般模式的业务,比如询问、命名和搜索,还处理一些安全问题,比如担保。同时还处理一些有关连接的业务,比如链路建立、信道和连接建立。GAP规定的是一些一般性的运行任务。因此,它具有强制性,并作为所有其他蓝牙应用规范的基础。</p>
<p> </p>
<p><span style="font-size:18px;"><strong>软硬件资源:</strong></span></p>
<p>手机app: Light Blue</p>
<p>开发工具链:MPLABX IDE, MCC Harmony</p>
<p>USB-Micro线缆</p>
<p> </p>
<p><span style="font-size:18px;"><strong>项目从0开始创建,细节如下:</strong></span></p>
<p>新建一个harmony工程:</p>
<p> </p>
<p> </p>
<p>选择框架路径:</p>
<p> </p>
<p> </p>
<p>选择Device型号:</p>
<p> </p>
<p>进入到MCC选择界面,选择MPLAB HARMONY这个开发框架。</p>
<p> </p>
<p>等待一段时间后,进入到MCC图形化编辑界面。</p>
<p> </p>
<p> </p>
<p>添加BLE驱动:</p>
<p> </p>
<p> </p>
<p>之后项目图如下所示:</p>
<p> </p>
<p> </p>
<p>接下来配置用到的组件参数:</p>
<p> </p>
<p> </p>
<p>BLE Stack:</p>
<p> </p>
<p>之后点击MCC,自动生成配置代码:</p>
<p></p>
<p>之后,有基础源文件需要手动修改,比如app.c里面要使能广播。</p>
<pre>
<code>void APP_Tasks ( void )
{
APP_Msg_T appMsg;
APP_Msg_T *p_appMsg;
p_appMsg=appMsg;
/* Check the application's current state. */
switch ( appData.state )
{
/* Application's initial state. */
case APP_STATE_INIT:
{
bool appInitialized = true;
//appData.appQueue = xQueueCreate( 10, sizeof(APP_Msg_T) );
APP_BleStackInit();
// Start Advertisement
//https://onlinedocs.microchip.com/pr/GUID-C5EAF60E-9124-427C-A0F1-F2DBE662EA92-en-US-1.2.1/index.html?GUID-C4D5F735-FEC4-4FA5-A778-C997D5A536AE
//Parameter Description
// enable Advertising control option.
// duration Duration for advertising. (Unit: 10 ms) Set to 0 to continuously advertise
BLE_GAP_SetAdvEnable(0x01, 0x00);</code></pre>
<p>另外,生成的配置代码里面没有Device Address,需要收到配置。该处位于app_ble.c</p>
<pre>
<code>void APP_BleConfigAdvance()
{
uint8_t devName[]={GAP_DEV_NAME_VALUE};
BLE_GAP_Addr_T devAddr;
BLE_SMP_Config_T smpParam;
BLE_DM_Config_T dmConfig;
BLE_GAP_ServiceOption_T gapServiceOptions;
// Configure Device Name
BLE_GAP_SetDeviceName(sizeof(devName), devName); /* Device Name */
devAddr.addrType = BLE_GAP_ADDR_TYPE_PUBLIC;
devAddr.addr = 0xE9;
devAddr.addr = 0xEA;
devAddr.addr = 0xEB;
devAddr.addr = 0xEC;
devAddr.addr = 0xED;
devAddr.addr = 0xEE;
// Configure device address
BLE_GAP_SetDeviceAddr(&devAddr);</code></pre>
<p> </p>
<p><span style="font-size:18px;"><strong>编译,烧录</strong></span>:</p>
<p> </p>
<p> </p>
<p><span style="color:#e74c3c;"><strong>原因分析:报错,猜测可能是USB-HUB的问题,所以直接插接在电脑上的USB口。修改后,成功下载!</strong></span></p>
<p> </p>
<p> </p>
<p><span style="font-size:18px;"><strong>之后进行测试:</strong></span></p>
<p> </p>
<p>按下RST,打开手机app:</p>
<p> </p>
<p> </p>
<p>关于广播报文中的RAW data,格式可以参考:Here is how the 31 bytes Advertising data and Scan response data should look like(Chapter 11 Part C Vol 3).</p>
<p> </p>
<div style="text-align: center;"></div>
<p> </p>
<p>比如上文第二个截图中的0x020104:</p>
<pre>
<code>0x02 = length 2 octects
0x01 = AD type flags
0x04 = BR_EDR_NOT_SUPPORTED</code></pre>
<p> </p>
<p><strong>相关资料:</strong></p>
<p><strong>PIC32CX-BZ2/WBZ45x蓝牙协议栈API:</strong></p>
<p><a href="https://onlinedocs.microchip.com/pr/GUID-C5EAF60E-9124-427C-A0F1-F2DBE662EA92-en-US-1.2.1/index.html?GUID-94489357-3C47-427B-84D1-73FC2ACC68FA" target="_blank">https://onlinedocs.microchip.com/pr/GUID-C5EAF60E-9124-427C-A0F1-F2DBE662EA92-en-US-1.2.1/index.html?GUID-94489357-3C47-427B-84D1-73FC2ACC68FA</a> </p>
<p> </p>
<p>项目文件树:</p>
<p>│ app.c<br />
│ app.h<br />
│ app_idle_task.c<br />
│ app_idle_task.h<br />
│ app_user_edits.c<br />
│ main.c<br />
│<br />
├─app_ble<br />
│ app_ble.c<br />
│ app_ble.h<br />
│ app_ble_handler.c<br />
│ app_ble_handler.h<br />
│<br />
├─config<br />
│ └─default<br />
│ │ config.h<br />
│ │ configuration.h<br />
│ │ definitions.h<br />
│ │ device.h<br />
│ │ device_cache.h<br />
│ │ device_vectors.h<br />
│ │ exceptions.c<br />
│ │ framework_defs.h<br />
│ │ FreeRTOSConfig.h<br />
│ │ freertos_hooks.c<br />
│ │ harmony-manifest-success.yml<br />
│ │ initialization.c<br />
│ │ interrupts.c<br />
│ │ interrupts.h<br />
│ │ libc_syscalls.c<br />
│ │ startup_xc32.c<br />
│ │ tasks.c<br />
│ │ toolchain_specifics.h<br />
│ │ user.h<br />
│ │ WBZ451.ld<br />
│ │<br />
│ ├─ble<br />
│ │ ├─lib<br />
│ │ │ │ ble_stack.a<br />
│ │ │ │<br />
│ │ │ └─include<br />
│ │ │ att_uuid.h<br />
│ │ │ ble_dtm.h<br />
│ │ │ ble_gap.h<br />
│ │ │ ble_l2cap.h<br />
│ │ │ ble_smp.h<br />
│ │ │ bt_sys.h<br />
│ │ │ bt_sys_log.h<br />
│ │ │ gap_defs.h<br />
│ │ │ gatt.h<br />
│ │ │ host_hci_defs.h<br />
│ │ │ mba_error_defs.h<br />
│ │ │ stack_mgr.h<br />
│ │ │<br />
│ │ └─middleware_ble<br />
│ │ ├─ble_dm<br />
│ │ │ ble_dm.c<br />
│ │ │ ble_dm.h<br />
│ │ │ ble_dm_aes.c<br />
│ │ │ ble_dm_aes.h<br />
│ │ │ ble_dm_conn.c<br />
│ │ │ ble_dm_conn.h<br />
│ │ │ ble_dm_dds.c<br />
│ │ │ ble_dm_dds.h<br />
│ │ │ ble_dm_info.c<br />
│ │ │ ble_dm_info.h<br />
│ │ │ ble_dm_internal.h<br />
│ │ │ ble_dm_sm.c<br />
│ │ │ ble_dm_sm.h<br />
│ │ │<br />
│ │ ├─ble_gcm<br />
│ │ │ ble_dd.h<br />
│ │ │ ble_scm.h<br />
│ │ │<br />
│ │ ├─ble_log<br />
│ │ │ ble_log.h<br />
│ │ │<br />
│ │ └─ble_util<br />
│ │ byte_stream.h<br />
│ │ mw_assert.h<br />
│ │<br />
│ ├─crypto<br />
│ │ │ crypto.h<br />
│ │ │<br />
│ │ └─src<br />
│ │ crypto.c<br />
│ │<br />
│ ├─default.mhc<br />
│ │ settings.yml<br />
│ │<br />
│ ├─driver<br />
│ │ ├─device_support<br />
│ │ │ │ pic32cx_bz2_device_support.a<br />
│ │ │ │<br />
│ │ │ └─include<br />
│ │ │ info_block.h<br />
│ │ │ pmu_system.h<br />
│ │ │ rf_system.h<br />
│ │ │ sleep_system.h<br />
│ │ │<br />
│ │ └─pds<br />
│ │ │ pds.a<br />
│ │ │<br />
│ │ └─include<br />
│ │ pds.h<br />
│ │ pds_config.h<br />
│ │<br />
│ ├─osal<br />
│ │ osal.h<br />
│ │ osal_definitions.h<br />
│ │ osal_freertos.c<br />
│ │ osal_freertos.h<br />
│ │ osal_freertos_extend.c<br />
│ │ osal_freertos_extend.h<br />
│ │<br />
│ ├─peripheral<br />
│ │ ├─clk<br />
│ │ │ plib_clk.c<br />
│ │ │ plib_clk.h<br />
│ │ │<br />
│ │ ├─cmcc<br />
│ │ │ plib_cmcc.c<br />
│ │ │ plib_cmcc.h<br />
│ │ │<br />
│ │ ├─evsys<br />
│ │ │ plib_evsys.c<br />
│ │ │ plib_evsys.h<br />
│ │ │<br />
│ │ ├─gpio<br />
│ │ │ plib_gpio.c<br />
│ │ │ plib_gpio.h<br />
│ │ │<br />
│ │ ├─nvic<br />
│ │ │ plib_nvic.c<br />
│ │ │ plib_nvic.h<br />
│ │ │<br />
│ │ └─nvm<br />
│ │ plib_nvm.c<br />
│ │ plib_nvm.h<br />
│ │<br />
│ └─stdio<br />
│ xc32_monitor.c<br />
│<br />
├─packs<br />
│ ├─CMSIS<br />
│ │ └─CMSIS<br />
│ │ └─Core<br />
│ │ └─Include<br />
│ │ cachel1_armv7.h<br />
│ │ cmsis_armcc.h<br />
│ │ cmsis_armclang.h<br />
│ │ cmsis_armclang_ltm.h<br />
│ │ cmsis_compiler.h<br />
│ │ cmsis_gcc.h<br />
│ │ cmsis_iccarm.h<br />
│ │ cmsis_version.h<br />
│ │ core_cm4.h<br />
│ │ mpu_armv7.h<br />
│ │<br />
│ └─WBZ451_DFP<br />
│ │ wbz451.h<br />
│ │<br />
│ ├─component<br />
│ │ ac.h<br />
│ │ adchs.h<br />
│ │ aes.h<br />
│ │ arb.h<br />
│ │ ble.h<br />
│ │ btzbsys.h<br />
│ │ ccl.h<br />
│ │ cfg.h<br />
│ │ cmcc.h<br />
│ │ cru.h<br />
│ │ dmac.h<br />
│ │ dmt.h<br />
│ │ dscon.h<br />
│ │ dsu.h<br />
│ │ eic.h<br />
│ │ evsys.h<br />
│ │ freqm.h<br />
│ │ fuses.h<br />
│ │ gpio.h<br />
│ │ hmatrixb.h<br />
│ │ icm.h<br />
│ │ nvm.h<br />
│ │ pac.h<br />
│ │ pche.h<br />
│ │ pfw.h<br />
│ │ pmu.h<br />
│ │ pps.h<br />
│ │ pukcc.h<br />
│ │ qspi.h<br />
│ │ ramecc.h<br />
│ │ rcon.h<br />
│ │ rtc.h<br />
│ │ sercom.h<br />
│ │ tc.h<br />
│ │ tcc.h<br />
│ │ trng.h<br />
│ │ wdt.h<br />
│ │ zigbee.h<br />
│ │<br />
│ ├─instance<br />
│ │ ac.h<br />
│ │ adchs.h<br />
│ │ aes.h<br />
│ │ arb.h<br />
│ │ ble.h<br />
│ │ btzbsys.h<br />
│ │ ccl.h<br />
│ │ cfg.h<br />
│ │ cmcc.h<br />
│ │ cru.h<br />
│ │ dmac.h<br />
│ │ dmt.h<br />
│ │ dscon.h<br />
│ │ dsu.h<br />
│ │ eic.h<br />
│ │ evsys.h<br />
│ │ freqm.h<br />
│ │ fuses.h<br />
│ │ gpioa.h<br />
│ │ gpiob.h<br />
│ │ hmatrix.h<br />
│ │ icm.h<br />
│ │ nvm.h<br />
│ │ pac.h<br />
│ │ pche.h<br />
│ │ pfw.h<br />
│ │ pmu.h<br />
│ │ pps.h<br />
│ │ qspi.h<br />
│ │ ramecc.h<br />
│ │ rcon.h<br />
│ │ rtc.h<br />
│ │ sercom0.h<br />
│ │ sercom1.h<br />
│ │ sercom2.h<br />
│ │ sercom3.h<br />
│ │ tc0.h<br />
│ │ tc1.h<br />
│ │ tc2.h<br />
│ │ tc3.h<br />
│ │ tcc0.h<br />
│ │ tcc1.h<br />
│ │ tcc2.h<br />
│ │ trng.h<br />
│ │ wdt.h<br />
│ │ zigbee.h<br />
│ │<br />
│ └─pio<br />
│ wbz451.h<br />
│<br />
└─third_party<br />
├─rtos<br />
│ └─FreeRTOS<br />
│ └─Source<br />
│ │ croutine.c<br />
│ │ event_groups.c<br />
│ │ FreeRTOS_tasks.c<br />
│ │ list.c<br />
│ │ queue.c<br />
│ │ stream_buffer.c<br />
│ │ timers.c<br />
│ │<br />
│ ├─include<br />
│ │ croutine.h<br />
│ │ deprecated_definitions.h<br />
│ │ event_groups.h<br />
│ │ FreeRTOS.h<br />
│ │ list.h<br />
│ │ message_buffer.h<br />
│ │ mpu_prototypes.h<br />
│ │ mpu_wrappers.h<br />
│ │ portable.h<br />
│ │ projdefs.h<br />
│ │ queue.h<br />
│ │ semphr.h<br />
│ │ stack_macros.h<br />
│ │ stream_buffer.h<br />
│ │ task.h<br />
│ │ timers.h<br />
│ │<br />
│ └─portable<br />
│ ├─GCC<br />
│ │ └─SAM<br />
│ │ └─ARM_CM4F<br />
│ │ port.c<br />
│ │ portmacro.h<br />
│ │<br />
│ └─MemMang<br />
│ heap_4.c<br />
│<br />
└─wolfssl<br />
└─wolfssl<br />
│ certs_test.h<br />
│<br />
└─wolfcrypt<br />
│ aes.h<br />
│ arc4.h<br />
│ asn.h<br />
│ asn_public.h<br />
│ blake2-impl.h<br />
│ blake2-int.h<br />
│ blake2.h<br />
│ camellia.h<br />
│ chacha.h<br />
│ chacha20_poly1305.h<br />
│ cmac.h<br />
│ coding.h<br />
│ compress.h<br />
│ cpuid.h<br />
│ cryptocb.h<br />
│ curve25519.h<br />
│ curve448.h<br />
│ des3.h<br />
│ dh.h<br />
│ dsa.h<br />
│ ecc.h<br />
│ ed25519.h<br />
│ ed448.h<br />
│ error-crypt.h<br />
│ fe_448.h<br />
│ fe_operations.h<br />
│ fips_test.h<br />
│ ge_448.h<br />
│ ge_operations.h<br />
│ hash.h<br />
│ hc128.h<br />
│ hmac.h<br />
│ idea.h<br />
│ integer.h<br />
│ logging.h<br />
│ md2.h<br />
│ md4.h<br />
│ md5.h<br />
│ memory.h<br />
│ mem_track.h<br />
│ misc.h<br />
│ mpi_class.h<br />
│ mpi_superclass.h<br />
│ pkcs11.h<br />
│ pkcs12.h<br />
│ pkcs7.h<br />
│ poly1305.h<br />
│ pwdbased.h<br />
│ rabbit.h<br />
│ random.h<br />
│ rc2.h<br />
│ ripemd.h<br />
│ rsa.h<br />
│ selftest.h<br />
│ settings.h<br />
│ sha.h<br />
│ sha256.h<br />
│ sha3.h<br />
│ sha512.h<br />
│ signature.h<br />
│ sp.h<br />
│ sp_int.h<br />
│ srp.h<br />
│ tfm.h<br />
│ types.h<br />
│ visibility.h<br />
│ wc_encrypt.h<br />
│ wc_pkcs11.h<br />
│ wc_port.h<br />
│ wolfevent.h<br />
│ wolfmath.h<br />
│<br />
├─port<br />
│ └─pic32<br />
│ CryptoLib_cf_pb.h<br />
│ CryptoLib_ClearFlags_pb.h<br />
│ CryptoLib_Comp_pb.h<br />
│ CryptoLib_CondCopy_pb.h<br />
│ CryptoLib_CRT_pb.h<br />
│ CryptoLib_Div_pb.h<br />
│ CryptoLib_ExpMod_pb.h<br />
│ CryptoLib_FastCopy_pb.h<br />
│ CryptoLib_Fill_pb.h<br />
│ CryptoLib_Fmult_pb.h<br />
│ CryptoLib_GCD_pb.h<br />
│ CryptoLib_GF2NEccAdd_pb.h<br />
│ CryptoLib_GF2NEccConv_pb.h<br />
│ CryptoLib_GF2NEccDbl_pb.h<br />
│ CryptoLib_GF2NEccMul_pb.h<br />
│ CryptoLib_GF2NEcDsa_pb.h<br />
│ CryptoLib_Hardware_pb.h<br />
│ CryptoLib_Headers_pb.h<br />
│ CryptoLib_JumpTable_pb.h<br />
│ CryptoLib_mapping_pb.h<br />
│ CryptoLib_PrimeGen_pb.h<br />
│ CryptoLib_Rc_pb.h<br />
│ CryptoLib_RedMod_pb.h<br />
│ CryptoLib_Rng_pb.h<br />
│ CryptoLib_SelfTest_pb.h<br />
│ CryptoLib_Services_pb.h<br />
│ CryptoLib_Smult_pb.h<br />
│ CryptoLib_Square_pb.h<br />
│ CryptoLib_Swap_pb.h<br />
│ CryptoLib_typedef_pb.h<br />
│ CryptoLib_ZpEccAddSub_pb.h<br />
│ CryptoLib_ZpEccAdd_pb.h<br />
│ CryptoLib_ZpEccConv_pb.h<br />
│ CryptoLib_ZpEccDbl_pb.h<br />
│ CryptoLib_ZpEccMul_pb.h<br />
│ CryptoLib_ZpEccQuickDualMul_pb.h<br />
│ CryptoLib_ZpEcDsa_pb.h<br />
│ crypt_aes_hw.h<br />
│ crypt_aes_hwInt.h<br />
│ crypt_aes_sam6149.h<br />
│ crypt_aes_u2238.h<br />
│ crypt_crya_saml11.h<br />
│ crypt_ecc_ba414e.h<br />
│ crypt_ecc_pukcl.h<br />
│ crypt_pukcl_definitions.h<br />
│ crypt_pukcl_functions.h<br />
│ crypt_rng_hw.h<br />
│ crypt_rsa_pukcl.h<br />
│ crypt_sha1_hw.h<br />
│ crypt_sha224_hw.h<br />
│ crypt_sha256_hw.h<br />
│ crypt_sha384_hw.h<br />
│ crypt_sha512_hw.h<br />
│ crypt_sha_hw.h<br />
│ crypt_sha_sam11105.h<br />
│ crypt_sha_sam6156.h<br />
│ crypt_tdes_hw.h<br />
│ crypt_tdes_hwInt.h<br />
│ crypt_tdes_sam6150.h<br />
│ crypt_wolfcryptcb.h<br />
│ pic32mz-crypt.h<br />
│<br />
└─src<br />
│ aes.c<br />
│ arc4.c<br />
│ asm.c<br />
│ asn.c<br />
│ blake2b.c<br />
│ blake2s.c<br />
│ camellia.c<br />
│ chacha.c<br />
│ chacha20_poly1305.c<br />
│ cmac.c<br />
│ coding.c<br />
│ compress.c<br />
│ cpuid.c<br />
│ cryptocb.c<br />
│ curve25519.c<br />
│ curve448.c<br />
│ des3.c<br />
│ dh.c<br />
│ dsa.c<br />
│ ecc.c<br />
│ ecc_fp.c<br />
│ ed25519.c<br />
│ ed448.c<br />
│ error.c<br />
│ evp.c<br />
│ fe_448.c<br />
│ fe_low_mem.c<br />
│ fe_operations.c<br />
│ ge_448.c<br />
│ ge_low_mem.c<br />
│ ge_operations.c<br />
│ hash.c<br />
│ hc128.c<br />
│ hmac.c<br />
│ idea.c<br />
│ integer.c<br />
│ logging.c<br />
│ md2.c<br />
│ md4.c<br />
│ md5.c<br />
│ memory.c<br />
│ misc.c<br />
│ pkcs12.c<br />
│ pkcs7.c<br />
│ poly1305.c<br />
│ pwdbased.c<br />
│ rabbit.c<br />
│ random.c<br />
│ rc2.c<br />
│ ripemd.c<br />
│ rsa.c<br />
│ sha.c<br />
│ sha256.c<br />
│ sha3.c<br />
│ sha512.c<br />
│ signature.c<br />
│ sp_arm32.c<br />
│ sp_arm64.c<br />
│ sp_armthumb.c<br />
│ sp_c32.c<br />
│ sp_c64.c<br />
│ sp_cortexm.c<br />
│ sp_dsp32.c<br />
│ sp_int.c<br />
│ sp_x86_64.c<br />
│ srp.c<br />
│ tfm.c<br />
│ wc_dsp.c<br />
│ wc_encrypt.c<br />
│ wc_pkcs11.c<br />
│ wc_port.c<br />
│ wolfevent.c<br />
│ wolfmath.c<br />
│<br />
└─port<br />
└─pic32<br />
crypt_aes_sam6149.c<br />
crypt_aes_u2238.c<br />
crypt_ecc_ba414e.c<br />
crypt_ecc_pukcl.c<br />
crypt_pukcl_functions.c<br />
crypt_rng_sam6334.c<br />
crypt_rng_u2242.c<br />
crypt_rsa_pukcl.c<br />
crypt_sam_u2803.c<br />
crypt_sha1_sam11105.c<br />
crypt_sha1_sam6156.c<br />
crypt_sha224_sam11105.c<br />
crypt_sha224_sam6156.c<br />
crypt_sha256_sam11105.c<br />
crypt_sha256_sam6156.c<br />
crypt_sha384_sam6156.c<br />
crypt_sha512_sam6156.c<br />
crypt_tdes_sam6150.c<br />
crypt_wolfcryptcb.c<br />
pic32mz-crypt.c</p>
<p> </p>
<p> </p>
<p>这配置BLE看起来还是挺麻烦的。</p>
<p>生成的配置代码里面没有Device Address,需要收到配置,谢谢提醒</p>
wangerxian 发表于 2023-8-17 15:31
这配置BLE看起来还是挺麻烦的。
<p>是的,对我这种小白还是有一定难度的。不过这也是个学习的好机会,毕竟Microchip还提供了图形化配置,自动生成代码。</p>
火辣西米秀 发表于 2023-8-18 07:27
生成的配置代码里面没有Device Address,需要收到配置,谢谢提醒
<p>我也是看到有规范说必须加上地址。共同学习,共同进步!Microchip的文档做的是相当不错的!</p>
页:
[1]