Skip to main content

BP10xx-按键ADC

功能概述

ADC按键功能通过定时扫描ADC通道的电压值,识别不同的按键输入。当检测到按键事件时,系统会通过消息机制将事件传递给主任务进行处理。

配置代码

代码解析

  1. 条件编译:在device_service中,使用条件编译指令#if defined(CFG_RES_ADC_KEY_SCAN) || defined(CFG_RES_IR_KEY_SCAN) || defined(CFG_RES_CODE_KEY_USE) || defined(CFG_ADC_LEVEL_KEY_EN) || defined(CFG_RES_IO_KEY_SCAN)来判断是否启用按键扫描功能。如果满足任一条件,则执行按键扫描相关代码。
  2. 定时器设置IsTimeOut(&ScanTimer)用于检查定时器ScanTimer是否超时。如果超时,调用TimeOutSet(&ScanTimer, 10)将定时器重置为10个系统滴答周期。
  3. 按键扫描:调用KeyScan()函数进行按键扫描。如果返回的消息IDmsgSend.msgId不等于MSG_NONE,则表示检测到有效的按键事件。
  4. 消息发送:在device_service.c通过KeyScan();得到MessageSend(deviceServiceCt.parentMsgHandle, &msgSend)将按键消息发送至freeRTOS消息队列进行处理。同时,使用APP_DBG宏输出调试信息,指示按键消息已发送。

逻辑流程图

以下是ADC按键功能的逻辑流程图:

mermaid复制graph TD
A[开始] --> B[检查条件编译标志]
B -->|满足条件| C[检查定时器超时]
C -->|超时| D[重置定时器]
D --> E[调用KeyScan进行按键扫描]
E -->|检测到有效按键| F[发送按键消息至主任务]
F --> G[输出调试信息]
G --> H[结束]
C -->|未超时| H
E -->|未检测到有效按键| H
B -->|不满足条件| H

测试用例

  1. 按键按下
    • 输入:按下ADC按键。
    • 预期输出KeyScan函数返回有效的消息ID,主任务接收到按键消息并处理。
  2. 按键未按下
    • 输入:未按下任何ADC按键。
    • 预期输出KeyScan函数返回MSG_NONE,主任务未接收到按键消息。

注意事项

  • 定时器精度:确保ScanTimer的定时精度满足按键扫描的需求。定时器超时时间应根据实际应用场景进行调整。
  • 消息机制MessageSend函数用于任务间通信,确保消息队列已正确初始化,且主任务能够正确处理接收到的按键消息。
  • 调试信息APP_DBG宏用于输出调试信息,方便开发和调试过程中跟踪按键事件的发送情况。

相关重要API解释

MessageId KeyScan(void);//这个是扫描结果返回MessageId