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