串口打印
1.打开lib库总开关
// app_config.h
#ifndef APP_CONFIG_H
#define APP_CONFIG_H
/*
* 系统打印总开关
*/
#ifdef CONFIG_RELEASE_ENABLE
#define LIB_DEBUG 1
#else
#define LIB_DEBUG 1
#endif
#define CONFIG_DEBUG_LIB(x) (x & LIB_DEBUG)
#define CONFIG_DEBUG_ENABLE
需要修改点:
- 宏LIB_DEBUG配置为1.
- 宏CONFIG_DEBUG_ENABLE需要被定义.
2.某些模块的的调试信息可能还有自己的单独开关
// app_config.c
const char log_tag_const_v_SETUP AT(.LOG_TAG_CONST) = FALSE; // verbose, 模块中比较冗余的信息。
const char log_tag_const_i_SETUP AT(.LOG_TAG_CONST) = FALSE; // info, 模块中一些基本的状态信息。
const char log_tag_const_w_SETUP AT(.LOG_TAG_CONST) = FALSE; // debug, 模块中用于定位问题的基本信息。
const char log_tag_const_d_SETUP AT(.LOG_TAG_CONST) = TRUE; // warning, 模块中用于定位问题的警告信息。
const char log_tag_const_e_SETUP AT(.LOG_TAG_CONST) = TRUE; // error, 模块中用于定位问题的错误信息。
3.使能硬件驱动开关
// xxx_cfg.h
//*********************************************************************************//
// UART配置 //
//*********************************************************************************//
#define TCFG_UART0_ENABLE ENABLE_THIS_MOUDLE //串口打印模块使能
#define TCFG_UART0_RX_PORT NO_CONFIG_PORT //串口接收脚配置(用于打印可以选择NO_CONFIG_PORT)
#define TCFG_UART0_TX_PORT IO_PORTA_05 //串口发送脚配置
#define TCFG_UART0_BAUDRATE 1000000 //串口波特率配置
4.添加自己的调试信息
printf
printf 是计算机行业内通用的终端打印信息的标准接口, 在开发环境中添加如下头文件后即可使用
#include "generic/printf.h"
相应的,如果有需要打印一块内存的十六进制数据,可使用put_buf接口,使用示例如下;
#include "generic/printf.h"
void printf_foo(void)
{
int tmp[50];
printf("Test Demo: %s:%d\n", __func__, __LINE__);
memset(tmp, 0x5A, sizeof(tmp));
put_buf(tmp, sizeof(tmp));
return;
}
log_xxx族接口
log_xxx族接口与printf的区别是该接口可以分模块控制,以及输出信息可以带模块名前缀,可以快速定位到对应模块输出的信息。举例文件举例文件 sdk/apps/hid/app_main.c`, 使用步骤如下:
在模块对应C文件开头增加如下修改
#define LOG_TAG_CONST APP
#define LOG_TAG "[APP]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
修改注意点:
- 定义LOG_TAG_CONST宏的命令与模块Debug名相同。
debug.h
文件被include的位置必须位于这些宏定义之后。
**2.**增加模块打印开关控制变量, 文件夹路径 apps/xxx/config/
用户应根据自己模块的属性放到合适的文件, 举例将app模块的控制开关放在 apps/hid/config/log_config.c`文件, 增加变量声明如下:
const char log_tag_const_v_APP AT(.LOG_TAG_CONST) = 0;
const char log_tag_const_i_APP AT(.LOG_TAG_CONST) = 1;
const char log_tag_const_d_APP AT(.LOG_TAG_CONST) = 1;
const char log_tag_const_w_APP AT(.LOG_TAG_CONST) = 1;
const char log_tag_const_e_APP AT(.LOG_TAG_CONST) = 1;
**3.**在对应模块添加调试信息,可用接口示例如下:
void log_foo(void)
{
int tmp[10];
log_info("I am info Message.\n");
log_debug("I am debug Message.\n");
log_error("I am error Message.\n");
memset(tmp, 0x5A, sizeof(tmp));
log_info_hexdump(tmp, sizeof(tmp)); //输出十六进制数据
log_error_hexdump(tmp, sizeof(tmp)); //输出十六进制数据
return;
}
上述示例输出信息如下:
void log_foo(void)
2 {
3 int tmp[10];
4
5 log_info("I am info Message.\n");
6 log_debug("I am debug Message.\n");
7 log_error("I am error Message.\n");
8
9 memset(tmp, 0x5A, sizeof(tmp));
10 log_info_hexdump(tmp, sizeof(tmp)); //输出十六进制数据
11 log_error_hexdump(tmp, sizeof(tmp)); //输出十六进制数据
12
13 return;
14 }
**4.**系统时间戳
在输出的log中存在系统时间戳,该时间戳代表输出该log时距离系统的上电时间,如果用户不需要输出该时间戳,可以通过修改文件 sdk/apps/xxx/config/lib_system_config.c
///打印是否时间打印信息
const int config_printf_time = 1;
UI常用配置
低电配置
// app_power_manage.h
#define LOW_POWER_SHUTDOWN 300 //低电直接关机电压-拔出不开机-开盖不开机
#define LOW_POWER_OFF_VAL 330 //低电关机电压
#define LOW_POWER_WARN_VAL 340 //低电提醒电压
#define LOW_POWER_WARN_TIME (60 * 1000) //低电提醒时间
KEY IO配置
添加按键
- 在iokey 配置里面定义多一个变量
// board_jl701n_demo_cfg.h
//*********************************************************************************//
// iokey 配置 //
//*********************************************************************************//
#define TCFG_IOKEY_ENABLE ENABLE_THIS_MOUDLE //是否使能IO按键
#define TCFG_IOKEY_POWER_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
#define TCFG_IOKEY_POWER_ONE_PORT IO_PORTB_01 //IO按键端口
#define TCFG_IOKEY_POWER_TWO_PORT IO_PORTB_02 //添加
- 在iokey_list结构体里面添加以下参数
// board_jl701n_demo.c
{
.connect_way = TCFG_IOKEY_POWER_CONNECT_WAY, //IO按键的连接方式
.key_type.one_io.port = TCFG_IOKEY_POWER_TWO_PORT, //IO按键对应的引脚
.key_value = 1, //按键值
},
-
在board_jl701n_demo.c文件里面进行消息设置
// board_jl701n_demo.c u8 key_table[KEY_NUM_MAX][KEY_EVENT_MAX] = { // SHORT LONG HOLD UP DOUBLE TRIPLE {KEY_MUSIC_PP, KEY_POWEROFF, KEY_POWEROFF_HOLD, KEY_NULL, KEY_CALL_LAST_NO, KEY_NULL}, //KEY_0 {KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_OPEN_SIRI, KEY_NULL}, //KEY_1 {KEY_MUSIC_PREV, KEY_VOL_DOWN, KEY_VOL_DOWN, KEY_NULL, KEY_HID_CONTROL, KEY_NULL}, //KEY_2 };
-
配置完成后,按下按键就会抛出对应的事件到app_earphone_key_event_handler里面
- 如:短按 PB2 就会抛出
KEY_MUSIC_NEXT
事件,我们可以在app_earphone_key_event_handler里面去处理一些按键功能
- 如:短按 PB2 就会抛出
按键事件 | 详情 |
---|---|
SHORT | 短按 |
LONG | 长按( 抛一次 ) |
HOLD | 长按( 抛多次 ) |
UP | 松开 |
DOUBLE | 双击 |
TRIPLE | 三级 |
KEY AD配置
一个AD按键
- 在board_jl701n_demo_cfg.h文件中使能AD按键,配置AD按键的端口以及电阻(TCFG_ADKEY_ADX)
// board_jl701n_demo_cfg.h
//*********************************************************************************//
// adkey 配置 //
//*********************************************************************************//
#define TCFG_ADKEY_ENABLE ENABLE_THIS_MOUDLE//是否使能AD按键
#define TCFG_ADKEY_PORT IO_PORTB_02 //AD按键端口(需要注意选择的IO口是否支持AD功能)
/*AD通道选择,需要和AD按键的端口相对应:
AD_CH_PA1 AD_CH_PA3 AD_CH_PA4 AD_CH_PA5
AD_CH_PA9 AD_CH_PA1 AD_CH_PB1 AD_CH_PB4
AD_CH_PB6 AD_CH_PB7 AD_CH_DP AD_CH_DM
AD_CH_PB2
*/
#define TCFG_ADKEY_AD_CHANNEL AD_CH_PB2
#define TCFG_ADKEY_EXTERN_UP_ENABLE ENABLE_THIS_MOUDLE //是否使用外部上拉
#if TCFG_ADKEY_EXTERN_UP_ENABLE
#define R_UP 220 //22K,外部上拉阻值在此自行设置
#else
#define R_UP 100 //10K,内部上拉默认10K
#endif
//必须从小到大填电阻,没有则同VDDIO,填0x3ffL
#define TCFG_ADKEY_AD0 (0) //0R
#define TCFG_ADKEY_AD1 (0x3ffL * 30 / (30 + R_UP)) //3k
#define TCFG_ADKEY_AD2 (0x3ffL * 62 / (62 + R_UP)) //6.2k
#define TCFG_ADKEY_AD3 (0x3ffL * 91 / (91 + R_UP)) //9.1k
#define TCFG_ADKEY_AD4 (0x3ffL * 150 / (150 + R_UP)) //15k
#define TCFG_ADKEY_AD5 (0x3ffL * 240 / (240 + R_UP)) //24k
#define TCFG_ADKEY_AD6 (0x3ffL * 330 / (330 + R_UP)) //33k
#define TCFG_ADKEY_AD7 (0x3ffL * 510 / (510 + R_UP)) //51k
#define TCFG_ADKEY_AD8 (0x3ffL * 1000 / (1000 + R_UP)) //100k
#define TCFG_ADKEY_AD9 (0x3ffL * 2200 / (2200 + R_UP)) //220k
#define TCFG_ADKEY_VDDIO (0x3ffL)
#define TCFG_ADKEY_VOLTAGE0 ((TCFG_ADKEY_AD0 + TCFG_ADKEY_AD1) / 2)
#define TCFG_ADKEY_VOLTAGE1 ((TCFG_ADKEY_AD1 + TCFG_ADKEY_AD2) / 2)
#define TCFG_ADKEY_VOLTAGE2 ((TCFG_ADKEY_AD2 + TCFG_ADKEY_AD3) / 2)
#define TCFG_ADKEY_VOLTAGE3 ((TCFG_ADKEY_AD3 + TCFG_ADKEY_AD4) / 2)
#define TCFG_ADKEY_VOLTAGE4 ((TCFG_ADKEY_AD4 + TCFG_ADKEY_AD5) / 2)
#define TCFG_ADKEY_VOLTAGE5 ((TCFG_ADKEY_AD5 + TCFG_ADKEY_AD6) / 2)
#define TCFG_ADKEY_VOLTAGE6 ((TCFG_ADKEY_AD6 + TCFG_ADKEY_AD7) / 2)
#define TCFG_ADKEY_VOLTAGE7 ((TCFG_ADKEY_AD7 + TCFG_ADKEY_AD8) / 2)
#define TCFG_ADKEY_VOLTAGE8 ((TCFG_ADKEY_AD8 + TCFG_ADKEY_AD9) / 2)
#define TCFG_ADKEY_VOLTAGE9 ((TCFG_ADKEY_AD9 + TCFG_ADKEY_VDDIO) / 2)
#define TCFG_ADKEY_VALUE0 0
#define TCFG_ADKEY_VALUE1 1
#define TCFG_ADKEY_VALUE2 2
#define TCFG_ADKEY_VALUE3 3
#define TCFG_ADKEY_VALUE4 4
#define TCFG_ADKEY_VALUE5 5
#define TCFG_ADKEY_VALUE6 6
#define TCFG_ADKEY_VALUE7 7
#define TCFG_ADKEY_VALUE8 8
#define TCFG_ADKEY_VALUE9 9
- 对应结构体
// board_jl701n_demo.c
const struct adkey_platform_data adkey_data = {
.enable = TCFG_ADKEY_ENABLE, //AD按键使能
.adkey_pin = TCFG_ADKEY_PORT, //AD按键对应引脚
.ad_channel = TCFG_ADKEY_AD_CHANNEL, //AD通道值
.extern_up_en = TCFG_ADKEY_EXTERN_UP_ENABLE, //是否使用外接上拉电阻
.ad_value = { //根据电阻算出来的电压值
TCFG_ADKEY_VOLTAGE0,
TCFG_ADKEY_VOLTAGE1,
TCFG_ADKEY_VOLTAGE2,
TCFG_ADKEY_VOLTAGE3,
TCFG_ADKEY_VOLTAGE4,
TCFG_ADKEY_VOLTAGE5,
TCFG_ADKEY_VOLTAGE6,
TCFG_ADKEY_VOLTAGE7,
TCFG_ADKEY_VOLTAGE8,
TCFG_ADKEY_VOLTAGE9,
},
.key_value = { //AD按键各个按键的键值
TCFG_ADKEY_VALUE0,
TCFG_ADKEY_VALUE1,
TCFG_ADKEY_VALUE2,
TCFG_ADKEY_VALUE3,
TCFG_ADKEY_VALUE4,
TCFG_ADKEY_VALUE5,
TCFG_ADKEY_VALUE6,
TCFG_ADKEY_VALUE7,
TCFG_ADKEY_VALUE8,
TCFG_ADKEY_VALUE9,
},
};
#endif
- TCFG_ADKEY_VALUE0为KEY 0按键,当按下时会触发KEY MSG里的事件,如:
- 当按下TCFG_ADKEY_VOLTAGE0电阻对应的按键时,就会根据TCFG_ADKEY_VALUE0里的值去抛出对应的MSG事件,此处TCFG_ADKEY_VALUE0值为0,则会抛出KEY 0短按的事件
KEY_MUSIC_PP
,当长按TCFG_ADKEY_VOLTAGE1对应电阻的按键,则会抛出KEY_VOL_DOWN
事件…
- 当按下TCFG_ADKEY_VOLTAGE0电阻对应的按键时,就会根据TCFG_ADKEY_VALUE0里的值去抛出对应的MSG事件,此处TCFG_ADKEY_VALUE0值为0,则会抛出KEY 0短按的事件
u8 key_table[KEY_NUM_MAX][KEY_EVENT_MAX] = {
// SHORT LONG HOLD UP DOUBLE TRIPLE
{KEY_MUSIC_PP, KEY_POWEROFF, KEY_POWEROFF_HOLD, KEY_NULL, KEY_CALL_LAST_NO, KEY_NULL}, //KEY_0
{KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_OPEN_SIRI, KEY_NULL}, //KEY_1
{KEY_MUSIC_PREV, KEY_VOL_DOWN, KEY_VOL_DOWN, KEY_NULL, KEY_HID_CONTROL, KEY_NULL}, //KEY_2
};