去年四月份入手了STM32WB系列的一个开发板,入手之后一直闲置了起来。其实还是因为懒。懒惰不仅能使绿洲变成废墟,而且还能使好的开发板变成了废物。当初还动了把它挂在咸鱼上卖了的念头,但是想了想还是不了,毕竟当初买的时候很费劲,还需要从米国才能买到。而且到手的时候正坐在研究生复试的教室里。还是好好保存了起来。现在觉得自己没有把它卖掉真是英明的决策。因为实验室项目需要就开始调试这块板子,因为买的开发板套件(如图1)里包含了2块板子,正好可以做P2P通信实验。但是小的板子并没有把串口和U口连接,这在调试时输出信息方面就很不方便。为了调试方便并且测试Router功能,就重新买了一套开发板。![图1 开发板套件](https://img-blog.csdnimg.cn/20200217164004818.bmp?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RvZzM0NQ==,size_16,color_FFFFFF,t_70)
以前接触的蓝牙都是用它当做数据透传模块,用蓝牙模块怼上MCU就OK。但是ST这款芯片是双核芯片,一个是M4核主要负责数据的收集和计算,也就是说我们开发者可以只关心M4核,我们编写的应用程序都在M4核上进行去跑。M0核主要负责蓝牙协议栈。蓝牙协议栈直接以bin文件的形式固化在M0核上,其实就是一个“黑匣子”的形式存在。两个核之间通过“邮箱”进行去通信。ST附带的P2P通信只是两个模块之间连接以后可以相互点亮LED,虽然并没有实际的用途,但是至少给了足够的帮助,只要认认真真地读源码然后更改关键点就可以让它为自己所用。当然对于经验资深的蓝牙开发大咖来说可能很快就解决。但是我作为刚接触蓝牙的初学者着实费了一番功夫。首先要搞清楚该芯片的启动过程,这对读程序有很大的帮助,不然一会这个文件中的函数又跳到那个函数,很容易出现当前文件中的函数读懂但是不知道在哪里调用这种情况。 芯片的启动过程如下。1 在main函数中调用响应的函数来初始化时钟,功耗模式,RTC服务器,调度器。

2 进入app_entry.c文件中
3 调用APPE_Init()函数初始化BSP,初始化系统通道,初始化用户自己的应用程序。关于系统通道初始化的问题。邮箱的系统通道只有M4核来初始化。
1) 在app_entry.c文件中的APPE_Init()函数中调用appe_TL_Init()函数初始化对于CPU2的系统和存储通道
2) 在appe_TL_Init()调用TL_Init()函数进入tl_mbox.c文件初始化CPU2共享的SRAM2的表。
3) 返回到app_entry.c文件中
4) 调用shci_init()函数进入shci_tl.c函数中初始化CPU2的系统通道
5) 在shci_tl.c文件中调用TL_SYS_Init()函数进入tl_mbox.c文件中
6) 从tl_mbox.c文件中返回到shci_tl.c文件中再返回app_entry.c文件中
7) 在app_entry.c文件中调用TL_MM_Init()文件进入tl_mbox.c中初始化CPU2的内存通道
8) 从tl_mbox.c文件中返回到app_entry.c文件中
9) 在app_entry.c中调用TL_Enable.c文件中进入tl_mbox.c文件中开始CPU2.然后返回到main函数中等待系统通道就绪
10) Tl_mbox.c文件中将“收到系统就绪事件”传送给shci_tl.c文件中采用IPCC中断调用shci_notify_asynch_evt()函数进入app_entry.c中报告给app_entry.c
11) 由于此时整个系统处在等待状态。此时在等待状态下调用shci_user_evt_proc()进入shci_tl.c文件中再向应用程序报告之前先正确处理报告事件
12) 处理后从shci_tl.c文件中调用APPE_SysUserEvtRx()进入app_entry,c文件中向用户程序报告此时系统通道已经就绪。
13) 在接收到“系统就绪事件”后向用户报告系统通道就绪前,用户可以调用app_ble.c中的APP_BLE_Init()来启用BLE栈
14) 在APP_BLE_Init()函数中调用hci_init()函数进入hci_tl.c文件再调用BLE_TL_Init()函数进入tl_mbox.c文件中初始化BLE传输层(注系统刚开始是初始化了所有层,然后再在这里才开始初始化BLE的传输层)
15) 完成BLE传输层初始化以后调用SHCI_C2_BLE_Init启动BLE协议栈
16) CMO接收到启动命令后返回一个命令
17) 接收到该命令后可以发送BLE命令
18) 调用Ble_Hci_Gap_Gatt_Init();初始化GAP层和GATT层
初始化GAP层和GATT层完成后,就可以利用蓝牙来做我们自己的的事情。官方的Demo里出了一些HAL库驱动和BSP驱动外。和我们关系比较大的主要是“main.c”,“app_ble.c” “p2p_server_app.c” “p2p_client_app.c”和“p2p_stm.c”文件。
其中p2p.stm.c文件主要是在应用程序中创建服务和特性以更新特征,接收通知或写入命令,并在BLE无线堆栈和应用程序之间建立连接。aci_gatt_update_char_value()函数用来更新特性的值,其中的一个参数是数据的长度,我们如果想发送任意长度的数据,只需要把这个长度参数更改即可,程序中的所有此函数的长度都要与自己所需的数据长度相一致。(长度的范围在0-243字节)。服务初始化函数为p2p_stm_Init()函数主要有以下功能1 注册服务控制的点对点处理事件 2 初始化服务UUID aci_gatt_add_ser()函数将P2P服务作为主要服务。3初始化P2P写特性 aci_gatt_add_char()函数添加写特性 4 初始化P2P通知特性 aci_gatt_add_char_add notify characteristic 5 更新通知特性 P2PS_STM_update_char()
与应用相关的函数主要在p2p_server_app.c文件和p2p_client_app.c文件中。P2PS_STM_App_Notification函数主要用来接收并响应来自GATT层的BLE堆栈的内部事件。P2PS_send_Notification()函数调用服务函数来更新通知特性。
app_ble.c文件中主要是对BLE的一些操作,定义了一个诸如context,广播操作函数,连接操作函数,扫描操作函数和GAP_GATT层操作函数。其中Ble_Hci_Gap_Gatt_Init(void)函数用来初始化GAP_GATT层,在函数中调用aci_hal_set_tx_power_level(1, CFG_TX_POWER);函数可以更改发射功率。Adv_Request函数则广播数据,将设备的广播名字,设备的广播间隔广播出去。void BLE_SVC_L2CAP_Conn_Update(uint16_t Connection_Handle)函数主要哟用来更改连接间隔,该函数中调用aci_l2cap_connection_parameter_update_req函数可以更改连接的一些参数。
“p2p_client_app.c”文件中没有为客户端创建服务,只需要注册GATT客户端处理程序就可以在应用程序中识别通知GATT事件。和开始发现管理远程P2P服务特性相关的api函数主要有aci_gatt_disc_all_char_of_service(),aci_gatt_disc_all_char_disc() aci_gatt_write_char_disc()函数。在文件中管理GATT事件用来查找和注册远程设别特征句柄函数为SVCCTL_EvtAckStatus_t Event_Handler()函数。 当服务和特性发现后,Client函数可以用来使用写特性控制远程设备,利用接收通知来通知特性。
有关源码和相关文档链接如下:
//download.csdn.net/download/dog345/12157047
//download.csdn.net/download/dog345/11153831
http://share.eepw.com.cn/share/download/id/386814
http://share.eepw.com.cn/share/download/id/386815

STM32WB系列调试总结相关推荐

  1. STM32无线MCU:STM32WB系列和STM32WL系列

    STM32微控制器主要分为四大类: 1.STM32 ARM Cortex 32位微控制器. 2.STM32 ARM Cortex MPUs. 3.STM8 8位MCU. 4.经典MCU. 如下图. 其 ...

  2. CORTEX-M 系列调试下载总览

    MCU 所有的下载方式 我们常见的MCU / CPU 代码烧录方式主要有以下三种:ICP(In Circuit Programing):在电路编程,可通过CPU的Debug Access Port 烧 ...

  3. TP 全系列调试通用参考说明

    1 FocalTech 敦泰科技 系列 1.1 Ft6306是敦泰的Touch IC 可参考下面的 Mtk touch panel驱动/TP驱动详解http://blog.csdn.net/sdkdl ...

  4. STM32 AD7685 AD7684 AD7686 AD7687 AD7683 AD7680系列调试记录

    介绍部分 AD7685 AD7684 AD7686 AD7687 AD7688 AD7688 其差别在于转换速率不同,数据读取.分辨率完全一致. 单端:单输入型,只允许0V-VCC. 伪差分 :双输入 ...

  5. STM32WU55蓝牙开发学习笔记(1)

    STM32WU55蓝牙开发学习笔记(1) 前言 我在本科的时候主要是做机械结构的,参加过RM和RC,现在研究生在一个做传感器的课题组,直接转行做电控了,G.研究生阶段的第一个项目是,多通道采集肌电信号 ...

  6. 离开当前屏幕的判断方法_掌中宝系列之EMG电动门调整方法

    EMG电动门调整方法 1.不带液晶屏的EMG电动门调整方法 就地操作开关按钮图 首先设定进入learn 模式(调试模式) 先按下LT按钮并保持,同时把S1拔钮开关移至Learn位置(注意顺序不能反,一 ...

  7. Laya官方不会告诉你的坑(微信小游戏系列)

    Laya官方不会告诉你的坑(微信小游戏系列) 使用laya2系列调试微信小游戏的时候, 发现了以下问题, 看了一圈官网也没提及, 所以记录一下供大家参考和讨论. 1.报错 ReferenceError ...

  8. qcc514x-qcc304x调试笔记

    QCC514X-QCC304X系列调试笔记,用的高通QCC5141芯片,基于qcc514x-qcc304x-src-1-0_qtil_standard_oem_earbud-ADK-21.1-CS2- ...

  9. Python 代码调试二三事

    ♚ 作者王维栋,网易游戏运维与基础架构部,产品软件设计师,专注于智能监控.性能优化等领域. 本文来自<网易游戏运维平台 (neteasegameops)>微信公众号的投稿,隶属于网易游戏运 ...

最新文章

  1. 厉害了!写代码、搜问题,全部都在「终端」完成!如此编程神器,是时候入手了...
  2. OSPF末节和完全末节实验
  3. 为什么叫python编程-python为什么叫爬虫
  4. 用Tableau制作滚动时间轴(下)
  5. Codeforces Round #486 (Div. 3)【完结】
  6. HttpURLConnection与 HttpClient 区别/性能测试对比
  7. 将5:400等类型的数据转成哈希表
  8. apache+mysql+wordpress的安装建站
  9. 第四章 ---- 事务RedisTemplate
  10. JFreechart 在linux下不显示及中文乱码问题
  11. 动态分配内存的初始化
  12. APACHE配置文件中文版 httpd.conf FOR Apache 2.2.4
  13. 2014最新苹果开发者账号注册流程图解分享
  14. 【连载】穿越计算机的迷雾——读书笔记
  15. 为资产分类定义折旧范围_SAP折旧范围
  16. 盘点7大影视类宝藏公众号,影迷/编导生必备,强烈推荐第3个【覃小龙课堂】
  17. 坚持十年博客写作,不忘初心,方得始终
  18. 为什么计算机打开u盘这么慢,电脑读取u盘文件速度慢
  19. 怎么彻底禁用Cortana小娜?
  20. 微信投票的自动运行脚本

热门文章

  1. 批量导出VSD文件到JPG文件 宏
  2. sql注入 Less-26-31
  3. android判断银行卡号格式不正确,android银行卡号验证算法 android银行卡号验证算法详解...
  4. python计算列表元素之和,python实现计算列表元素之和
  5. bpmn定义之camunda bpm生命周期
  6. 月入四万的程序员生活如同5000工资一样窘迫,钱都去哪了?
  7. db2与mysql编目_关于DB2相同的数据库编目问题
  8. python货币兑换_用python计算货币兑换
  9. 软碟通安装linux系统,使用U盘作为载体使用UltraISO软碟通安装Centos6.4
  10. unity 让ui对齐_Unity中UI锚点的四种摆放形式