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
请按照以下步骤操作构建并运行该示例:
打开工程文件。
按照 快速入门 中 编译 APP Image 给出的步骤构建目标文件。
编译成功后,在路径
mdk\bin
或gcc\bin
下会生成 app binapp_MP_xxx.bin
文件。按下 reset 按键,开始运行。
测试验证
EVB 启动复位后,执行 LPC 初始化时在 Debug Analyzer 工具内观察 log。
driver_lpc_init
当 P2_4 检测到的电压小于 2000mV 时,触发
LPC_INT_LPCOMP_VOL
中断,在 Debug Analyzer 工具内打印 log 如下。LPCOMP_Handler [app] app_handle_io_msg: LPC low voltage detection msg.
代码介绍
该章节分为以下几个部分:
源码路径
工程路径:
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_init
,app_le_profile_init
等为 privacy 管理模块相关的初始化,参考 LE Peripheral Privacy 中的初始化流程介绍。
与外设相关的初始化流程具体如下:
在
board_init
中,执行board_lpc_init
,该函数为 LPC 相关引脚的 PAD/PINMUX 设置,包含如下流程:配置 PAD:设置引脚、SW 模式、PowerOn、无内部上拉、输出失能。
配置 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); }
在执行
os_sched_start()
开启任务调度后,在app_main_task
主任务内,执行driver_init
对外设驱动进行初始化配置。在
driver_init
中执行driver_lpc_init
,该函数为 LPC 外设的初始化,包含如下流程:设置 LPC 比较通道为 P2_4 引脚通道。
设置 LPC 电压检测极性为
LPC_Vin_Below_Vth
,即低于设置的电压阈值触发 LPC 比较中断。设置电压阈值为 2000mV。
使能 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); }
功能实现
在主函数中执行
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); }
当检测到 P2_4 的输入电压低于 2000mV 时,触发
LPC_INT_LPCOMP_VOL
中断,进入中断处理函数LPCOMP_Handler
。失能
LPC_INT_LPCOMP_VOL
中断。定义消息类型
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; } }