你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

[STM32WB 蓝牙探学] 4 对建立蓝牙过程的理解

[复制链接]
ziziran 发布时间:2020-6-13 22:03
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 k
6 x) Z8 s. @$ j2 e$ P) \9 H& w" a
q2.png
3 P* z9 f5 f' S9 k; M$ i( U5 z

+ y) h( |' e  E4 b& g+ Y5 L

8 V* ^5 R+ j) N. n' J. C; a  i  i5 r1 R" D: W& `9 f
* T. J0 d) t1 Q* N5 U- q. n
在初始化中,这个初始化和常规的STM32的初始化不一样,其分阶段初始化:
q3.png

3 I$ o0 H' m+ f6 V. F+ R9 y# i, Y3 B* V, @" q) _- Z- k
其中,需要注意的用棕色标识,只有在一个阶段完成后才进入下一阶段。
( Y$ `" w$ g8 T# D  ^
* A# q* t% z" F6 A/ K+ w3 H0 n6 \
q4.png
只有当shci_resume_flow()的时候,才会有接收事件。同理在hci中。
q5.png

$ h5 w& K0 A5 S# g7 m% i
当弄清楚shci的接收过程,也就差不多清楚了了hci的过程。
2 X3 t) c2 w- o
2 消息接收、事件处理
事件的处理,主要集中在BLE事件的处理,可以将其等价于中断事件来看,其中中断源在hci_notify_asynch_evt(),
这个中断还会调用:SVCCTL_UserEvtRx(),
在SVCCTL_UserEvtRx中,会去查询SVCCTL_RegisterSvcHandler,就是查看下面挂了多少个事件。
而我们需要的事件HearRate_Event_Handler,注册进去了。
SVCCTL_RegisterSvcHandler(HearRate_Event_Handler);
在HearRate_Event_Handler中,又分很多种情况,

3 K) h* T/ @4 m2 V- O+ W

" {/ i0 |5 s. e+ x6 V3 h9 o
部分代码如下:
  switch(event_pckt->evt)
  {
    case EVT_VENDOR:
    {
      blue_evt = (evt_blue_aci*)event_pckt->data;
      switch(blue_evt->ecode)
      {

& T3 S- ?3 B9 Z# ^; e# z% \- B! o4 W) _8 n
#if (BLE_CFG_HRS_ENERGY_EXPENDED_INFO_FLAG != 0)

: b. W, e' j$ ^, G
     //这是 文档对                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;

3 U8 T1 o; u( ?+ q, T
          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]);

+ }4 k( Q: C' h) v3 j3 {/ _- m! [
              /**
               * 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;

0 H6 p' `/ I4 I0 X& ^
            /**
             * 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);
            }

' {% K  ?: ~3 k9 K+ D5 u! `
其中最重要的HRS_Notification()
在这个里面有打开定时器的功能,将注册的测量函数使能。这样当我们使能Notify的时候,就会有数据发送过来。
q1.PNG
基本上就完成了下图所示的逻辑。

0 I& g+ J! [; ~6 q# D5 h# D* v2 h1 m
. S+ J4 H" q5 _, T. K" J3 小结
         自己觉得BLE的使用还是比较不易懂得,虽然AN5289已经很详细了,但是自己在看的时候还是不那么理解,后面消化一小段时间,结合STM32WB BLE 应用软件架构,才将其初始化过程理解的多了点。
另外,这是自己兴趣所在的自学,不是给必须的要求时间的投入和持续,导致进展并不是很快。
此外,相对于TI的蓝牙,真的学的人太少了。
: [7 ]2 m% }. I- u; ~2 j

9 D, W3 k5 c- v0 w0 O* X% M! }) _0 f) H% {) ^2 d

评分

参与人数 1 ST金币 +100 收起 理由
STMCU + 100

查看全部评分

赞 收藏 评论1 发布时间:2020-6-13 22:03

举报

1个回答
神圣雅诗人 回答时间:2020-6-16 08:11:03
签到

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版