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. RTC相关类型
位于 components\driver\include\driver_rtc.h。
#define PMU_REG_RTC_SETTINGS 0x3d
#define PMU_RTC_EN CO_BIT(0)
#define PMU_RTC_UPDATE_EN CO_BIT(1)
#define PMU_RTC_ALARM_A_EN CO_BIT(2)
#define PMU_RTC_ALARM_B_EN CO_BIT(3)
#define PMU_RTC_ALMA_INT_EN CO_BIT(4)
#define PMU_RTC_ALMB_INT_EN CO_BIT(5)
#define PMU_RTC_ALMA_PO_EN CO_BIT(6) //rtc alarm a power on
#define PMU_RTC_ALMB_PO_EN CO_BIT(7)
#define PMU_REG_RTC_UPDATE_0 0x3e
#define PMU_REG_RTC_UPDATE_1 0x3f
#define PMU_REG_RTC_UPDATE_2 0x40
#define PMU_REG_RTC_UPDATE_3 0x41
#define PMU_REG_RTC_ALMA_VALUE_0 0x42
#define PMU_REG_RTC_ALMA_VALUE_1 0x43
#define PMU_REG_RTC_ALMA_VALUE_2 0x44
#define PMU_REG_RTC_ALMA_VALUE_3 0x45
#define PMU_REG_RTC_ALMB_VALUE_0 0x46
#define PMU_REG_RTC_ALMB_VALUE_1 0x47
#define PMU_REG_RTC_ALMB_VALUE_2 0x48
#define PMU_REG_RTC_ALMB_VALUE_3 0x49
#define PMU_REG_RTC_VALUE_0 0x72
#define PMU_REG_RTC_VALUE_1 0x73
#define PMU_REG_RTC_VALUE_2 0x74
#define PMU_REG_RTC_VALUE_3 0x75
enum rtc_idx_t
{
RTC_A,
RTC_B,
};
注意:
RTC 默认支持低功耗模式。
04. RTC相关API
4.1 rtc_init
/*********************************************************************
* @fn rtc_init
*
* @brief Initialize rtc module.
*
* @param None
*
* @return None.
*/
void rtc_init(void);
功能:
初始化 pmu_rtc。调用任何pmu_rtc函数前,需要首先调用该函数。
参数:
None
返回值:
None
4.2 rtc_alarm
/*********************************************************************
* @fn rtc_alarm
*
* @brief start running a rtc.
*
* @param rtc_idx - RTC_A or RTC_B, @ref rtc_idx_t
* count_ms - timer duration with ms as unit. range [1,4294967]
*
* @return None.
*/
void rtc_alarm(enum rtc_idx_t rtc_idx, uint32_t count_ms);
功能:
启动某个 rtc 定时器。
参数:
rtc_idx - 要启动的 pmu_rtc。@ref enum rtc_idx_t
count_ms - 要启动的 pmu_rtc 的定时时间。单位 ms。范围 1~4294967
返回值:
None
4.3 rtc_disalarm
/*********************************************************************
* @fn rtc_disalarm
*
* @brief stop a running rtc.
*
* @param rtc_idx - RTC_A or RTC_B, @ref rtc_idx_t
*
* @return None.
*/
void rtc_disalarm(enum rtc_idx_t rtc_idx);
功能:
停止某个 rtc 定时器。
参数:
rtc_idx 要启动的 pmu_rtc。@ref enum rtc_idx_t
返回值:
None
4.4 rtc_isr_ram
__attribute__((weak)) __attribute__((section("ram_code"))) void rtc_isr_ram(uint8_t rtc_idx)
功能:
pmu_rtc 中断 weak 函数。用于需要重定义来获取中断的入口
参数:
rtc_idx RTC 中断源。RTC_A,RTC_B 分别表示 2 个 RTC 的中断。
返回值:
None
05. RTC程序示例
程序示例
#include "driver_rtc.h"
#include "time_rtc.h"
__attribute__((section("ram_code"))) void rtc_isr_ram(uint8_t rtc_idx)
{
if (rtc_idx == RTC_A)
{
co_printf("RTC_A\r\n");
}
if (rtc_idx == RTC_B)
{
co_printf("RTC_B\r\n");
}
}
void peripheral_demo(void)
{
co_printf("rtc demo\r\n");
rtc_init();
rtc_alarm(RTC_A, 1);
rtc_alarm(RTC_B, 1000);
}
运行结果
[16-17-12-138]收←◆freqchip
[16-17-12-201]收←◆user_entry_after_ble_init
[16-17-12-217]收←◆rtc demo
RTC_A
[16-17-13-199]收←◆RTC_B