AB32VG:(2)app.cbp工程源码阅读笔记(ADC按键和红外)

文章目录

  • 1.SDK文件目录
  • 2.ADCKEY和红外遥控器相关源码
    • 2.1 初始化
    • 2.2 在定时器中断服务程序中查询按键
  • 3. 更改参数以适应自己的ADC按键板
    • 3.1 我的ADC按键板硬件
    • 3.2 ADC值转换为键值
  • 4.红外遥控器
  • 5. 相关配置

参考文章:

  1. 作者:nunu1010,中科蓝讯蓝牙: 编译环境安装_ToolChain及CodeBlock(IDE)的安装
  2. 作者:机器人107,中科蓝讯蓝牙耳机SDK解析

有用资源:
1.《中科蓝讯蓝牙: 编译环境安装_ToolChain及CodeBlock(IDE)的安装》文章包含了工具链的下载链接,这里转载:
链接:https://pan.baidu.com/s/1hJbcuOGChOpBpDllFGePZg
提取码:1010
2. sdk源码:
链接:https://pan.baidu.com/s/1TbW_G_JFPUwNt2IdyIUCiA?pwd=1vej
提取码:1vej

1.SDK文件目录

└─app  
	├─platform
	│		├─bsp 
	│		│	├─bsp_music.c
	│		│	├─bsp_spiflash1.c
	│		│	├─bsp_spiflash1_music_bin.c
	│		│	├─bsp_fs.c
	│		│	├─bsp_spiflash_rec_play.c
	│		│	├─bsp_id3_tag.c
	│		│	├─bsp_lrc.c
	│		│	├─bsp_spp.c
	│		│	├─bsp_cm.c
	│		│	├─bsp_app.c
	│		│	├─bsp_ble.c
	│		│	├─bsp_param.c
	│		│	├─bsp_i2c.c
	│		│	├─bsp_aux.c
	│		│	├─bsp_fmtx.c
	│		│	├─bsp_record.c
	│		│	├─bsp_car_audio.c
	│		│	├─bsp_i2s.c
	│		│	├─bsp_iap.c
	│		│	├─bsp_i2s_ta5711.c
	│		│	├─bsp_i2s_wm8978.c
	│		│	├─bsp_audio.c
	│		│	├─bsp_charge.c
	│		│	├─bsp_karaok.c
	│		│	├─bsp_fmrx.c
	│		│	├─bsp_dac.c
	│		│	├─bsp_eq.c
	│		│	├─bsp_bt.c
	│		│	├─bsp_led.c
	│		│	├─bsp_sys.c
	│		│	├─bsp_key.c
	│		│	├─bsp_ir.c
	│		├─fmrx
	│		│	├─qn8035.c
	│		│   ├─fmrx_external.c
	│		├─functions
	│		│	├─func_music.c
	│		│	├─sfunc_record_play.c
	│		│	├─func_usbdev.c
	│		│	├─func_clock.c
	│		│	├─func_fmrx.c
	│		│	├─func_bt_hid.c
	│		│	├─func_fmam_freq.c
	│		│	├─func_idle.c
	│		│	├─func_update.c
	│		│	├─sfunc_bt_ring.c
	│		│	├─func_speaker.c
	│		│	├─func_spdif.c
	│		│	├─func_exspifalsh_music.c
	│		│	├─sfunc_record.c
	│		│	├─sfunc_bt_call.c
	│		│	├─func_bt.c
	│		│	├─func_lowpwr.c
	│		│	├─sfunc_bt_ota.c
	│		│	├─func_aux.c
	│		│	├─func.c
	│		├─gui
	│		│	├─gui.c
	│		│	├─lcd\lcd.c
	│		│	├─ledseg\ledseg_7p7s.c
	│		│	├─ledseg\ledseg_common.c
	│		├─libs
	│		│	├─strong_symbol.c
	│--------------------------------------------
	├─projects  
	│		├─standard
	│		│	├─config.c
	│		│	├─main.c
	│		│	├─display
	│		│	│	├─display_record.c
	│		│	│	├─display_music.c
	│		│	│	├─display_spdif.c
	│		│	│	├─display_fmrx.c
	│		│	│	├─display_idle.c
	│		│	│	├─display_fmam_freq.c
	│		│	│	├─display_clock.c
	│		│	│	├─display_bt.c
	│		│	│	├─display_aux.c
	│		│	│	├─display_speaker.c
	│		│	│	├─display_usbdev.c
	│		│	│	├─ledseg\display_ledseg.c
	│		│	├─message
	│		│	│	├─msg_speaker.c
	│		│	│	├─msg_music.c
	│		│	│	├─msg_clock.c
	│		│	│	├─msg_fmam_freq.c
	│		│	│	├─msg_fmrx.c
	│		│	│	├─msg_idle.c
	│		│	│	├─msg_bt.c
	│		│	│	├─msg_aux.c
	│		│	│	├─msg_record.c
	│		│	│	├─msg_spdif.c
	│		│	│	├─msg_usbdev.c
	│		│	│	├─msg_exspiflash_music.c
	│		│	├─plugin
	│		│	│	├─multi_lang.c
	│		│	│	├─eq_table.c
	│		│	│	├─plugin.c
	│		│	├─port
	│		│	│	├─port_led.c
	│		│	│	├─port_ledseg.c
	│		│	│	├─port_pwm.c
	│		│	│	├─port_mute.c
	│		│	│	├─port_update.c
	│		│	│	├─port_linein.c
	│		│	│	├─port_sd1.c
	│		│	│	├─port_earphone.c
	│		│	│	├─port_mic.c
	│		│	│	├─port_sd.c
	│		│	│	├─port_key.c
	│		│	│	├─port_ir.c

2.ADCKEY和红外遥控器相关源码

2.1 初始化

app\platform\bsp\bsp_key.c
app\platform\libs\libplatform.a
app\platform\bsp\bsp_sys.c
app\projects\standard\main.c
key_init()--初始化各种按键
sys_set_tmr_enable()--使能定时器
bsp_sys_init()--系统初始化
main()--主函数

2.2 在定时器中断服务程序中查询按键

app\platform\bsp\bsp_key.c
app\platform\bsp\bsp_sys.c
get_adkey()--读取ADC按键
bsp_key_scan()--扫描各种按键
get_irkey()--读取红外遥控器
usr_tmr5ms_isr()--5ms中断服务函数

3. 更改参数以适应自己的ADC按键板

3.1 我的ADC按键板硬件

AB32VG:(2)app.cbp工程源码阅读笔记(ADC按键和红外)_第1张图片
AB32VG01的GPIO有3种内置的上拉电阻,分别是300R,10k,200k。我使用了外置的100k上拉。理论值如上图。
AB32VG01的ADC是10位比特,这里转换后,把低2bit舍弃,所以转换结果只需要一个无符号字节就可以表示。

电阻值 按 键 AD十进制 AD十六进制 功 能
4.7k K0 11 0x0B play
14.7k K1 33 0x21 PREV
34.7k K2 66 0x42 NEXT
54.7k K3 91 0x5B VOL-
84.7k K4 117 0x75 VOL+

3.2 ADC值转换为键值

typedef struct {
    u8 adc_val;
    u8 usage_id;
} adkey_tbl_t;
AT(.com_text.adkey.table)
//  app\projects\standard\port\port_key.c
//	表格中的 adc_val要比理论值大 5 左右
const adkey_tbl_t adkey_table[] = {
    {0x0F, KEY_PLAY},           //PLAY          
    {0x25, KEY_PREV},           //PREV          
    {0x45, KEY_NEXT},           //NEXT          
    {0x65, KEY_VOL_DOWN},       //VOL-          
    {0x7A, KEY_VOL_UP},         //VOL+          
    {0xFF, NO_KEY},             //              END
};
//	app\platform\bsp\bsp_key.c
AT(.com_text.port.key)
static u8 get_adkey(u8 key_val, u8 key_config_en)
{
    u8 num = 0;
    u8 *ptr;
    //配置工具是否使能
    if (!key_config_en) {
        return NO_KEY;
    }
    if(key_val > 0xaf){
        return NO_KEY;
    }
    //printf("ad=%d",key_val);
    while (key_val > adkey_table[num].adc_val) {
        num++;
    }
    //工具配置了第一组ADKEY的按键定义?
    ptr = get_adkey_configure(num);
    if (ptr != NULL) {
        if ((num > 11) || (adkey_table[num].adc_val == 0xff)) {
            return NO_KEY;
        }
        return key_config_table[*(ptr+num)];
    }
    return adkey_table[num].usage_id;
}

4.红外遥控器

我手头有一个红外遥控器:
AB32VG:(2)app.cbp工程源码阅读笔记(ADC按键和红外)_第2张图片
在淘宝找到的资料如下:

AB32VG:(2)app.cbp工程源码阅读笔记(ADC按键和红外)_第3张图片
实际测到的键位码:
AB32VG:(2)app.cbp工程源码阅读笔记(ADC按键和红外)_第4张图片
根据这个键位码,修改源码:

//	app\projects\standard\port\port_ir.c
AT(.com_text.ir.table)
const u8 ir_tbl_FF00[96] =
{
// 	   0              1 		     2	            3             4               5             6                 7
/*0*/  KEY_MUTE,     KEY_PLAY,        NO_KEY,       NO_KEY,     KEY_PREV,       NO_KEY,         KEY_NEXT,         KEY_EQ,
       NO_KEY,       KEY_VOL_DOWN,    NO_KEY, 	    NO_KEY,		NO_KEY,         KEY_VOL_UP,	    KEY_NUM_0,		  NO_KEY,
/*1*/  KEY_NUM_1,    KEY_NUM_2,       KEY_NUM_3,    NO_KEY,     KEY_NUM_4,      KEY_NUM_5,      KEY_NUM_6,	      NO_KEY,
       KEY_NUM_7,    KEY_NUM_8,       KEY_NUM_9,    NO_KEY, 	NO_KEY,         NO_KEY,	        NO_KEY,			  NO_KEY,
};

5. 相关配置

《app\projects\standard\config.h》

/*****************************************************************************
 * Module    : User按键配置 (可以同时选择多组按键)
 *****************************************************************************/
#define USER_ADKEY                      1           //ADKEY的使用, 0为不使用
#define USER_ADKEY2                     0           //ADKEY2的使用,0为不使用
#define USER_PWRKEY                     1           //PWRKEY的使用,0为不使用
#define USER_IOKEY                      0           //IOKEY的使用, 0为不使用
#define USER_ADKEY_MUX_SDCLK            0           //是否使用复用SDCLK的ADKEY, 共用USER_ADKEY的按键table
#define ADKEY_PU10K_EN                  0           //ADKEY是否使用内部10K上拉, 按键数量及阻值见port_key.c
#define USER_ADKEY_MUX_LED              0           //是否使用ADKEY与LED复用, 共用USER_ADKEY的流程(ADKEY与BLED配置同一IO)
/*****************************************************************************
 * Module    : IRRX配置
 *****************************************************************************/
#define IRRX_HW_EN                      1           //是否打IRRX硬件模块
#define IRRX_SW_EN                      0           //是否打开timer capture ir
#define IR_NUMKEY_EN                    1           //是否打开数字键输入
#define IR_INPUT_NUM_MAX                999         //最大输入数字9999

//可以打开一个或多个
#define IR_ADDR_FF00_EN                 1
#define IR_ADDR_BF00_EN                 0
#define IR_ADDR_FD02_EN                 0

你可能感兴趣的:(AB32VG1,笔记)