332 lines
10 KiB
C
332 lines
10 KiB
C
/*
|
||
* File: __GP22GAS_IR_APP_C
|
||
* Author:
|
||
*
|
||
* Created on:2016-3-7
|
||
*/
|
||
|
||
#ifdef __cplusplus
|
||
extern "C"
|
||
{
|
||
#endif
|
||
|
||
|
||
#include "UWater_ir_app.h"
|
||
#include "UWater_frame_app.h"
|
||
#include "UWater_timer1uS_driver.h"
|
||
#include "UWater_uart_driver.h"
|
||
#include "UWater_lcd_app.h"
|
||
#include "UWater_key_app.h"
|
||
#include "UWater_DebugPrint.h"
|
||
|
||
u8 s_g_ir_control_state = IR_CONTROL_S0;
|
||
u8 s_g_ir_state = 0;
|
||
|
||
/************************************************
|
||
Function: void UartIrOpen()
|
||
Description: 打开红外
|
||
Input:
|
||
return:
|
||
Others:
|
||
*************************************************/
|
||
void UartIrOpen(void)
|
||
{
|
||
|
||
IR_38KCarrier_Close();
|
||
|
||
Gpio_WriteOutputIO(IR_UART_CTL_PORT, IR_UART_CTL_PIN, FALSE);
|
||
UartInit(IR_UART_COM, BAUD2400, DATA_BIT_8, STOPBIT_1, UART_EVEN_PARITY, UART_LPUART_Disable);
|
||
}
|
||
|
||
/************************************************
|
||
Function: void UartIrClose()
|
||
Description: 关闭红外
|
||
Input:
|
||
return:
|
||
Others:
|
||
*************************************************/
|
||
void UartIrClose(void)
|
||
{
|
||
// Sysctrl_SetPeripheralGate(SysctrlPeripheralBaseTim, FALSE); //Base Timer外设时钟关闭
|
||
Bt_M0_Stop(TIM2);
|
||
|
||
UartPreSleep(IR_UART_COM);
|
||
Gpio_WriteOutputIO(IR_UART_CTL_PORT, IR_UART_CTL_PIN, TRUE);//电源控制脚开漏输出高,红外模块断电
|
||
|
||
//配置红外接收RX口为输出,输出低,为了防止红外接收芯片漏电
|
||
stc_gpio_cfg_t stcGpioCfg;
|
||
DDL_ZERO_STRUCT(stcGpioCfg);
|
||
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置
|
||
stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力
|
||
stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无
|
||
stcGpioCfg.enPd = GpioPdDisable;
|
||
stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置
|
||
stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
|
||
Gpio_Init(LPUART0_RX_PORT, LPUART0_RX_PIN, &stcGpioCfg);
|
||
Gpio_WriteOutputIO(LPUART0_RX_PORT, LPUART0_RX_PIN, FALSE);
|
||
Gpio_Init(LPUART0_TX_PORT, LPUART0_TX_PIN, &stcGpioCfg);
|
||
Gpio_WriteOutputIO(LPUART0_TX_PORT, LPUART0_TX_PIN, TRUE); //TX也配置为输出高
|
||
Gpio_Init(IR_38K_PORT, IR_38K_PIN, &stcGpioCfg);
|
||
Gpio_SetAfMode(IR_38K_PORT,IR_38K_PIN,GpioAf0); //普通IO
|
||
Gpio_WriteOutputIO(IR_38K_PORT, IR_38K_PIN, TRUE);//38K引脚输出为高
|
||
|
||
}
|
||
|
||
/************************************************
|
||
Function: void IrInitApp()
|
||
Description: 初始化
|
||
Input:
|
||
return:
|
||
Others:
|
||
*************************************************/
|
||
void IrInitApp(void)
|
||
{
|
||
IR_Uart_38K_Config();
|
||
|
||
//< RX 控制脚初始化
|
||
stc_gpio_cfg_t stcGpioCfg;
|
||
DDL_ZERO_STRUCT(stcGpioCfg);
|
||
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置
|
||
stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力
|
||
stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无
|
||
stcGpioCfg.enPd = GpioPdDisable;
|
||
stcGpioCfg.enOD = GpioOdEnable; ///< 端口开漏输出配置
|
||
stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
|
||
Gpio_Init(IR_UART_CTL_PORT, IR_UART_CTL_PIN, &stcGpioCfg);
|
||
Gpio_WriteOutputIO(IR_UART_CTL_PORT, IR_UART_CTL_PIN, TRUE);
|
||
|
||
UartIrOpen();
|
||
s_g_ir_control_state = IR_CONTROL_S0;
|
||
FrameSetMsgApp(MsgOpenIr);
|
||
}
|
||
|
||
/************************************************
|
||
Function: IrIfSleepApp()
|
||
Description: 查询应用层模块是否允许进入休眠
|
||
Input:
|
||
return: 1 允许休眠 0不允许休眠
|
||
Others:
|
||
*************************************************/
|
||
u8 IrIfSleepApp(void)
|
||
{
|
||
if( IR_CONTROL_S0 == s_g_ir_control_state)
|
||
{
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
u8 IrIfInS0WakeTime(void)
|
||
{
|
||
if(s_g_ir_control_state == IR_CONTROL_S0)
|
||
{
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
/************************************************
|
||
Function: IrMachineApp()
|
||
Description:
|
||
Input:
|
||
return:
|
||
Others:
|
||
*************************************************/
|
||
void IrMachineApp(void)
|
||
{
|
||
switch (s_g_ir_control_state)
|
||
{
|
||
case IR_CONTROL_S0:
|
||
{
|
||
if(FrameCheckMsgApp(MsgOpenIr))
|
||
{
|
||
FrameClearMsgApp(MsgOpenIr);
|
||
Set100msTimer(TIMER_100MS_IR_OPEN, 600);//复位之后定时60秒,关闭
|
||
s_g_ir_control_state = IR_CONTROL_S1;
|
||
}
|
||
else if(KeyCheckIrOpenMsg() == TRUE )//检测到按键消息
|
||
{
|
||
KeyClearIrOpenMsg();//清除消息
|
||
Set100msTimer(TIMER_100MS_IR_OPEN, 200);//按键唤醒定时20秒,关闭
|
||
s_g_ir_control_state = IR_CONTROL_S1;
|
||
}
|
||
break;
|
||
}
|
||
case IR_CONTROL_S1:
|
||
{
|
||
if(TASK_IDLE == UartIfIdle(IR_UART_COM))
|
||
{
|
||
UartIrOpen();
|
||
s_g_ir_control_state = IR_CONTROL_S2;
|
||
}
|
||
|
||
break;
|
||
}
|
||
case IR_CONTROL_S2:
|
||
{
|
||
//非检定且时间到
|
||
if((0 == Check100msTimer(TIMER_100MS_IR_OPEN)) &&
|
||
(TASK_IDLE == UartIfIdle(IR_UART_COM))&&
|
||
(10 == LcdCheckStateApp())&&
|
||
(FALSE ==GetPrintNbDataSwitch()&&
|
||
(FrameIfSleepApp() == TRUE)))
|
||
{
|
||
UartIrClose();
|
||
KeyClearIrOpenMsg();//清除消息
|
||
s_g_ir_control_state = IR_DEAL_S0;
|
||
}
|
||
break;
|
||
}
|
||
default:
|
||
{
|
||
s_g_ir_control_state = IR_DEAL_S0;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
/*************************************************
|
||
Function: static void IR_Uart_38K_Config(void)
|
||
Description: 红外38K 配置PWM相关寄存器
|
||
Input: 无
|
||
Return: 无
|
||
Others:
|
||
*************************************************/
|
||
void IR_Uart_38K_Config(void)
|
||
{
|
||
#if IR_38K_OPEN
|
||
u16 u16ArrValue;
|
||
u16 u16CntValue;
|
||
u16 u16Period;
|
||
stc_bt_mode0_cfg_t stcBtBaseCfg;
|
||
stc_gpio_cfg_t stcTIM1APort;
|
||
|
||
DDL_ZERO_STRUCT(stcTIM1APort);
|
||
DDL_ZERO_STRUCT(stcBtBaseCfg);
|
||
//PA03设置为TIM2_CHB
|
||
stcTIM1APort.enDir = GpioDirOut;
|
||
Gpio_Init(IR_38K_PORT, IR_38K_PIN, &stcTIM1APort);
|
||
Gpio_SetAfMode(IR_38K_PORT,IR_38K_PIN,IR_38K_AF);
|
||
Sysctrl_SetPeripheralGate(SysctrlPeripheralBaseTim, TRUE); //Base Timer外设时钟使能
|
||
|
||
stcBtBaseCfg.enWorkMode = BtWorkMode0; //定时器模式
|
||
stcBtBaseCfg.enCT = BtTimer; //定时器功能,计数时钟为内部PCLK
|
||
stcBtBaseCfg.enPRS = BtPCLKDiv1; //PCLK/3
|
||
stcBtBaseCfg.enCntMode = Bt16bitArrMode; //自动重载16位计数器/定时器
|
||
stcBtBaseCfg.bEnTog = TRUE;
|
||
stcBtBaseCfg.bEnGate = FALSE;
|
||
stcBtBaseCfg.enGateP = BtGatePositive;
|
||
|
||
Bt_Mode0_Init(TIM2, &stcBtBaseCfg); //TIM2 的模式0功能初始化8 *
|
||
|
||
u16Period = Sysctrl_GetPClkFreq() /(2 * 38000);
|
||
u16ArrValue = 0x10000 - u16Period;
|
||
Bt_M0_ARRSet(TIM2, u16ArrValue); //设置重载值(ARR = 0x10000 - 周期)
|
||
u16CntValue = 0x10000 - u16Period;
|
||
Bt_M0_Cnt16Set(TIM2, u16CntValue); //设置计数初值
|
||
Bt_M0_Enable_Output(TIM2, TRUE); //TIM2 端口输出使能
|
||
|
||
#endif
|
||
}
|
||
//
|
||
void IR_Uart_38K_PreSleep(void)
|
||
{
|
||
Sysctrl_SetPeripheralGate(SysctrlPeripheralBaseTim, FALSE); //Base Timer外设时钟关闭
|
||
Bt_M0_Stop(TIM2);
|
||
|
||
Gpio_WriteOutputIO(IR_UART_CTL_PORT, IR_UART_CTL_PIN, TRUE);//电源控制脚开漏输出高,红外模块断电
|
||
|
||
//配置红外接收RX口为输出,输出低,为了防止红外接收芯片漏电
|
||
stc_gpio_cfg_t stcGpioCfg;
|
||
DDL_ZERO_STRUCT(stcGpioCfg);
|
||
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置
|
||
stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力
|
||
stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无
|
||
stcGpioCfg.enPd = GpioPdDisable;
|
||
stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置
|
||
stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
|
||
Gpio_Init(LPUART0_RX_PORT, LPUART0_RX_PIN, &stcGpioCfg);
|
||
Gpio_WriteOutputIO(LPUART0_RX_PORT, LPUART0_RX_PIN, FALSE);
|
||
Gpio_Init(LPUART0_TX_PORT, LPUART0_TX_PIN, &stcGpioCfg);
|
||
Gpio_WriteOutputIO(LPUART0_TX_PORT, LPUART0_TX_PIN, TRUE); //TX也配置为输出高
|
||
Gpio_Init(IR_38K_PORT, IR_38K_PIN, &stcGpioCfg);
|
||
Gpio_SetAfMode(IR_38K_PORT,IR_38K_PIN,GpioAf0); //普通IO
|
||
Gpio_WriteOutputIO(IR_38K_PORT, IR_38K_PIN, TRUE);//38K引脚输出为高
|
||
}
|
||
//
|
||
//void IR_Uart_38K_Enable(boolean_t enCmd)
|
||
//{
|
||
//#if IR_38K_OPEN
|
||
// if(TRUE == enCmd)
|
||
// {
|
||
// UartInit(IR_UART_COM,BAUD2400,DATA_BIT_8,STOPBIT_1,UART_EVEN_PARITY,UART_LPUART_Disable);//UART_EVEN_PARITY UART_NONE_PARITY
|
||
// IR_Uart_38K_Config();
|
||
// Bt_M0_Run(TIM2); //TIM2 运行
|
||
//
|
||
// Gpio_WriteOutputIO(IR_UART_CTL_PORT, IR_UART_CTL_PIN, FALSE);
|
||
// }
|
||
// else
|
||
// {
|
||
// Gpio_WriteOutputIO(IR_38K_PORT,IR_38K_PIN, TRUE);//38K引脚输出为高
|
||
// Gpio_WriteOutputIO(IR_UART_CTL_PORT, IR_UART_CTL_PIN, TRUE);//电源控制脚开漏输出高,红外模块断电
|
||
// //配置红外接收RX口为输出,输出低,为了防止红外接收芯片漏电
|
||
// stc_gpio_cfg_t stcGpioCfg;
|
||
// DDL_ZERO_STRUCT(stcGpioCfg);
|
||
// stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置
|
||
// stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力
|
||
// stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无
|
||
// stcGpioCfg.enPd = GpioPdDisable;
|
||
// stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置
|
||
// stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
|
||
// Gpio_Init(LPUART0_RX_PORT, LPUART0_RX_PIN, &stcGpioCfg);
|
||
// Gpio_WriteOutputIO(LPUART0_RX_PORT, LPUART0_RX_PIN, FALSE);
|
||
// Gpio_Init(LPUART0_TX_PORT, LPUART0_TX_PIN, &stcGpioCfg);
|
||
// Gpio_WriteOutputIO(LPUART0_TX_PORT, LPUART0_TX_PIN, TRUE); //TX也配置为输出高
|
||
// Gpio_WriteOutputIO(IR_38K_PORT, IR_38K_PIN, TRUE);//38K引脚输出为高
|
||
// }
|
||
//#endif
|
||
//}
|
||
|
||
/*************************************************
|
||
Function: void IR_38K_Open(void)
|
||
Description: 红外38K 配置PWM相关寄存器,并开启38K载波
|
||
Input: 无
|
||
Return: 无
|
||
Others:
|
||
*************************************************/
|
||
void IR_38KCarrier_Open(void)
|
||
{
|
||
IR_Uart_38K_Config();
|
||
Bt_M0_Run(TIM2);
|
||
|
||
}
|
||
|
||
/*************************************************
|
||
Function: void IR_38K_Close(void)
|
||
Description: 关闭38K载波,把该引脚配置为输出高
|
||
Input: 无
|
||
Return: 无
|
||
Others:
|
||
*************************************************/
|
||
void IR_38KCarrier_Close(void)
|
||
{
|
||
Bt_M0_Stop(TIM2);
|
||
stc_gpio_cfg_t stcGpioCfg;
|
||
DDL_ZERO_STRUCT(stcGpioCfg);
|
||
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置
|
||
stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力
|
||
stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无
|
||
stcGpioCfg.enPd = GpioPdDisable;
|
||
stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置
|
||
stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
|
||
Gpio_Init(IR_38K_PORT, IR_38K_PIN, &stcGpioCfg);
|
||
Gpio_SetAfMode(IR_38K_PORT,IR_38K_PIN,GpioAf0); //普通IO
|
||
Gpio_WriteOutputIO(IR_38K_PORT, IR_38K_PIN, TRUE);//38K引脚输出为高
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif //#ifdef __cplusplus
|
||
|