检测IO口,切换BT模式与LINEIN模式

原理图

软件设置GPIOA1为上拉输入。

可以得到 GPIOA1高电平的时候没有设备接入,GPIOA1低电平的时候有设备接入。

目的:开机检测是否有设备插入,是,进入LINEIN模式,否,进入蓝牙模式;中途插入设备进入LINEIN模式,拔出设备进入蓝牙模式。

部分代码:

//检测LININ输入函数,返回TRUE代表有设备插入,返回FALSE代表没有设备插入
bool IsLineInLink(void)
{
#ifdef CFG_LINEIN_DET_EN
	#define LINEIN_JETTER_TIMES		30	//连接检测消抖时间:30次

	static uint8_t LineInLinkState = 0;

	//设为输入,带上拉
	GPIO_RegOneBitClear(LINEIN_DET_GPIO_OE, LINEIN_DET_BIT_MASK);
	GPIO_RegOneBitSet(LINEIN_DET_GPIO_PU, LINEIN_DET_BIT_MASK);
	GPIO_RegOneBitClear(LINEIN_DET_GPIO_PD, LINEIN_DET_BIT_MASK);

	GPIO_RegOneBitSet(LINEIN_DET_GPIO_IE, LINEIN_DET_BIT_MASK);

	if(GPIO_RegOneBitGet(LINEIN_DET_GPIO_IN, LINEIN_DET_BIT_MASK))
	if(IsCardIn()||IsUDiskLink())
	{
		LineInLinkState = 0;						//断开状态不做消抖处理
		return FALSE;
	}
	else
	{
		if(LineInLinkState < LINEIN_JETTER_TIMES)	//连接状态做消抖处理
		{
			LineInLinkState++;
		}
	}
	return (LineInLinkState >= LINEIN_JETTER_TIMES);
	return TRUE;
#else
    return TRUE;
#endif		
}

//定时器扫描函数,500ms扫描一次
void Timer3Interrupt(void)
{
	static int last = 2;        //上一次检测到的值
	static int now = 2;         //当前检测到的值
	
	last = now;
	now = (int)IsLineInLink();//把bool值强制转换成0或者1,读取当前是否有设备插入

	//APP_DBG("\r\ %d,%d \r\n",last,now);//打印

	if(now == 1 && last == 0)//linin mode
	{
		mainAppCt.appBackupMode = AppModeLineAudioPlay;//发送linin模式消息
		APP_DBG("\n now is linin mode\n");
	}
	else if(now == 0 && last == 1)//bt mode
	{
		mainAppCt.appBackupMode = AppModeBtAudioPlay;//发送蓝牙模式消息
		APP_DBG("\n now is bt mode\n");
	}

	//下面代码只执行一次,用来控制开机第一次进入的模式
	else if(last == 2 && now == 1)//linin mode
	{
		mainAppCt.appBackupMode = AppModeLineAudioPlay;//发送linin模式消息
		APP_DBG("\n now is linin mode\n");
	}
	else if(last == 2 && now == 0)//bt mode
	{
		mainAppCt.appBackupMode = AppModeBtAudioPlay;//发送蓝牙模式消息
		APP_DBG("\n now is bt mode\n");
	}
}

第一次进入定时器中断函数 last = 2;now 可能等于1也可能等于0;

之后进入定时器 last = 上一次采集到的值,now = 现在采集到的值,由此决定模式切换。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值