本帖最后由 ng473405_232647745 于 2020-5-31 23:28 编辑

1.芯片简介
     FR8016HA是富芮坤公司出品的一款Bluetooth V5.0 (LE Mode) SOC,支持最高2M的数据速率。芯片内部内置了一个32位MCU,工作频率最高可达48MHz。
     蓝牙固件包含了L2CAP,SM,ATT,GATT和GAP,并且进程了SIM Mesh网络应用。
sshot-1.png
   1.1 蓝牙控制器
   支持多种设备类型:广播者,主机,观察者,外设。
    支持多种数据包类型:广播,数据,控制。
    AES/CCM加密。
    位流处理(CRC,白化)。
    调频算法。
    低功耗模式支持内部32KHz RC振荡器或外部32.768KHz振荡器。
    支持在协议空闲期间基带关闭。
1.2 音频接口
    嵌入式16位单声道音频编码器。
    DAC和ADC,支持最48KHz采样率。
1.3 外设接口
   UART,IIC,SPI。
   最多17个GPIO,可用于ADKey和其他模拟输入的10位ADC。
   PWM控制器,硬件LED控制器。
   可编程的定时器,看门狗。

1.4 集成的电源控制和管理
  嵌入式上电复位,低功耗0.9V核心电压。
  保护软件关机和硬件唤醒。
  内置电压检测。
  支持电池充电,嵌入式LVD。
   可编程的充电电流,快速充电支持最大200mA。

2. SDK结构
  FR801xH SDK 是运行于 FR801xH 上的软件包,包含了如下几大块:
   BLE 5.0 的完整协议栈:包括controller, host, profile, SIG Mesh 部分 ;
                                       Host和Controller部分以库的形式提供,不可见实现。
   操作系统抽象层 OSAL:OS相关操作如任务管理、消息队列、内存管理等接口的实现,以库的形式提供。
   芯片的外设驱动:片内设备和资源的驱动,以源码提供。
   应用层例程:在此SDK基础上的一些应用例程,以源码提供。


SKD的组成和关系如下图,OS和蓝牙协议栈的功能通过API接口提供给用户的应用程序来使用,用户的软件直接使用协议栈封装好的上层功能,如GAP、GATT和Mesh的操作,对芯片上的外设驱动源码直接使用。

sshot-2.png
SDK文件结构如下:


./examples:
All the sample codes we provide. More examples are added from time to time.
包含各种例程代码,后续会不停添加更多

./components:
Specific codes related to BLE stack and the relevant profiles.
蓝牙协议栈接口及相应的profile。

./tools:
The tools for debugging and flashing.
调试烧录相关的工具等



3. 空间分配
FR8016HA的地址空间分配如下
sshot-3.png
各部分的功能和组成如下:

128KB的ROM是固化的启动代码、BLE 控制器部分协议栈,用户不可见不可修改空间。

512KB的Flash空间是用户程序或数据的存储空间,用户的应用程序最终存放的空间。
RAM存储各种变量、堆栈、重新映射后的中断向量地址、对运行速度较为敏感的代码(中断响应等)等,该空间都支持低功耗的 retention 功能,既在低功耗睡眠模式下仍能保持数据不丢失;外设地址空间是各种外设的地址映射,用于进行外设的配置。

在 FR801xH 中 FLASH 空间和 RAM 空间的分配由链接脚本指定,具体分配如下
sshot-4.png
JUMP_TABLE 存储的是配置信息;
APP CODE 和 RO DATA 可以通过 XIP 被 MCU 直接访问,既代码最终中直接在flash中运行,不需要加载到RAM中再运行;
CRITICAL CODE 和EXCEPTION and INTERRUPT HANDLER 为对运行时间敏感的用户代码,需要在初始化时从 flash 中搬移到 RAM 中;
RW DATA 需要进行初始化;
ZI 为初始值为 0 的数据段。
这些操作均由 SDK 内部进行处理,用户无需做额外操作。 HEAP 为动态内存分配空间, SDK 中会根据实际可用空间对内存管理单元进行初始化; STACK 为堆栈空间,
生长空间由高到低,大小可由用户指定。

协议栈的库文件导出了符号引用表,使应用编译中能有效的引用到库中的代码或数据。
sshot-7.png

指定 FLASH 空间和 RAM 空间分配的链接脚本在如下文件中:
sshot-8.png



4. 软件API和代码流程
SDK 的 main 函数主体入口位于 lib 库中,既应用代码中没有main函数,main和整体代码执行框架都在lib库中,对于应用层以源码形式开放了一些入口,这些入口在特定时候被lib库中的执行框架调用,使应用程序获得被调度运行的机会。


4.1 启动和初始化流程
  lib中main函数在启动阶段会调用一下外露的接口方法,用于应用开发初始化,基本流程如下图所示:


sshot-5.png

user_custom_parameters 函数:
该函数实现了设置本机蓝牙地址、设置程序文件上限、版本信息、 配置系统时钟为 48M;配置协议栈中使用的key(包括 IRK, 椭圆曲线加密算法中的 public key 和 privatekey)在 flash 中的保存地址为 0x30000(默认地址即为 0x30000)。 用户可以根据实际需求进行相应的配置。

user_entry_before_ble_init 函数
该函数实现了配置芯片供电模式为 BUCK,使能了一系列 PMU 部分的中断,配置了 AT 指令所使用的的串口等。

user_entry_after_ble_init 函数

user_entry_after_ble_init 为 BLE stack 在系统中初始化完成并成功创建 BLE stack task 后,用户进行自定义行为的入口,比如可以进行协议栈相关的一些操作,比如下图所示,可以进行 bond manager 的初始化, GAP 事件处理回调函数的注册, BLE 广播参数的设置, GATT service 的创建,用户 task 的创建等。



4.2 主程序的运行流程


sshot-6.png
在该流程中用户在睡眠前和唤醒后各有一个入口可以进行自定义的操作:
1. user_entry_before_sleep
该函数在进入睡眠前被调用,用户可在里面实现控制 GPIO 的状态保持(针对 GPIO 在系统工作和睡眠状态下的
控制参见外设驱动章节), 配置睡眠唤醒条件等行为。
2. user_entry_after_sleep
在系统唤醒后,用户可以在该函数中重新进行外设的初始化(进入睡眠后外设的状态因为掉电都会丢失)等操
作。