Voltage Detection

该示例验证 LPC 电压检测功能,当检测 P2_4 的输入电压高于设定阈值时会触发 LPC 中断。

备注

  • 可作为电压检测作用的引脚为 P2_0 ~ P2_7、Vbat,检测电压阈值范围:80mV~3200mV

环境需求

该示例支持以下开发套件:

开发套件

Hardware Platforms

Board Name

RTL8752H HDK

RTL8752H EVB

更多信息请参考 快速入门

硬件连线

连接 LPC 电压比较引脚 P2_4 和外部输入电压。

编译和下载

该示例的工程路径如下:

Project file: board\evb\io_sample\LPC\VoltageDetection\mdk

Project file: board\evb\io_sample\LPC\VoltageDetection\gcc

请按照以下步骤操作构建并运行该示例:

  1. 打开工程文件。

  2. 按照 快速入门编译 APP Image 给出的步骤构建目标文件。

  3. 编译成功后,在路径 mdk\bingcc\bin 下会生成 app bin app_MP_xxx.bin 文件。

  4. 按照 快速入门MP Tool 给出的步骤将 app bin 烧录至 EVB 内。

  5. 按下 reset 按键,开始运行。

测试验证

  1. EVB 启动复位后,执行 LPC 初始化时在 Debug Analyzer 工具内观察 log。

    driver_lpc_init
    
  2. 当 P2_4 检测到的电压小于 2000mV 时,触发 LPC_INT_LPCOMP_VOL 中断,在 Debug Analyzer 工具内打印 log 如下。

    LPCOMP_Handler
    [app] app_handle_io_msg: LPC low voltage detection msg.
    

代码介绍

该章节分为以下几个部分:

  1. 源码路径

  2. 初始化函数将在 初始化 章节介绍。

  3. 初始化后的功能实现将在 功能实现 章节介绍。

源码路径

  • 工程路径: sdk\board\evb\io_sample\LPC\VoltageDetection

  • 源码路径: sdk\src\sample\io_sample\LPC\VoltageDetection

该工程的工程文件代码结构如下:

└── Project: voltage_detect
    └── secure_only_app
        └── include
            ├── app_define.h
            └── rom_uuid.h
        ├── cmsis                    includes CMSIS header files and startup files
            ├── overlay_mgr.c
            ├── system_rtl876x.c
            └── startup_rtl876x.s
        ├── lib                      includes all binary symbol files that user application is built on
            ├── rtl8752h_sdk.lib
            ├── gap_utils.lib
            └── ROM.lib
        ├── peripheral               includes all peripheral drivers and module code used by the application
            ├── rtl876x_rcc.c
            ├── rtl876x_nvic.c
            ├── rtl876x_pinmix.c
            └── rtl876x_lpc.c
        ├── profile
        └── app                      includes the ble_peripheral user application implementation
            ├── main.c
            ├── ancs.c
            ├── app.c
            ├── app_task.c
            └── io_lpc.c

初始化

当 EVB 复位启动时,调用 main() 函数,将执行以下流程:

int main(void)
{
    extern uint32_t random_seed_value;
    srand(random_seed_value);
    board_init();
    le_gap_init(APP_MAX_LINKS);
    gap_lib_init();
    app_le_gap_init();
    app_le_profile_init();
    pwr_mgr_init();
    task_init();
    os_sched_start();

    return 0;
}

备注

le_gap_init()gap_lib_init()app_le_gap_initapp_le_profile_init 等为 privacy 管理模块相关的初始化,参考 LE Peripheral Privacy 中的初始化流程介绍。

与外设相关的初始化流程具体如下:

  1. board_init 中,执行 board_lpc_init ,该函数为 LPC 相关引脚的 PAD/PINMUX 设置,包含如下流程:

    1. 配置 PAD:设置引脚、SW 模式、PowerOn、无内部上拉、输出失能。

    2. 配置 PINMUX:设置引脚为 IDLE 模式。

    void board_lpc_init(void)
    {
        Pad_Config(LPC_CAPTURE_PIN, PAD_SW_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_DISABLE,
                PAD_OUT_HIGH);
        Pinmux_Config(LPC_CAPTURE_PIN, IDLE_MODE);
    }
    
  2. 在执行 os_sched_start() 开启任务调度后,在 app_main_task 主任务内,执行 driver_init 对外设驱动进行初始化配置。

  3. driver_init 中执行 driver_lpc_init ,该函数为 LPC 外设的初始化,包含如下流程:

    1. 设置 LPC 比较通道为 P2_4 引脚通道。

    2. 设置 LPC 电压检测极性为 LPC_Vin_Below_Vth ,即低于设置的电压阈值触发 LPC 比较中断。

    3. 设置电压阈值为 2000mV。

    4. 使能 LPC 电压检测,打开 LPC 电压比较中断 LPC_INT_LPCOMP_VOL

    void driver_lpc_init(void)
    {
        DBG_DIRECT("driver_lpc_init");
        LPC_DeInit();
        LPC_InitTypeDef LPC_InitStruct;
        LPC_StructInit(&LPC_InitStruct);
    
        LPC_InitStruct.LPC_Channel   = LPC_CAPTURE_CHANNEL;
        LPC_InitStruct.LPC_Edge      = LPC_VOLTAGE_DETECT_EDGE;
        LPC_InitStruct.LPC_Threshold = LPC_VOLTAGE_DETECT_THRESHOLD;
        LPC_Init(&LPC_InitStruct);
        LPC_Cmd(ENABLE);
    
        LPC_INTConfig(LPC_INT_LPCOMP_VOL, ENABLE);
    }
    

功能实现

  1. 在主函数中执行 os_sched_start() ,开启任务调度。当 stack 准备好时,执行 app_handle_dev_state_evt ,执行 nvic_lpc_init ,配置并使能 LPC 的 IRQ 通道。

    void nvic_lpc_init(void)
    {
        /* Config LPC interrupt */
        NVIC_InitTypeDef NVIC_InitStruct;
        NVIC_InitStruct.NVIC_IRQChannel = LPCOMP_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelPriority = 3;
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStruct);
    
        LPC_INTCmd(ENABLE);
    }
    
  2. 当检测到 P2_4 的输入电压低于 2000mV 时,触发 LPC_INT_LPCOMP_VOL 中断,进入中断处理函数 LPCOMP_Handler

    1. 失能 LPC_INT_LPCOMP_VOL 中断。

    2. 定义消息类型 IO_MSG_TYPE_BAT_LPC ,发送消息至 app task。主 task 检测到消息后,打印相应信息。

    void LPCOMP_Handler(void)
    {
        LPC_INTConfig(LPC_INT_LPCOMP_VOL, DISABLE);
        APP_PRINT_INFO0("LPCOMP_Handler\r\n");
        T_IO_MSG int_lpc_msg;
    
        int_lpc_msg.type = IO_MSG_TYPE_BAT_LPC;
        if (false == app_send_msg_to_apptask(&int_lpc_msg))
        {
            APP_PRINT_ERROR0("[io_lpc] LPCOMP_Handler: Send int_lpc_msg failed!");
            return;
        }
    
    }