|
0 前言 STM32WB的应用的建立,比起STM32F1XX/3X系列多了一个M0的MCU,两个MCU之间的协调也变得复杂,因此在理解的时候也较为难懂。 重要的参考文献如下: 1 AN5289,Building wirelessapplications with STM32WB Series microcontrollers 2 STM32WB BLE 应用软件架构 1 初始化阶段( M$ z. {% n6 g0 H$ ]) l6 O# O1 k6 x) Z8 s. @$ j2 e$ P) \9 H& w" a
; a i i5 r1 R" D: W& `9 f * T. J0 d) t1 Q* N5 U- q. n 在初始化中,这个初始化和常规的STM32的初始化不一样,其分阶段初始化:
9 y# i, Y3 B* V, @" q) _- Z- k 其中,需要注意的用棕色标识,只有在一个阶段完成后才进入下一阶段。 ( Y$ `" w$ g8 T# D ^* A# q* t% z" F6 A/ K+ w3 H0 n6 \
只有当shci_resume_flow()的时候,才会有接收事件。同理在hci中。
当弄清楚shci的接收过程,也就差不多清楚了了hci的过程。 2 X3 t) c2 w- o2 消息接收、事件处理 事件的处理,主要集中在BLE事件的处理,可以将其等价于中断事件来看,其中中断源在hci_notify_asynch_evt(), 这个中断还会调用:SVCCTL_UserEvtRx(), 在SVCCTL_UserEvtRx中,会去查询SVCCTL_RegisterSvcHandler,就是查看下面挂了多少个事件。 而我们需要的事件HearRate_Event_Handler,注册进去了。 SVCCTL_RegisterSvcHandler(HearRate_Event_Handler); 在HearRate_Event_Handler中,又分很多种情况, 部分代码如下: switch(event_pckt->evt) { case EVT_VENDOR: { blue_evt = (evt_blue_aci*)event_pckt->data; switch(blue_evt->ecode) { # z% \- B! o4 W) _8 n #if (BLE_CFG_HRS_ENERGY_EXPENDED_INFO_FLAG != 0) //这是 文档对 EVT_BLUE_GATT_WRITE_PERMIT_REQ 的解释 // Server receives a Write command //– HR control point characteristic value //– Resets energy expended command then: //Sends an aci_gatt_write_response() with an OK status. //Notifies the HRS application to reset expended energy //Or sends an aci_gatt_write_response() with an error. case EVT_BLUE_GATT_WRITE_PERMIT_REQ: { aci_gatt_write_permit_req_event_rp0 * write_perm_req; BLE_DBG_HRS_MSG("EVT_BLUE_GATT_WRITE_PERMIT_REQ\n"); write_perm_req = (aci_gatt_write_permit_req_event_rp0*)blue_evt->data; . A9 T, Y" {8 h9 Z. |# @) I! `! O if(write_perm_req->Attribute_Handle == (HRS_Context.ControlPointCharHdle + 1)) { return_value = SVCCTL_EvtAckFlowEnable; l+ \, c! d1 l1 T3 O if (write_perm_req->Data[0] == HRS_CNTL_POINT_RESET_ENERGY_EXPENDED) { /* received a correct value for HRM control point char */ aci_gatt_write_resp(write_perm_req->Connection_Handle, write_perm_req->Attribute_Handle, 0x00, /* write_status = 0 (no error))*/ (uint8_t)HRS_CNTL_POINT_VALUE_IS_SUPPORTED, /* err_code */ write_perm_req->Data_Length, (uint8_t *)&write_perm_req->Data[0]); /** * Notify the application to Reset The Energy Expended Value zhaoxin fixme */ Notification.HRS_Evt_Opcode = HRS_RESET_ENERGY_EXPENDED_EVT; HRS_Notification(&Notification); } else { /* received value of HRM control point char is incorrect */ aci_gatt_write_resp(write_perm_req->Connection_Handle, write_perm_req->Attribute_Handle, 0x1, /* write_status = 1 (error))*/ (uint8_t)HRS_CNTL_POINT_VALUE_NOT_SUPPORTED, /* err_code */ write_perm_req->Data_Length, (uint8_t *)&write_perm_req->Data[0]); } } } break; #endif . P' d1 N6 }+ N//HR measurement characteristic description value // 这是文档对于 EVT_BLUE_GATT_ATTRIBUTE_MODIFIED的解释 // – HR measurement characteristic description value //– ENABLE or DISABLE notification //– Notifies HRS application of the measurement notification j' Z5 E" `* B8 e1 N6 i! j* g* G case EVT_BLUE_GATT_ATTRIBUTE_MODIFIED: { attribute_modified = (aci_gatt_attribute_modified_event_rp0*)blue_evt->data; if(attribute_modified->Attr_Handle == (HRS_Context.HeartRatemeasurementCharHdle + 2)) { return_value = SVCCTL_EvtAckFlowEnable; /** * Notify the application to start measurement NOTIFY USER APPLICATION – HRS_Notification */ if(attribute_modified->Attr_Data[0] & COMSVC_Notification) { BLE_DBG_HRS_MSG("EVT_BLUE_GATT_ATTRIBUTE_MODIFIED HRS_NOTIFICATION_ENABLED\n"); Notification.HRS_Evt_Opcode =HRS_NOTIFICATION_ENABLED; HRS_Notification(&Notification); } 其中最重要的HRS_Notification() 在这个里面有打开定时器的功能,将注册的测量函数使能。这样当我们使能Notify的时候,就会有数据发送过来。
基本上就完成了下图所示的逻辑。 3 小结 自己觉得BLE的使用还是比较不易懂得,虽然AN5289已经很详细了,但是自己在看的时候还是不那么理解,后面消化一小段时间,结合STM32WB BLE 应用软件架构,才将其初始化过程理解的多了点。 另外,这是自己兴趣所在的自学,不是给必须的要求时间的投入和持续,导致进展并不是很快。 此外,相对于TI的蓝牙,真的学的人太少了。 : [7 ]2 m% }. I- u; ~2 j* X% M! }) _0 f) H% {) ^2 d |
| 签到 |
【STM32WB55MM-DK | Zephyr】1、创建zephyr_shell工程
低功耗蓝牙无线升级:STM32WB OTA 固件更新技术解析
STM32WB Zigbee 自定义集群开发实战:AN5491 应用笔记深度解读
吃透:STM32WB 上 Zigbee 睡眠终端设备开发攻略
STM32 无线 MCU HSE 频率与启动时间精确调谐实战指南
深度解读:STM32WB 2.4GHz 低成本 PCB 蛇形天线设计实战指南
经验分享 | STM32WB 双核无线 MCU 开发全流程实战指南
STM32WB 基于 Custom Template 实现 BLE 私有协议 实操开发指南
详解STM32单片机的堆栈
STM32单片机进行除零运算,为何程序不崩溃?
微信公众号
手机版