原理图
软件设置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 = 现在采集到的值,由此决定模式切换。