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

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

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

 

 

 

在数字电路中,高电平低电平是两种基本的电压状态,用于表示逻辑“1”和逻辑“0”。这些电平的具体电压范围依赖于所使用的电子技术,如TTL(晶体管-晶体管逻辑)或CMOS(互补金属氧化物半导体)。 ### 高电平 高电平通常代表逻辑“1”,是一种相对较高的电压状态。不同的数字电路系统对高电平的电压定义可能略有不同。例如,在典型的TTL(晶体管-晶体管逻辑)电路中,高电平通常指电压在2.4V到5V之间;而在CMOS(互补金属氧化物半导体)电路中,高电平的电压范围一般接近电源电压,通常在3V到18V之间,具体取决于所使用的CMOS器件和电源电压。高电平用于表示数字信号中的“真”“是”或“有效”等状态。例如,在计算机的CPU中,当一个信号引脚处于高电平时,可能表示该引脚正在传输数据、执行某个指令或者激活某个功能模块[^3]。 ### 低电平 低电平代表逻辑“0”,是一种相对较低的电压状态。在TTL电路中,低电平一般指电压在0V到0.8V之间;在CMOS电路中,低电平通常接近0V。低电平则表示数字信号中的“假”“否”或“无效”等状态。例如,在一个数字控制系统中,当某个控制信号为低电平时,可能表示禁止某个设备运行或者关闭某个功能模块[^3]。 ### 区别 高电平低电平的主要区别在于它们所代表的逻辑状态和对应的电压范围。高电平通常对应逻辑“1”,而低电平对应逻辑“0”。在实际应用中,这种区分是通过特定的电压阈值来实现的。例如,在TTL电路中,2.4V是一个常见的阈值,高于此值被视为高电平,低于0.8V被视为低电平。这种电压阈值的设计确保了数字电路能够可靠地区分这两种状态,从而正确地处理和传输二进制信息。 ### 示例代码 以下是一个简单的Python代码示例,模拟了数字电路中高电平低电平的检测: ```python def detect_logic_level(voltage): if voltage >= 2.4 and voltage <= 5.0: return "High Level (Logic 1)" elif voltage >= 0.0 and voltage <= 0.8: return "Low Level (Logic 0)" else: return "Undefined Level" # 测试电压值 test_voltages = [0.5, 3.0, 5.0, 1.0, 2.5] for voltage in test_voltages: print(f"Voltage {voltage}V: {detect_logic_level(voltage)}") ``` 这段代码定义了一个函数 `detect_logic_level`,它根据输入的电压值判断是高电平还是低电平,并返回相应的逻辑状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值