我们项目采用的是cpu和mcu的组合(mcu是裸板开发,cpu是linux系统),复位按键在mcu上,用mcu来控制整个系统的复位功能。
- 短按 :如果休眠状态,直接唤醒;如果非休眠,进行复位
- 长按6s:提供一个标志,供cpu读取(I2C),cpu自行恢复出厂设置。
/*创建100ms的轮询任务*/
if(tmr_create(SVCDEV_KEYRST_TIME, TMR_LOOP, svc_key_rst, 0) ==TMR_INVALID_HTMR)
{
MCU_EXC_ERROR;
return ERROR;
}
/*复位按键处理函数*/
LOCAL STATUS svc_key_rst(HTMR htmr, OTP_UINT32 uarg)
{
NO_USE(htmr);
NO_USE(uarg);
if (SVC_KEY_RESET_IS_ON) //判断复位按键是否按下
{
key_rst_count++; //计数,一个数代表100ms
}
else
{
if (key_rst_count >=60) //长按6s
{
key_rst_flag = KEY_RST_FLAG_FACTORY;
}
else if (key_rst_count >=1) //短按
{
key_rst_flag = KEY_RST_FLAG_REBOOT;
}
else
{
key_rst_flag = 0;
}
key_rst_count=0;
}
/根据硬件设计来修改/
if(key_rst_flag == KEY_RST_FLAG_REBOOT) //长按6s操作
{
if(SVC_WAKEUP_OUT_IS_ON) //如果非休眠状态,复位
{
#if 1 //后续由cpu命令进行复位
SVC_CPU_RST_SET; //复位cpu
tmr_delay_ms(130); //2020.1.14
//SVC_CPU_RST_CLR;
SVC_SOFT_RESET_CLR; //复位706
tmr_delay_ms(20);
SVC_SOFT_RESET_SET;
#endif
I2CWrBuffer[11] = 1 ;
}
else //如果休眠,直接唤醒
{
SVC_WAKEUP_IN_SET; //wake up cpu
}
key_rst_flag = KEY_RST_FLAG_ACTIVE;
}
if(key_rst_flag == KEY_RST_FLAG_FACTORY) //恢复出厂设置
{
I2CWrBuffer[11] = 2 ; //修改标志符,供cpu读取
}
return OK;
}
网友评论