Repository navigation
Expand file tree
/
Copy pathsleep.c
More file actions
114 lines (99 loc) · 3.76 KB
/
Copy pathsleep.c
File metadata and controls
114 lines (99 loc) · 3.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*********************************************************
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
*文件名: sleep.c
*作 者:
*版 本: V1.01
*日 期: 2018/03/26
*描 述: 休眠函数
*备 注: 适用于HRSDK-GDB-8P506
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
**********************************************************/
#include "sleep.h"
/***************************************************************
函数名:void sleep(void)
描 述:休眠函数
输入值:无
输出值:无
返回值:无
***************************************************************/
void sleep(void)
{
GPIO_InitSettingType y;
KINT_InitSettingType z;
PINT_InitSettingType x;
__disable_irq(); //关闭IRQ总中断
WDT_Clear(); //清狗
DeviceClockAllEnable();
GPIO->PAINEB.Word = 0XFFFFFFFF; //输入关闭
GPIO->PBINEB.Word = 0XFFFFFFFF;
GPIO->PADIR.Word = 0X00000000; //输出打开
GPIO->PBDIR.Word = 0X00000000;
GPIO->PADATA.Word = 0X00000000; //PA6输出高关闭LED1
GPIO->PBDATA.Word = 0X00000000; //PB7有上拉电阻
y.Signal = GPIO_Pin_Signal_Digital;
y.Func = GPIO_Reuse_Func0;
y.Dir = GPIO_Direction_Input;
y.ODE = GPIO_ODE_Output_Disable;
y.DS = GPIO_DS_Output_Normal;
y.PUE= GPIO_PUE_Input_Disable;
y.PDE= GPIO_PDE_Input_Enable;
GPIO_Init(GPIO_Pin_B9, &y);
GPIO_Init(GPIO_Pin_A23, &y);
z.IE_Set = KINT_IE_Set_Enable;
z.Trigger_Style = KINT_Trigger_Rising_Edge;
KINT_Init(GPIO_Pin_B9, &z); //初始化按键中断
x.IE_Set = PINT_IE_Set_Enable;
x.Trigger_Style = PINT_Trigger_Rising_Edge;
PINT_Init(GPIO_Pin_A23, &x); //初始化按键中断
KINT_ClearITFlag(GPIO_Pin_B9); //清除标志位
PINT_ClearITFlag(GPIO_Pin_A23); //清除标志位 SCU_RegUnLock();
SCU_LVDVS_4V(); //LVD唤醒电压4V
SCU_LVDIFS_Fall(); //LVD电压升高检测
SCU_LVDFLT_Enable(); //LVD滤波使能
SCU_LVD_Enable(); //LVD中断使能
SCU->WAKEUPTIME.MOSC_EN = 0; //深睡眠下时钟自动关闭
SCU->WAKEUPTIME.WAKEUPTIME = 20; //唤醒时间不可小于40us
SCB_SystemLPConfig(SCB_LP_SleepDeep, Enable); //深度睡眠模式
SCU_RegLock();
// WDT_RegUnLock();//WDT关闭写保护
// WDT_ITEnable(); //IE使能
// NVIC_EnableIRQ(LVD_IRQn); //使能LVD唤醒源
// NVIC_EnableIRQ(WDT_IRQn); //使能WDT唤醒源
NVIC_EnableIRQ(KINT_IRQn); //使能按键唤醒
NVIC_EnableIRQ(PINT7_IRQn); //使能按键唤醒
// while (1) //休眠主循环
// {
// SCU_RegUnLock();
// SCU->SCLKEN0.SYSCLK_DIV = 5;// 系统时钟后分频1:32 //系统时钟周期不可小于2us
// __WFI(); //休眠
// SCU->SCLKEN0.SYSCLK_DIV = 0;// 恢复系统时钟后分频比
// SCU_RegLock();
// NVIC->ICPR[0] = 0XFFFFFFFF; //清NVIC挂起标识
//// if(WDT_GetFlagStatus() != RESET)
//// {
//// WDT_Clear(); //清狗
////// GPIO_ToggleBit(GPIO_Pin_A23); //PA23翻转
//// }
//// if(SCU_GetLVDFlagStatus(SCU_LVDFlag_IF) != RESET) //LVD唤醒
//// {
//// SCU_RegUnLock();
//// SCU_LVDClearIFBit();
//// SCU_RegLock();
//// NVIC_SystemReset(); //复位唤醒
//// }
// if(KINT_GetITFlag(GPIO_Pin_B9) != RESET) //KINT唤醒
// {
// KINT_ClearITFlag(GPIO_Pin_B9); // 清除按键中断标志位
// GPIO_ToggleBit(GPIO_Pin_A23); //PA23翻转
//// GPIO_ToggleBit(GPIO_Pin_A23); //PA23翻转
//// GPIO_ToggleBit(GPIO_Pin_A23); //PA23翻转
//// GPIO_ToggleBit(GPIO_Pin_A23); //PA23翻转
//// GPIO_ToggleBit(GPIO_Pin_A23); //PA23翻转
//// GPIO_ToggleBit(GPIO_Pin_A23); //PA23翻转
//// GPIO_ToggleBit(GPIO_Pin_A23); //PA23翻转
// }
// }
__asm("WFI");
__asm("NOP"); //唤醒在此处
}