BP10xx-按键ADC
功能概述
ADC按键功能通过定时扫描ADC通道的电压值,识别不同的按键输入。当检测到按键事件时,系统会通过消息机制将事件传递给主任务进行处理。
配置代码
代码解析
- 条件编译:在
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)
来判断是否启用按键扫描功能。如果满足任一条件,则执行按键扫描相关代码。 - 定时器设置:
IsTimeOut(&ScanTimer)
用于检查定时器ScanTimer
是否超时。如果超时,调用TimeOutSet(&ScanTimer, 10)
将定时器重置为10个系统滴答周期。 - 按键扫描:调用
KeyScan()
函数进行按键扫描。如果返回的消息IDmsgSend.msgId
不等于MSG_NONE
,则表示检测到有效的按键事件。 - 消息发送:在
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
测试用例
- 按键按下:
- 输入:按下ADC按键。
- 预期输出:
KeyScan
函数返回有效的消息ID,主任务接收到按键消息并处理。
- 按键未按下:
- 输入:未按下任何ADC按键。
- 预期输出:
KeyScan
函数返回MSG_NONE
,主任务未接收到按键消息。
注意事项
- 定时器精度:确保
ScanTimer
的定时精度满足按键扫描的需求。定时器超时时间应根据实际应用场景进行调整。 - 消息机制:
MessageSend
函数用于任务间通信,确保消息队列已正确初始化,且主任务能够正确处理接收到的按键消息。 - 调试信息:
APP_DBG
宏用于输出调试信息,方便开发和调试过程中跟踪按键事件的发送情况。
相关重要API解释
MessageId KeyScan(void);//这个是扫描结果返回MessageId