关于高电平与低电平的使用

在实际项目中,经烧录软件,发现耳机不能响应任何声音

经客户描述,为了省电处理,客户要求在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;

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值