在实际项目中,经烧录软件,发现耳机不能响应任何声音
经客户描述,为了省电处理,客户要求在PE7处,拉高电平(量的电压3.3V)时,喇叭才能激活,有声音。
在播放音乐时能有声音,在有提示音时需要拉高电平,在通话去电,来电时,需要拉高电平。
如何定义PE7
在config.h中,新增如下代码
//USER DEFINE
#define APM_PE7_INIT() GPIOEDE |= BIT(7); GPIOEPU |= BIT(7); GPIOEDIR &= ~BIT(7) // PA7 init ,
#define APM_PE7_SET_H() GPIOESET = BIT(7) //设置高电平
#define APM_PE7_SET_L() GPIOECLR = BIT(7) //设置低电平
#define APM_PE7_STA() (GPIOE & BIT(7)) //当前电平的值
拓展:
IO口有各个段, 当使用PA7 PB7 PE7等等,我们可以根据相应的地方来修改,将对应的IO口和A 、B、E段改成相应的。
#APM_PA5_INIT() GPIOADE |= BIT(5); GPIOAPU |= BIT(5); GPIOADIR &= ~BIT(5) // PA5init ,
设置好IO口后,我们需要调用,在相应的位置进行初始化
在Func.c函数中,进行初始化
AT(.text.func)
void func_run(void)
{
//func_cb.sta = FUNC_SPEAKER; //FUNC_EXSPIFLASH_MUSIC;
printf("%s\n", __func__);
APM_PE7_INIT(); // PE7 初始化
//此处省略下面代码
}
首先,我们需要在响应提示音的时候,PE7拉高电平
修改 提示音响应函数中,修改。
mp3_res_play()函数中,首行拉高 APM_PE7_SET_H()
,这样的话,在每次响应提示音之前,都拉高PE7。
注意:在修改如上方法后,发现没有POWER ON 开机提示音未响应。 经分析,初始化在此处晚了,没有读取到,需要在开机时重新进行PE7初始化,并拉高PE7
#if WARNING_POWER_ON
APM_PE7_INIT();//PE7 初始化
APM_PE7_SET_H();//PE7设置高电平
mp3_res_play(RES_BUF_POWERON_MP3, RES_LEN_POWERON_MP3);
#endif // WARNING_POWER_ON
,此时提示音都已经有了,但是在播放音乐和通话时,并没有声音。
根据蓝牙状态的宏定义发现,大于已连接状态的话,都必须要拉高电平
BT_STA_CONNECTED, //已连接
BT_STA_PLAYING, //播放
BT_STA_INCOMING, //来电响铃
BT_STA_OUTGOING, //正在呼出
BT_STA_INCALL, //通话中
,并定义一个计数标志,sys_cb.PE7_io_turn_cnt,方便设置电平,以及打印,此处只能播放音乐时的消息
case MSG_SYS_1S:
bt_send_msg(BT_MSG_HFP_REPORT_BAT);
if(bt_get_status() > BT_STA_CONNECTED)
{
if(sys_cb.PE7_io_turn_cnt >= 10 )
{
sys_cb.PE7_io_turn_cnt = 10;
}
APM_PE7_SET_H();
printf("PE7 === %d \n",APM_PE7_STA());
}
else
{
sys_cb.PE7_io_turn_cnt ++;
if(sys_cb.PE7_io_turn_cnt)
printf("---------------%d-------------------------",sys_cb.PE7_io_turn_cnt);
APM_PE7_SET_L();
printf("PE7 === %d \n",APM_PE7_STA());
}
break;
当通话时,则不会执行func_bt_message()中 的 MSG_SYS_1S,
所以我们需要在通话消息管理函数中sfunc_bt_call_message() 也定义一个MSG_SYS_1S
case MSG_SYS_1S:
bt_send_msg(BT_MSG_HFP_REPORT_BAT);
call_status = bt_get_call_indicate();//获取当前通话状态
if(call_status >= BT_CALL_INCOMING)//如果大于等于来电状态
{
if(sys_cb.PE7_io_turn_cnt >= 10 )
{
sys_cb.PE7_io_turn_cnt = 10;
}
APM_PE7_SET_H();
printf("PE7 === %d \n",APM_PE7_STA());
}
else
{
sys_cb.PE7_io_turn_cnt ++;
if(sys_cb.PE7_io_turn_cnt)
printf("---------------%d-------------------------",sys_cb.PE7_io_turn_cnt);
APM_PE7_SET_L();
printf("PE7 === %d \n",APM_PE7_STA());
}
break;