山景BP10_128DBG开发板通过蓝牙连接手机放歌实验回顾

前言

最近在学习上海山景公司的BP10_128DBG的开发板,因为网上关于BP10开发板的帖子也比较少,在学习的时候也没有太多的参考资料,基本上都是官方的历程。蓝牙放歌这个demo对我来说也比较复杂,特写下此博客进行记录、总结,大家有需要的可以参考。

一:添加的文件、库、头文件路径

Bluetooth文件夹(基本把middleware下bluettoth的东西拿过来)

Inc文件夹就有一些头文件

src文件下就在音频解码播放的基础上添加了一个新的文件(bt_stack_service.c)

添加的头文件引用路径和链接到的.a静态库

 

二:A2dp_DecoderInit()函数

进入main之后,比较重要的一个函数就是A2dp_DecoderInit(),初始化一个MemHandle来记录音频信息(类似于存在SD卡的音频文件)。

SaveDataToSbcBuffer指定了记录A2dp音频流数据的函数

 

在SaveDataToSbcBuffer()函数中主要是通过刚才初始化的SBC_MemHandle来调用audio_decoder_initialize()进行音频解码初始化。因为蓝牙播放的数据来源不是存在TF卡或一个文件,而是存放在内存中的,所以audio_decoder_initialize()函数中的第三个参数是IO_TYPE_MEMORY。audio_decoder_initialize()函数传入的第四个参数的功能是指定特定的初始化、解码函数等。

三:BtStackServiceStart()函数

1:SetBtStackState()函数主要是初始化了btManager这个结构体中的stackState成员变量

2:BtStackServiceInit()函数主要是为btStackServiceCt、btStackConfigParams两个指针指向开辟的堆内存。

两个指针指向的内存空间

两个指针的初始化:

指向的堆内存空间:

3:LoadBtConfigurationParams()函数先将蓝牙相关配置参数从spi-flash读到btStackConfigParams所指向的数组中,然后对btStackConfigParams中的每个成员进行初始化

 

 将spi-flash中关于蓝牙相关的内容读取完之后就进行修改

4:ConfigBtBbParams(&bbParams)和Bt_init((void*)&bbParams)函数主要是对bbParams这一结构体进行初始化

5:SetBtPlatformInterface(&pfiOS, &pfiBtDdb)没有具体的实现函数,注释讲是主机内存相关初始化

6:BtStackServiceEntrance()先是调用了BtStackInit()函数、BtStackInit()函数主要是初始化了BtStackParams这个结构体,而且整个工程最后的while(1)也是在这个函数中。

在调用ConfigBtStackParams函数的时候要特别注意两个点(supportProfiles和a2dpAudioDataFormat),这两个就确定了蓝牙解码支持的协议(蓝牙音频是A2dp)和解码得到的数据格式(PCM)。

supportprofile:

 a2dpAudioDataFormat:

 

最后就是初始化g_playcontrol_app_context、g_playcontrol_profile、g_gap_mode这三个结构体

 

7:前面的初始化工作结束之后就是蓝牙协议栈工作(如果有播放音频),一个while(1)死循环。

8: A2dp_Decode()函数主要就是音频解码那一套,没有什么蓝牙相关的了,音频也是从DAC0输出。

 

四:蓝牙内存分配理解

到了这里蓝牙放歌历程基本就结束了,但是我还有一个疑问。就是关于BP10数据手册内存分配章节中蓝牙32K的内存空间是怎么分配的?如何将flash中蓝牙相关内容remap到内存中?

BP10内存分配图

接下来我就简单说一下我的理解,在前面调用ConfigBbParams这个函数初始化bbParams这个结构体的时候我没有注意到一个地方(params->em_start_addr = BB_EM_START_PARAMS)

 跳转到BB_EM_START_PARAMS这个宏定义的地方

有比较多敏感的数字,0x2004 8000是蓝牙内存开始的地方,大小刚好也是32K,而且上方有一段官方的注释(ram和MPU_START_ADDR进行了关联)

在bt_ddb_flash.c文件中有比较多关于蓝牙参数配置地址内容的描述

跳转到这些地址宏定义的地方,发现是在flash_config.h文件中定义的

然后我一直想找到官方到底是在工程的哪个地方调用了将flash中的内容remap到sram中,因为官方有把flash的驱动remap到内存这个操作,但是蓝牙的这一操作我一直没有找到(有知道的友友可以在评论区留言)。我最后猜测是在Bt_init函数中实现了这一操作,但是这个函数没有具体的实现(被编译成了.a静态库),我也不知道自己的想法是否正确。

官方将flash_driver的代码remap到sram中

 

总结

以上就是我对上海山景BP10_128DBG开发板蓝牙放歌历程的一个理解,非常感谢你能看到这。

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

门牙会稍息

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值