6 Platform API 参考
6.2 platform_32k_rc_tune
使用给定参数调谐内部的 32k RC 时钟。
6.2.2 参数表
uint16_t value
调谐参数 (从
platform_32k_rc_auto_tune
得到)
6.3 platform_config
配置平台功能。
6.3.2 参数表
const platform_cfg_item_t item
指定要配置的项。可以是下列值:
PLATFORM_CFG_LOG_HCI
: HCI 消息的 printf 打印。默认值:关闭。PLATFORM_CFG_POWER_SAVING
: 省电功能。默认值:关闭。PLATFORM_CFG_TRACE_MASK
: Trace 数据项的比特图。默认值:0
。typedef enum { = 0, PLATFORM_TRACE_ID_EVENT = 1, PLATFORM_TRACE_ID_HCI_CMD = 2, PLATFORM_TRACE_ID_HCI_EVENT = 3, PLATFORM_TRACE_ID_HCI_ACL = 4 PLATFORM_TRACE_ID_LLCP } platform_trace_item_t;
PLATFORM_CFG_RC32K_EN
: 使能/禁用内部 32k RC 时钟。默认值:使能。PLATFORM_CFG_OSC32K_EN
: 使能/禁用外部 32k 晶体。默认值:使能。PLATFORM_CFG_32K_CLK
: 32k 时钟源选择。参数为platform_32k_clk_src_t
类型。默认值:PLATFORM_32K_RC
typedef enum { , // 外部 32k 晶体 PLATFORM_32K_OSC// 内部 32k RC 时钟 PLATFORM_32K_RC } platform_32k_clk_src_t;
当修改本配置时,RC32K 和 OSC32K 必须同时处理使能、运行状态:
- 对于 OSC32K,等待直到 OSC32K 的状态变为 OK;
- 对于 RC32K,使能后等待 100us。
提示:在关闭不用的时钟前再等待 100us。
PLATFORM_CFG_32K_CLK_ACC
: 声明 32k 时钟的精度(ppm)。PLATFORM_CFG_32K_CALI_PERIOD
: 32k 时钟的校准间隔(秒)。默认值:3600 * 2 (2 小时)。PLATFORM_CFG_DEEP_SLEEP_TIME_REDUCTION
: 睡眠时间预留量(深睡眠模式)(微秒)。默认值:~550us。PLATFORM_CFG_SLEEP_TIME_REDUCTION
: 睡眠时间预留量(其它睡眠模式)(微秒)。默认值: ~450us.PLATFORM_CFG_LL_DBG_FLAGS
: 链路层标志位,是ll_cfg_flag_t
中各比特的组合。typedef enum { = 1, // 关闭 CTE 预处理 LL_FLAG_DISABLE_CTE_PREPROCESSING = 4, // 仅使用 legacy 广播发起连接 LL_FLAG_LEGACY_ONLY_INITIATING = 8, // 仅扫描 legacy 广播 LL_FLAG_LEGACY_ONLY_SCANNING } ll_cfg_flag_t;
PLATFORM_CFG_LL_LEGACY_ADV_INTERVAL
: 链路层 legacy 广播内部间隔(微秒),其中高 16 比特用于高频度广播 (high duty cycle),低 16 比特用于正常频度广播(normal duty cycle)。高频度广播的默认值:1250, 正常频度的默认值:1500。
const uint32_t flag
对于可以使能、禁用的配置,用下面的值进行控制:
PLATFORM_CFG_ENABLE
PLATFORM_CFG_DISABLE
6.4 platform_get_heap_status
得到堆当前的状态信息,如剩余空间等。
6.6 platform_get_version
得到 platform 的版本号。
6.8 platform_install_isr_stack
为中断服务程序安装新的栈。
6.9 platform_printf
Platform 内部的 printf
函数。
6.12 platform_read_info
读取 platform 信息。
6.13 platform_read_persistent_reg
读取持久化寄存器的值。参考
platform_write_persistent_reg
。
6.13.3 返回值
用 platform_write_persistent_reg
写入的 4 个比特。
6.15 platform_set_evt_callback
为 platform 事件设置回调函数。
6.15.1 原型
void platform_set_evt_callback(platform_evt_callback_type_t type,
,
f_platform_evt_cb fvoid *user_data);
6.15.2 参数表
platform_evt_callback_type_t type
事件的类型。可以是下列值:
PLATFORM_CB_EVT_PUTC
: ASCII 字符输出事件当 platform 要输出字符串日志时会触发该事件。传递到回调函数的参数
void *data
是从char *
转换得来。用
ingWizard
创建新项目时,如果在Common Function
页面选择了Print to UART
, 会自动生成相关代码。PLATFORM_CB_EVT_PROFILE_INIT
: BLE GATT profile 初始化事件当 Host 初始化时会触发该事件要求 app 初始化 GATT profile。
用
ingWizard
创建新项目时,会自动生成相关代码。PLATFORM_CB_EVT_ON_DEEP_SLEEP_WAKEUP
: 深睡眠唤醒事件深睡眠中唤醒时触发该事件。在深睡眠时,外部接口(如 UART,,I2C 等)都已掉电,所以当唤醒时, 可能需要再次初始化。
用
ingWizard
创建新项目时,如果在Common Function
页面选择了Deep Sleep
, 会自动生成相关代码。PLATFORM_CB_EVT_QUERY_DEEP_SLEEP_ALLOWED
: 深睡眠许可查询事件当 platform 准备进入深睡眠时,会触发该事件询问 app 当前是否允许进入深睡眠。 事件回调函数可通过返回
0
拒绝,返回非0
允许。用
ingWizard
创建新项目时,如果在Common Function
页面选择了Deep Sleep
, 会自动生成相关代码。PLATFORM_CB_EVT_HARD_FAULT
: Hard fault 事件Hard fault 发生时触发该事件。传入回调函数的
void *data
参数是从hard_fault_info_t *
转换得来。 如果未定义该回调,当事件发生时,CPU 进入死循环。PLATFORM_CB_EVT_ASSERTION
: Software assertion fails软件断言失败时触发该事件。传入回调函数的
void *data
参数是从assertion_info_t *
转换得来。 如果未定义该回调,当事件发生时,CPU 进入死循环。PLATFORM_CB_EVT_LLE_INIT
: 链路层引擎初始化完成事件每当链路层引擎初始化完成时触发该事件。
PLATFORM_CB_EVT_HEAP_OOM
: 堆空间用完事件在堆上分配内存失败时触发该事件。 如果未定义该回调,当事件发生时,CPU 进入死循环。
PLATFORM_CB_EVT_TRACE
: Trace 输出事件当有 trace 数据项要输出时,触发该事件。 Apps 可以为该事件设置回调函数以保存或者输出 trace 数据。传人回调函数的
void *data
参数是从platform_trace_evt_t *
转换得来(参见 调试与跟踪)。typedef struct { const void *data1; const void *data2; uint16_t len1; uint16_t len2; } platform_evt_trace_t;
一个 trace 数据项由
data1
和data2
组成。说明:len1
或者len2
可能为0
,但不会同时为0
;如果回调函数发现无法存储或者输出长度为
len1
+len2
的数据,那么应该同时丢弃data1
和data2
以防 trace 数据结构混乱。
f_platform_evt_cb f
注册到事件
type
的回调函数。f_platform_evt_cb
的类型为:typedef uint32_t (*f_platform_evt_cb)(void *data, void *user_data);
void *user_data
这个参数将原封不动地作为
user_data
传递给回调函数。
6.16 platform_set_irq_callback
为中断请求设置回调函数。
开发者不需要定义 IRQ 处理函数,而是通过设置回调实现。两种芯片系列的中断请求总结于表 6.1 和表 6.2。
外设类型 | 数量 | 备注 |
---|---|---|
RTC | 1 | Real Time Clock |
TIMER | 3 | Timer |
GPIO | 1 | General Purpose Input/Output |
SPI | 2 | Serial Peripheral Interface |
UART | 2 | Universal Asynchronous Receiver-Transmitter |
I2C | 2 | Inter-Integrated Circuit |
外设类型 | 数量 | 备注 |
---|---|---|
RTC | 1 | Real Time Clock |
GPIO | 2 | General Purpose Input/Output |
TIMER | 3 | Timer |
WDT | 1 | Watch dog |
PDM | 1 | Pulse Density Modulation |
APBSPI | 1 | Serial Peripheral Interface on APB |
QSPI | 1 | Quad serial peripheral interface |
I2S | 1 | Inter-IC Sound |
UART | 2 | Universal Asynchronous Receiver-Transmitter |
I2C | 2 | Inter-Integrated Circuit |
DMA | 1 | Direct Memory Access |
KEYSCAN | 1 | Key Scanner |
PWM | 1 | Pulse Width Modulation |
IR INT | 1 | Infrared Interrupt |
IR WAKEUP | 1 | Infrared Wake-up Interrupt |
USB | 1 | Universal Serial Bus |
6.16.1 原型
void platform_set_irq_callback(platform_irq_callback_type_t type,
,
f_platform_irq_cb fvoid *user_data);
6.16.2 参数表
platform_irq_callback_type_t type
中断类型。
对于 ING918xx,中断类型如下:
, PLATFORM_CB_IRQ_RTC, PLATFORM_CB_IRQ_TIMER0, PLATFORM_CB_IRQ_TIMER1, PLATFORM_CB_IRQ_TIMER2, PLATFORM_CB_IRQ_GPIO, PLATFORM_CB_IRQ_SPI0, PLATFORM_CB_IRQ_SPI1, PLATFORM_CB_IRQ_UART0, PLATFORM_CB_IRQ_UART1, PLATFORM_CB_IRQ_I2C0 PLATFORM_CB_IRQ_I2C1
对于 ING916xx,中断类型如下:
, PLATFORM_CB_IRQ_RTC, PLATFORM_CB_IRQ_GPIO0, PLATFORM_CB_IRQ_GPIO1, PLATFORM_CB_IRQ_TIMER0, PLATFORM_CB_IRQ_TIMER1, PLATFORM_CB_IRQ_TIMER2, PLATFORM_CB_IRQ_WDT, PLATFORM_CB_IRQ_PDM, PLATFORM_CB_IRQ_APBSPI, PLATFORM_CB_IRQ_QSPI, PLATFORM_CB_IRQ_SADC, PLATFORM_CB_IRQ_I2S, PLATFORM_CB_IRQ_UART0, PLATFORM_CB_IRQ_UART1, PLATFORM_CB_IRQ_I2C0, PLATFORM_CB_IRQ_I2C1, PLATFORM_CB_IRQ_DMA, PLATFORM_CB_IRQ_KEYSCAN, PLATFORM_CB_IRQ_PWM, PLATFORM_CB_IRQ_IR_INT, PLATFORM_CB_IRQ_IR_WAKEUP, PLATFORM_CB_IRQ_IR_USB
f_platform_irq_cb f
注册到中断
type
的回调函数。f_platform_irq_cb
的类型为:typedef uint32_t (*f_platform_irq_cb)(void *user_data);
void *user_data
这个参数将原封不动地作为
user_data
传递给回调函数。
6.17 platform_shutdown
将整个系统(SoC)置于关机状态,并在一段指定时间后重新启动。可选地, 可以指定保持一段内存,重启之后,app 可继续使用其中的数据。
需要注意这个函数不会返回,除非无法进入关机状态。可能导致无法进入关机状态的原因有:
- 外部唤醒信号有效;
- 输入参数有误;
- 内部设备正忙。
6.17.1 原型
void platform_shutdown(const uint32_t duration_cycles,
const void *p_retention_data,
const uint32_t data_size);
6.20 sysSetPublicDeviceAddr
设置设备的公共地址(public address).
BLE 设备的公共地址是 48 比特的唯一标识(EUI-48),遵照 IEEE 802-2014 standard20 创建。