1. Home
  2. 博客

    在采用非 Nordic 微控制器的设计中实现高级电源管理与电量计功能

在采用非 Nordic 微控制器的设计中实现高级电源管理与电量计功能

Nordic Semiconductor

在本篇技术博客中,我们将演示如何把 Nordic Semiconductor 的 PMIC 运行在非 Nordic 系统级芯片之上。目的是梳理软件平台需要具备哪些条件,才可以将 Nordic Semiconductor 任意一款 PMIC 集成到产品设计当中。本文分为两个部分:第一部分讲解 npmx 驱动的集成;第二部分实现 PMIC 的剩余电量计功能。虽然本篇博客以 nPM1300 作为讲解对象,文中内容同样适用于所有 nPM 系列器件。

电源管理集成电路(PMIC)在现代电子设备中发挥着关键作用,对于电池供电的便携设备而言更是如此。随着嵌入式系统日趋复杂,能效的重要性持续提升,设计人员需要借助高性能 PMIC 完成电源分配、电池充电以及系统状态监控。Nordic Semiconductor 的 nPM 系列 PMIC 凭借高集成度、使用灵活性以及低功耗特性获得广泛认可,是无线与物联网应用的热门选择。尽管这类 PMIC 经常搭配 Nordic 自家的系统级芯片使用,但仍有很多开发者希望将其与第三方微控制器配合使用,从而充分利用 PMIC 完善的功能。

在本篇技术博客中,我们将演示如何把 Nordic Semiconductor 的 PMIC 运行在非 Nordic 系统级芯片之上。目的是梳理软件平台需要具备哪些条件,才可以将 Nordic Semiconductor 任意一款 PMIC 集成到产品设计当中。本文分为两个部分:第一部分讲解 npmx 驱动的集成;第二部分实现 PMIC 的剩余电量计功能。虽然本篇博客以 nPM1300 作为讲解对象,文中内容同样适用于所有 nPM 系列器件。

供参考:本次演示测试工程基于意法半导体的 CubeMX 集成开发环境搭建,硬件采用 STM32F401 微控制器,软件使用 FreeRTOS。

背景

Nordic Semiconductor 的电源管理芯片(PMIC)产品系列旨在为电池供电的物联网产品实现最高能效、高集成度以及便捷统一的开发体验。所有 Nordic Semiconductor PMIC 在设计上均经过优化,可搭配 Nordic nRF52、nRF53、nRF54 以及 nRF91 无线系统级芯片使用;同时也能够和其他采用 Cortex‑M4、Cortex‑M3 或 Cortex‑M33 架构的非‑Nordic 系统级芯片协同工作。

nPM1300 是一款面向可充电应用的高集成度电源管理芯片(PMIC)。nPM1300 集成多项电源与系统管理功能,可以省去不少外围专用器件。电源管理依靠灵活的电源稳压电路,以及线性模式锂离子(Li‑ion)、锂聚合物(Li‑poly)、磷酸铁锂(LiFePO₄)电池充电器来实现。

nPM1300 支持最大 800 mA 的充电电流,可输出最高 500 mA 的可调稳压电压。它通过两路可配置的双模式 200 mA BUCK 降压稳压器为外部器件供电;另外还有两路复用端口,既可以作为 50 mA 的 LDO,也可以充当 100 mA 负载开关。非稳压电源轨在由电池供电时最大输出电流可达 1340 mA;若由配置为 DCP 的 USB 端口供电,则最高可达 1.5 A。

主机可以读取电池的温度、电压以及电流数据,供电量计算法使用。该电量计可以向上层应用输出电池剩余电量估值,其效果与库仑计相当,但功耗要低得多。

芯片内置的系统管理功能有助于降低应用方案的物料成本与 PCB 尺寸。该器件集成了下述功能:

  • 系统级看门狗
  • 智能掉电预警
  • 运输模式与休眠模式,延长电池存放寿命
  • 最多 5 路 GPIO 引脚以及 3 路 LED 驱动器
  • 系统监控器
  • 专为嵌入式物联网应用打造的超低功耗、高精度电量计

系统管理功能以及输入输出端口通过兼容 I2C 的双线接口(TWI)完成配置。

使用 npmx 驱动进行开发

若要基于 nPM 器件以及 npmx 驱动开展开发工作,首先需要克隆驱动代码仓库。npmx 驱动可通过以下 GitHub 链接获取:https://github.com/NordicSemiconductor/npmx/tree/v1.2.0

注意:在本篇博客发布之后,可能已经推出更新的版本。

这些驱动程序与实时操作系统(RTOS)无关,因此你既可以在裸机环境下使用,也可以在自选的 RTOS 环境中运行。

当你克隆完npmx GitHub 代码库之后,得到的目录结构应如下所示:

a directory structure like this

在非 Zephyr 环境下进行开发时,主要用到的文件夹为 adk、backends 以及 drivers。

adk 文件夹存放 nPM1300 和 nPM1304 所需的头文件。这些头文件包含寄存器地址以及代码其他地方会用到的结构体声明。当代码中加入 #include <npmx.h> 时,就会引入这部分专用文件。

backends 文件夹存放后端的结构体定义,其中包含 I2C 读写函数的函数指针。

drivers 文件夹包含 nPM 系列每一个功能模块对应的源代码,涵盖该电源管理芯片的核心模块、ADC、充电器、GPIO,以及其他各项功能。

npmx GitHub 代码库内提供了一份移植指南,帮助开发者上手 npmx 驱动的开发工作。 https://github.com/NordicSemiconductor/npmx/blob/v1.2.0/PORTING.md

移植指南重点说明的一项核心工作,就是将系统级芯片的 I2C 函数与 npmx 驱动进行对接。移植指南演示了用于初始化 nPM 核心的函数调用,同时也演示如何把后端数据结构体和读写函数调用建立关联。

你需要定义 npmx_instance 与 npmx_backend 这两个结构体。它们将作为 npmx 驱动函数以及 I2C 后端使用的句柄,把指定的一组 I2C 读写函数绑定到一个 npmx PMIC 驱动实例上。

以下是移植指南中的一段摘录。

static npmx_instance_t npm1300_instance;
static npmx_backend_t npm1300_backend;

static npmx_error_t my_i2c_write_function(void * p_context, uint32_t register_address, uint8_t * p_data, size_t num_of_bytes);
static npmx_error_t my_i2c_read_function(void * p_context, uint32_t register_address, uint8_t * p_data, size_t num_of_bytes);

随后该移植指南示范了如何初始化 npmx 驱动内核;此过程会将实例结构体与后端结构体建立关联,并完成 nPM 器件核心功能的初始化。

static void my_npmx_initialization_function(void)
{
    //Associate the I2C Read and Write to backend data structure used in npmx drivers
    npm1300_backend.p_read = my_i2c_read_function;
    npm1300_backend.p_write = my_i2c_write_function;
    npm1300_backend.p_context = NULL; // Optional context for our use

    npmx_error_t npmx_err = npmx_core_init(&npm1300_instance, &npm1300_backend, NULL, true);
    // TODO: Verify that npmx_err == NPMX_SUCCESS
}

由于本篇博客使用的是 STM32,对应的读写函数调用如下所示。这类调用会根据项目所选用的系统级芯片与函数库有所不同,同时也取决于你是直接使用 SDK 的 HAL 库,还是自行编写底层函数。

npmx_error_t my_i2c_write_function(void * p_context, uint32_t register_address, uint8_t * p_data, size_t num_of_bytes)
{
    uint8_t tx_buffer[ I2C_BUF_SIZE ] = { 0 };
    npmx_error_t ret;
    HAL_StatusTypeDef stm_ret;

    tx_buffer[ 0 ] = ( uint8_t ) ( ( register_address >> 8 ) & 0xFF );
    tx_buffer[ 1 ] = ( uint8_t ) ( register_address & 0xFF );

    for (uint8_t cnt = 0; cnt < num_of_bytes; cnt++)
    {
      tx_buffer[ cnt + 2 ] = p_data[ cnt ];
    }
    stm_ret = HAL_I2C_Master_Transmit(&hi2c1, NPM13xx_ADDR << 1,tx_buffer,num_of_bytes+2, TIMEOUT );

    if (stm_ret != HAL_OK) {
      ret = NPMX_ERROR_INVALID_PARAM;
    } else {
      ret = NPMX_SUCCESS;
    }

    return ret;
}
npmx_error_t my_i2c_read_function(void * p_context, uint32_t register_address, uint8_t * p_data, size_t num_of_bytes)
{
    uint8_t rx_buffer[ 2 ] = { 0 };
    npmx_error_t ret;
    HAL_StatusTypeDef stm_ret;

    rx_buffer[ 0 ] = ( uint8_t ) ( ( register_address >> 8 ) & 0xFF );
    rx_buffer[ 1 ] = ( uint8_t ) ( register_address & 0xFF );

    stm_ret = HAL_I2C_Master_Transmit(&hi2c1, NPM13xx_ADDR << 1,rx_buffer,2, TIMEOUT);
    if (stm_ret != HAL_OK) {
            ret = NPMX_ERROR_INVALID_PARAM;
    } else {
            ret = NPMX_SUCCESS;
    }

    stm_ret = HAL_I2C_Master_Receive(&hi2c1,NPM13xx_ADDR<< 1, p_data, num_of_bytes, TIMEOUT);
    if (stm_ret != HAL_OK) {
            ret = NPMX_ERROR_INVALID_PARAM;
    } else {
            ret = NPMX_SUCCESS;
    }

    return ret;
}

请注意,my_i2c_read_function 与 my_i2c_write_function 的返回值类型为 npmx_error_t。而你目标系统级芯片自带 I2C 函数的返回类型并不与之相同。因此需要做一次简单的返回值类型转换,把 I2C 调用的返回结果转换成 npmx_error_t 类型。

至此我们已经搭建完成 I2C 通信框架,后续访问 nPM 器件各项功能时,不再需要额外直接调用 I2C 传输接口。在 npmx 驱动的框架内部,nPM 器件的每一个功能模块都提供独立的函数调用。在 drivers 文件夹下,可以看到各个模块对应的源代码:ADC、BUCK、GPIO、VBUS 等等。

当你想要选用某个功能模块时,只需要把已经定义好的 npmx_instance 结构体传入各模块所使用的数据结构即可。举例来说,如果需要使用 nPM1300 的充电器相关功能,可以调用 npmx_charger_get() 函数,并传入此前已经通过 npmx_core_init() 完成定义与初始化的 npmx_instance 结构体。npmx_charger_get() 会返回一个 npmx_charger_t 类型的句柄;后续其他 npmx_charger_<xxx>() 系列函数就把该句柄作为入参使用。

npmx_charger_t * charger = npmx_charger_get(&npm1300_instance, 0);

大家可以发现,npmx 驱动里面的所有模块(USB、充电器、BUCK、LDO / 负载开关等)都设有这类数据结构体,并且配套对应的 get() 获取函数。

因此,每当你打算使用某一个模块时,都需要调用 npmx_<xxx>_get() 函数,从顶层的 npmx_instance 实例中获取该模块对应的数据结构体。

之后你就可以把获取到的模块结构体传入该模块下的各个函数接口。

举个例子,如上定义好充电器模块结构体之后,在调用函数时传入该充电器结构体,即可访问充电器的全部功能。通过这种方式,代码就会引用你先前在 my_npmx_initialization_function(void) 函数内定义的 I2C 读写接口。下方代码通过向各个函数传入 *charger 结构体,实现充电器的开启与关闭、终止电压设置以及充电电流的配置。

// Disable charger before changing charge current.
    ret = npmx_charger_module_disable_set(charger,NPMX_CHARGER_MODULE_CHARGER_MASK );

    // Set charging current.
    charger->charging_current_ua = NPM_BCHARGER_CHARGING_CURRENT_DEFAULT;
    ret = npmx_charger_charging_current_set(charger, charger->charging_current_ua);

    /* Set maximum discharging current. */
    charger->discharging_current_ma = NPM_BCHARGER_DISCHARGING_CURRENT_DEFAULT;
    ret = npmx_charger_discharging_current_set(charger, charger->discharging_current_ma);

    // Set battery termination voltage in Normal and Warm temperature.
    ret =npmx_charger_termination_normal_voltage_set(charger, npmx_charger_voltage_convert(4200));  //4.2V
    /* Set battery termination voltage in warm temperature. */
    ret =npmx_charger_termination_warm_voltage_set(charger, npmx_charger_voltage_convert(4000));  //4.0V

    // Enable charger for events handling.
    ret = npmx_charger_module_enable_set(charger,NPMX_CHARGER_MODULE_CHARGER_MASK | NPMX_CHARGER_MODULE_RECHARGE_MASK );

监控 PMIC 状态以及操作其各项功能,存在若干种实现方式。

你可以通过 I2C 对 nPM 器件进行轮询、采用仅基于 I2C 的任务执行方式、借助 GPIO 对 PMIC 实施直接硬件控制,或是利用 nPM 器件的 GPIO 向主机系统级芯片触发中断。

1、通过 I2C 轮询

不依靠中断信号唤醒主机系统级芯片,你可以经由 I2C 接口手动读取 nPM1300 的事件寄存器,完成轮询。

  • 工作原理: 读取各类 EVENTS* 事件寄存器(例如位于地址 0x16 的 EVENTSVBUSIN0SET,或是地址 0x22 的 EVENTSGPIOSET),以此判断是否发生了指定事件。
  • 局限性: 轮询方案整体功耗通常不如中断驱动的设计。主机微控制器无法一直保持深度休眠,必须保持运行或者定期唤醒读取寄存器;而中断方案下 MCU 可以一直深度休眠,直至收到信号之后再被唤醒。

2、直接硬件控制(控制输入模式)

如果你希望使用 GPIO 来实现控制逻辑,而非上报状态,则可以将 nPM1300 的 GPIO 配置为控制输入,而不是中断触发信号。【引脚配置】

功能说明: 在此模式下,nPM1300 的物理引脚可以直接控制内部器件,无需主机系统级芯片的软件参与,也不需要使用中断。举例而言,可以把某路 GPIO 做如下配置:

  • 通过 BUCKENCTRL 开启 / 关闭 BUCK 稳压器
  • 通过 LDSW1GPISEL 或者 LDSW2GPISEL 控制负载开关(LDSW)
  • 设置工作模式与保持(retention)模式对应的电压档位

3、仅通过 I2C 执行任务

部分任务(例如喂狗,也就是触发 nPM1300 的看门狗定时器 (WDT))无法通过 GPIO 触发,只能经由 I2C 接口完成操作。 如果你的应用本身就需要频繁进行 I2C 通信,那么直接通过 I2C 处理各类事件就可以适配现有的软件架构,无需额外使用一根专用的中断信号线。

4、GPIO 产生中断信号

将引脚的 GPIOMODE 设置为 GPOIRQ,当发生已配置的系统事件时,PMIC 会把该信号线拉高。 所有系统事件共用这一路 GPIO;一旦中断被触发之后,主机必须通过 I2C 读取 PMIC 的事件寄存器,以此判断究竟是哪一个事件引发了中断。 可以单独分配一路 GPIO 用于提示即将发生掉电预警,也可以使用 GPIO 反馈内部看门狗定时器超时的状态。

功耗方面的重要提示

如果你致力于把整机功耗降到最低(例如达到 4‑5 μA 级别),倘若配置不当,主机微控制器上的 GPIO 中断反而有可能增大整机电流消耗。 如果不使用中断信号线,可以保证主机持续维持低功耗状态;但与此同时,PMIC 将无法在发生事件(例如接入 VBUS 或者出现电池故障)时立刻 “唤醒” 主机。

本篇博客基于 STM32 搭建的演示项目采用了 GPIO 产生中断的方案。由 nPM 器件的一路 GPIO 向主机系统级芯片发出中断信号。需要将该路 PMIC 的 GPIO 的 GPIOMODE 设置为 GPOIRQ,使它具备中断输出功能;该引脚再连接至主机处理器的 GPIO,主机侧引脚需要配置为检测来自 nPM 器件的电平变化并触发中断。

应用程序需要为每一类希望接收的中断编写回调函数,并开启对应的中断。同时还需要针对 nPM 器件上每一个已启用的事件创建回调。

可调用 npmx_core_register_cb 与 npmx_core_event_interrupt_enable 这两个函数完成相关设置。

下方代码示例演示了如何创建多个回调函数并启用各项中断。

/* register callbacks for all events of the nPM*/
    /* Register callback for VBUS events. */
    npmx_core_register_cb(&npm1300_instance, vbus_callback, NPMX_CALLBACK_TYPE_EVENT_VBUSIN_VOLTAGE);
    /* Register callback for ADC events. */
    npmx_core_register_cb(&npm1300_instance, adc_callback, NPMX_CALLBACK_TYPE_EVENT_ADC);
    /* Register callback for battery events. */
    npmx_core_register_cb(&npm1300_instance, charger_battery_callback, NPMX_CALLBACK_TYPE_EVENT_BAT_CHAR_BAT);
    /* Register callback for charger status events. */
    npmx_core_register_cb(&npm1300_instance, charger_status_callback,  NPMX_CALLBACK_TYPE_EVENT_BAT_CHAR_STATUS);



//  Enable USB connections interrupts and events handling.
    npmx_core_event_interrupt_enable(&npm1300_instance, NPMX_EVENT_GROUP_VBUSIN_VOLTAGE, NPMX_EVENT_GROUP_VBUSIN_DETECTED_MASK |
                NPMX_EVENT_GROUP_VBUSIN_REMOVED_MASK);

    /* Enable all charging status interrupts and events. */
    npmx_core_event_interrupt_enable(
        &npm1300_instance, NPMX_EVENT_GROUP_BAT_CHAR_STATUS,
        NPMX_EVENT_GROUP_CHARGER_SUPPLEMENT_MASK | NPMX_EVENT_GROUP_CHARGER_TRICKLE_MASK |
            NPMX_EVENT_GROUP_CHARGER_CC_MASK | NPMX_EVENT_GROUP_CHARGER_CV_MASK |
            NPMX_EVENT_GROUP_CHARGER_COMPLETED_MASK |
            NPMX_EVENT_GROUP_CHARGER_ERROR_MASK);

    /* Enable battery interrupts and events. */
    npmx_core_event_interrupt_enable(&npm1300_instance, NPMX_EVENT_GROUP_BAT_CHAR_BAT,
                     NPMX_EVENT_GROUP_BATTERY_DETECTED_MASK | NPMX_EVENT_GROUP_BATTERY_REMOVED_MASK);

    /* Enable ADC measurements ready interrupts. */
    npmx_core_event_interrupt_enable(&npm1300_instance, NPMX_EVENT_GROUP_ADC, NPMX_EVENT_GROUP_ADC_BAT_READY_MASK);

当主机处理器检测到中断之后,必须调用 npmx_core_interrupt 函数通知 npmx 驱动。该调用会在 npmx 内部置位一个标志位。 真正的中断处理工作是在调用 npmx_core_proc 函数时执行的。该函数会读取并清除事件寄存器,同时执行应用层已经注册好的回调函数。

npmx_core_interrupt(&npm1300_instance); //This sets a flag in npmx
err=npmx_core_proc(&npm1300_instance);  //Process the interrupt

附件工程里面的 GPIO 中断服务程序(ISR)仅完成标志位置位,并且调用 npmx_core_interrupt()。随后由任务 TASK01 检测该标志,并调用 npmx_core_proc() 执行后续处理。

电量计(Fuel gauge)

Nordic 针对 nPM 系列电源管理芯片的电量计量方案,依托电池模型,再配合运行于主机系统级芯片上的 Nordic 电量计算法实现。

在 Nordic 的 nPM PMIC 当中,电量计功能用于估算电池剩余电量(SoC,0‑100%);该功能结合采集的测量数据以及电池专属模型完成估算,并非单纯依靠读取电压。

适用于 nPM1300 与 nPM1304(可充电电池):

  1. PMIC 负责采集电池的电流、电压以及温度数据。
  2. 电池模型(需要事先在 nPM PowerUP PC 应用程序中对目标电芯做特征分析生成),以数学方式描述该款电池的特性。【nPM1300/1304 电量计概述】
  3. 运行在主机系统级芯片(例如 nRF52、nRF53、nRF54、nRF91)上的电量计算法,将实时测量数据与电池模型运算,输出经过温度补偿、结果稳定的剩余电量估算值;额定工况下误差通常可以控制在 ±3% 以内。

针对 nPM2100(一次电池、不可充电电芯,例如 AA/AAA、CR 纽扣电池):

  • Nordic 提供可运行于 Arm Cortex‑M4/M33 系统级芯片(如 nRF52、nRF53、nRF54)上的电量计算法,用于估算碱性 AA/AAA 以及锂‑二氧化锰纽扣电池的剩余电量(SoC)。【nPM2100 电量计简介】
  • 该算法采用一种电池模型,对多颗电芯的电压与内阻特性取平均,以此为一次电池实现标准化的剩余电量估算。【nPM2100 电池模型】
  • 本算法专为超低功耗场景设计,仅在工作时段执行运算,不会额外唤醒芯片。【nPM2100 功耗说明】

简而言之,nPM 器件的电量计量是 Nordic 基于模型的超低功耗方案,用来精准追踪电池剩余可用电量,而非仅仅检测电压。

若要在你的系统级芯片上启用电量计算法,你必须将电池模型以及 nRF Fuel Gauge 函数库一并集成到项目当中。

若要在产品设计中集成电池模型,可以从下面三种方案里面选择其一:

  • 生成自定义配置文件: 借助 nRF Connect for Desktop 套件内的 nPM PowerUP 应用,针对你所用的特定电池生成专属配置文件。
  • 从应用内置模型库导出: 通过 nPM PowerUP PC 软件,从软件已完成特征分析的电池模型列表中导出 battery_model.inc 文件。
  • 使用 Nordic 标准模型: 直接使用 Nordic 预先提供的现成 .inc 电池模型(适用于部分 Renata 锂聚合物电芯,例如 ICP641620PA01.inc、ICP621333PA01.inc);下载之后即可在项目内直接作为 battery_model.inc 使用。【电量计量模型】

如需在代码里引入 battery_model.inc 文件,需要在 battery_model 结构体内部对该文件进行引用。

static const struct battery_model battery_model = {
#include "battery_model.inc"
};

若要在设计中集电量计函数库(Fuel Gauge Library),你需要确认主机系统级芯片所要使用的具体算法版本。各类库文件存放路径: https://github.com/nrfconnect/sdk-nrfxlib/tree/main/nrf_fuel_gauge。你可以根据实际选用的 Cortex 内核器件,并且选择硬件浮点或者软件浮点版本。 使用 nPM130x 系列时,请引入 libnrf_fuel_gauge.a; 如果是 nPM2100,则使用 libnrf_fuel‑gauge_primary.a。

注意:如果使用 STM32Cube、NXP MCUXpresso 这类集成开发环境,在项目中添加库文件时会存在一些限制。这类开发环境通常不识别 .a 文件后缀,同时也不允许文件名以 lib 作为开头。 因此我在 STM32Cube 环境下使用时,将库文件名修改为 nrflib_fuel_gauge,并去掉了 .a 后缀。

你需要从以下路径复制 nrf_fuel_gauge.h 头文件: https://github.com/nrfconnect/sdk-nrfxlib/tree/main/nrf_fuel_gauge/include

电量计的基础框架代码可以在 GitHub 仓库中查阅: https://github.com/NordicSemiconductor/npmx-zephyr/blob/main/samples/fuel_gauge/src/fuel_gauge.c

该仓库的示例面向在 Zephyr 环境下使用 npmx 驱动。由于本篇博客是在 Zephyr 之外的平台运行 nPM130x 器件,因此已经对这份代码做了部分修改,移除了所有 Zephyr 专属的函数调用。

启用电量计需要调用的两个主要函数为 fuel_gauge_init() 和 fuel_gauge_process()。

调用 fuel_gauge_update() 函数时,该函数内部会进而调用 nrf_fuel_gauge_process();你必须提供 t_delta(浮点型)参数【nRF Fuel Gauge API】。 该数值代表上一次电量计更新与本次更新之间的时间差,而不是系统上电之后累计经过的时长。

虽然该函数库并未强制要求按照固定时间间隔采集测量数据,但依据设备运行状态,建议采用如下运行频率:

  • 工作状态:算法每 1 秒执行一次
  • 充电状态:建议间隔 0.5 秒
  • 空闲状态:每 5 秒执行一次
  • 超低功耗模式:如果追求极低功耗,可以唤醒并调用处理函数,间隔设置为 10 分钟甚至更长

如果工作电流过小,导致 PMIC 无法完成精确测量(例如微安级别),可以调用 nrf_fuel_gauge_idle_set(),向函数库告知预期电流值,而不再继续执行迭代运算。

除此之外,还可以通过向函数库上报外部事件(例如电池充电状态)来进一步提升计量精度。该场景请使用 nrf_fuel_gauge_ext_state_update() 函数。

结束语

本篇博客的演示工程基于 STM32F401,使用了 nPM1300 的基础操作以及电量计相关功能。工程仓库地址: https://github.com/WesC-sys/Blog-STM32-nPM1300

工程内包含多组函数调用,用于演示 nPM1300 的内核与外设功能,同时实现了电量计。该工程一共运行两个任务:Task01 实现了电量计与事件处理系统,会输出电量计得到的电池状态,仅当电池相关事件触发时才打印事件信息;Task02 仅打印自身已经进入任务的提示信息。

这篇博客演示了如何将 Nordic nPM 系列 PMIC 移植到第三方厂商的系统级芯片平台。借助 npmx 驱动、电量计库以及配套算法,nPM 系列电源管理芯片可以适配任意系统级芯片的硬件设计。

 

 

 

短距离

适用于短距离物联网的蓝牙低功耗及多协议系统级芯片(支持Thread、Matter、Zigbee协议)

长距离

适用于LTE-M/NB-IoT、GNSS、DECT NR+和NTN的蜂窝物联网系统级封装

Wi-Fi

低功耗Wi-Fi 6协同ICs,支持2.4 GHz/5 GHz频段选项及WPA3加密协议

电源管理ICs

适用于电池供电设备的电源管理IC(PMIC),nPM系列提供充电与稳压功能选项。

AI及软件工具

工具与NPU加速边缘人工智能开发和部署

订阅Nordic新闻简报

了解最新信息!订阅后即可获取最新Nordic及物联网资讯

立即订阅