00. 目录
文章目录
01. FR801xH概述
FR801xH 系列芯片是面向SOC(片上系统),易于快速开发的低功耗蓝牙芯片。基于 Freqchip 的蓝牙智能固件和协议栈的支持,完全兼容蓝牙 V5.3(LE 模式)协议。同时用户可以基于芯片内置的 ARM CorteM3 嵌入式 32 位高性能单片机开发各种应用程序。
蓝牙智能固件包括 L2CAP 服务层协议、安全管理器 (SM)、属性协议(ATT)、通用属性配置文件 (GATT)和通用访问配置文件(GAP)。此外,还 支持应用程序配置文件,例如接近度、健康温度计、 心率、血压、血糖、人机界面设备(HID)和 SDK (包括驱动程序、OS-API 等)。SDK 还集成了用于网络应用程序的 SIG Mesh 协议。
采用 Freqchip 的创新技术,将 PMU(锂电池充电 器+LDO)、带 XIP 模式的 QSPI FLASH ROM、 I2C、UART、GPIO、ADC、PWM 集成在一块芯片中,为客户提供:
- 竞争力的功耗
- 稳定的蓝牙连接
- 极低的 BOM 成本
02. FR801xH功能框图
03. FR801xH SDK结构
FR801xH SDK 是运行于 FR801xH 上的软件包,包含了 BLE 5.0 的完整协议栈,芯片的外设驱动以及操作系统抽象层 OSAL。
FR801xH SDK 的架构如下图所示。SDK 包含了完整的 BLE 5.0 协议栈,包括完整的 controller,host,profile,SIG Mesh部分。其中蓝牙协议栈的 controller 和 host 部分以及操作系统抽象层 OSAL 都是以库的形式提供,图中为灰色部分。MCU 外设驱动和 profile,以及应用层的例程代码,都是以源码的形式提供,图中为绿色部分。
04. FR801xH地址空间
FR801xH 的地址空间如下:
其中内置 128KB ROM,主要内容为启动代码、BLE controller 部分协议栈;FLASH 空间用于存储用户程序、用户数据等;RAM 用于存储各种变量、堆栈、重新映射后的中断向量地址、对运行速度较为敏感的代码(中断响应等)等,该空间都支持低功耗的 retention 功能;外设地址空间是各种外设的地址映射,用于进行外设的配置。
05. FR801xH空间分配
在 FR801xH 中 FLASH 空间和 RAM 空间的分配由链接脚本指定,具体分配如下:
其中 JUMP_TABLE 存储的是配置信息;APP CODE 和 RO DATA 可以通过 XIP 被 MCU 直接访问;CRITICAL CODE 和EXCEPTION and INTERRUPT HANDLER 为对运行时间敏感的用户代码,需要在初始化时从 flash 中搬移到 RAM 中;RW DATA 需要进行初始化;ZI 为初始值为 0 的数据段。这些操作均由 SDK 内部进行处理,用户无需做额外操作。HEAP 为动态内存分配空间,SDK 中会根据实际可用空间对内存管理单元进行初始化;STACK 为堆栈空间,生长空间由高到低,大小可由用户指定。
06. FR801xH代码流程
SDK 包含了四大部分,Application 部分,蓝牙协议栈部分,操作系统抽象层 OSAL 部分,还有 MCU 外设驱动部分。整个代码结构比较简单,执行流程也很清晰易懂。SDK 的 main 函数主体入口位于 lib 库中,对于应用层以源码形式开放了一些入口,用于应用开发初始化,基本流程如下图所示:
user_custom_parameters 函数
该函数示例:
void user_custom_parameters(void)
{
__jump_table.addr.addr[0] = 0x01;
__jump_table.addr.addr[1] = 0x01;
__jump_table.addr.addr[2] = 0x01;
__jump_table.addr.addr[3] = 0x01;
__jump_table.addr.addr[4] = 0x01;
__jump_table.addr.addr[5] = 0xc1;
__jump_table.image_size = 0x19000; // 100KB
__jump_table.firmware_version = 0x00010000;
__jump_table.system_clk = SYSTEM_SYS_CLK_48M;
jump_table_set_static_keys_store_offset(0x30000);
}
该函数实现了设置本机蓝牙地址、设置程序文件上限、版本信息、配置系统时钟为 48M;配置协议栈中使用的key(包括 IRK,椭圆曲线加密算法中的 public key 和 privatekey)在 flash 中的保存地址为 0x30000(默认地址即为0x30000)。用户可以根据实际需求进行相应的配置。
user_entry_before_ble_init 函数
该函数示例:
void user_entry_before_ble_init(void)
{
/* set system power supply in BUCK mode */
pmu_set_sys_power_mode(PMU_SYS_POW_BUCK);
pmu_enable_irq(PMU_ISR_BIT_ACOK
| PMU_ISR_BIT_ACOFF
| PMU_ISR_BIT_ONKEY_PO
| PMU_ISR_BIT_OTP
| PMU_ISR_BIT_LVD
| PMU_ISR_BIT_BAT
| PMU_ISR_BIT_ONKEY_HIGH);
NVIC_EnableIRQ(PMU_IRQn);
/* AT command interface */
app_at_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 的创建等。
睡眠唤醒用户接口
在系统使能睡眠后,LIB 中主代码会判断是否满足进入睡眠条件,针对开始睡眠前和唤醒后分别提供了入口供用户进行自定义系统行为。
user_entry_before_sleep_imp
该函数在进入睡眠前被调用,用户可在里面实现控制 GPIO 的状态保持(针对 GPIO 在系统工作和睡眠状态下的控制参见外设驱动章节)等行为。
user_entry_after_sleep_imp
在系统唤醒后,用户可以在该函数中重新进行外设的初始化(进入睡眠后外设的状态因为掉电都会丢失)等操作。
07. FR801xH中__jump_table
__jump_table 结构体中保存了一些配置信息:
08. FR801xH SDK项目工程
SDK 以源码形式提供了多个项目工程作为参考,用户可以在这些工程上进行自己的应用开发。这些工程采用了同样的目录结构,如下图所示:
deng@local:~$ tree -L 3 FR801xH-SDK-master/
FR801xH-SDK-master/
├── components
│ ├── ble
│ │ ├── include
│ │ ├── library
│ │ └── profiles
│ ├── driver
│ │ ├── driver_adc.c
│ │ ├── driver_codec.c
│ │ ├── driver_efuse.c
│ │ ├── driver_exti.c
│ │ ├── driver_i2s.c
│ │ ├── driver_iic.c
│ │ ├── driver_keyscan.c
│ │ ├── driver_pdm.c
│ │ ├── driver_pmu.c
│ │ ├── driver_pmu_pwm.c
│ │ ├── driver_pmu_qdec.c
│ │ ├── driver_pwm.c
│ │ ├── driver_rtc.c
│ │ ├── driver_ssp.c
│ │ ├── driver_system.c
│ │ ├── driver_timer.c
│ │ ├── driver_uart.c
│ │ ├── driver_wdt.c
│ │ ├── include
│ │ └── IR
│ ├── modules
│ │ ├── adpcm_ima
│ │ ├── adpcm_ima_fangtang
│ │ ├── adpcm_ms
│ │ ├── aes
│ │ ├── aes_cbc
│ │ ├── audio_code_adpcm
│ │ ├── audio_code_sbc
│ │ ├── audio_decode
│ │ ├── audio_encode
│ │ ├── button
│ │ ├── common
│ │ ├── crc32
│ │ ├── decoder
│ │ ├── FreeRTOS
│ │ ├── lowpow
│ │ ├── md5
│ │ ├── os
│ │ ├── patch
│ │ ├── peripherals
│ │ ├── platform
│ │ ├── RingBuffer
│ │ ├── sha256
│ │ └── sys
│ └── toolchain
│ └── gcc
├── docs
│ ├── Application Notes
│ ├── FR801xH specification V1.1.pdf
│ ├── FREQ BLE SDK User Guide V1.0.8.pdf
│ ├── Hardware Reference Design
│ │ ├── FR8012HB_RD_V1.0.pdf
│ │ ├── FR8016HA_RD_V1.1.pdf
│ │ └── FR8018HA_RD_V1.1.pdf
│ ├── hl err code.txt
│ └── ll err code.txt
├── examples
│ ├── dev1.0
│ │ ├── ble_multi_role
│ │ ├── ble_simple_central
│ │ └── ble_simple_peripheral
│ └── none_evm
│ ├── ble_AT
│ ├── ble_audio_adc
│ ├── ble_aux_adv_demo
│ ├── ble_drivers_demo
│ ├── ble_hid_kbd_mice
│ ├── ble_mesh
│ ├── ble_multi_role
│ ├── ble_simple_central
│ ├── ble_simple_muti_salve
│ ├── ble_simple_peripheral
│ ├── drivers_iic_demo
│ └── rtos_demo
├── project
│ ├── build
│ │ ├── test
│ │ ├── test.bin
│ │ ├── test.map
│ │ ├── test.out
│ │ └── test.txt
│ ├── demo_peripheral.c
│ ├── demo_peripheral.h
│ ├── down.sh
│ ├── flash_usage_config.h
│ ├── ldscript.ld
│ ├── Makefile
│ ├── proj_main.c
│ ├── time_rtc.c
│ ├── time_rtc.h
│ ├── user_task.c
│ └── user_task.h
└── README.md
59 directories, 47 files
其中 application 用于存放用户应用层的代码,自定义的 profile 等;driver 中为外设驱动;platform 中为异常向量入口和部分异常的处理函数;patch 中为针对 ROM code 中的一些补丁代码;lib 中为封装好的库文件,其中所提供的接口在 gatt_api.h、gap_api.h 等文件中。
在当前的 SDK 中提供了一下几种 sample 工程:
HID 例程:ble_hid_kbd_mice
Mesh 例程:ble_mesh
主机例程:ble_simple_central
从机例程:ble_simple_peripheral
09. FR801xH烧录
芯片烧录方式主要有两种:
- 基于 Keil + J-Link 的烧录方式
- 采用 PC 烧录工具+串口进行烧录。