📄 timerwakeup.c
字号:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File Name: Main.c
** Last modified Date: 2007.09.27
** Last Version: v1.0
** Description: 睡眠模式的基本操作
**
**--------------------------------------------------------------------------------------------------------
** Created By: Weng Heiwei
** Created date: 2008.07.29
** Version: v1.0
** Descriptions:
**
*******************************************************************************************************/
#include "config.h"
/* SleepMode为睡眠方式控制 */
/* 0 : 深度睡眠方式 */
/* 1 : 普通睡眠方式 */
#define SleepMode 0 /* 睡眠方式选择 */
#define SleepCLK 12000000 /* 睡眠时的系统时钟基准频率 */
#define SleepTime (SleepCLK) /* 睡眠时间 */
#define SysDiv (5 << 23) /* 深度睡眠时的基准频率分频值 */
#define ClkSrc (1 << 4) /* 深度睡眠模式下的时钟源 */
/* PLLEN为PLL运行控制位 */
/* 0 : PLL在运行模式下不运行 */
/* 其它 : PLL在运行模式下运行 */
#define PLLEN 1
#define USE_PORT GPIO_PORTA_BASE
#define LED3 GPIO_PIN_2
#define LED4 GPIO_PIN_3
/*********************************************************************************************************
** Function name: main
** Descriptions: 本示例程序演示了定时器中断唤醒睡眠状态
**
** input parameters: 无
** output parameters: 无
** Returned value: 无
** Created By: Weng Heiwei
** Created date: 2008.07.29
*********************************************************************************************************/
int main(void)
{
SysCtlLDOSet(SYSCTL_LDO_2_75V); /* 设置LDO输出为2.75V */
#if PLLEN == 0
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | /* 配置PLL */
SYSCTL_XTAL_6MHZ | SYSCTL_OSC_MAIN); /* 运行模式下的系统时钟源为MOSC */
#else
SysCtlClockSet(SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | /* 配置PLL */
SYSCTL_XTAL_6MHZ | SYSCTL_OSC_MAIN); /* 运行模式下的系统时钟源为PLL输出*/
#endif
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); /* 使能外设GPIOA */
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); /* 使能外设TIMER0 */
SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE); /* 使能休眠模块 */
HibernateEnableExpClk(SysCtlClockGet()); /* 使能32KHz的内部振荡器 */
GPIOPadConfigSet(USE_PORT,LED3 |LED4, /* 引脚配置为弱上拉,驱动电流为2mA*/
GPIO_STRENGTH_2MA,
GPIO_PIN_TYPE_STD_WPU);
GPIODirModeSet(USE_PORT,LED3 | LED4,GPIO_DIR_MODE_OUT); /* 配置引脚数据方向 */
TimerConfigure(TIMER0_BASE,TIMER_CFG_32_BIT_PER); /* 配置定时器0为32BIT周期模式 */
TimerLoadSet(TIMER0_BASE, TIMER_A, SleepTime); /* 设置定时器0加载值 */
TimerControlStall(TIMER0_BASE,TIMER_A,true); /* 配置在调试过程中定时器停止计数 */
GPIOPinWrite(USE_PORT,LED3 | LED4,~(LED3 | LED4));
TimeDelay(500000);
GPIOPinWrite(USE_PORT,LED3 | LED4,(LED3 | LED4)); /* 测试引脚功能 */
TimerIntClear(TIMER0_BASE,0x70F); /* 清除定时器0的全部中断 */
TimerIntEnable(TIMER0_BASE,TIMER_TIMA_TIMEOUT); /* 使能超时溢出中断使能 */
IntEnable(INT_TIMER0A); /* TIMER0A模块中断使能 */
IntMasterEnable(); /* 中断总使能 */
TimerEnable(TIMER0_BASE,TIMER_A); /* 启动定时器0 */
SysCtlPeripheralClockGating(true); /* 置位ACG,开启自动时钟门控 */
HWREG(SYSCTL_DSLPCLKCFG) = SysDiv | /* 选择系统分频值 */
ClkSrc; /* 选择深度睡眠模式下的系统时钟源 */
#if SleepMode == 0
SysCtlPeripheralDeepSleepEnable(SYSCTL_PERIPH_TIMER0); /* 深度睡眠模式下使能外设TIMER0 */
SysCtlPeripheralDeepSleepEnable(SYSCTL_PERIPH_HIBERNATE); /* 深度睡眠模式下使能休眠模块 */
SysCtlDeepSleep(); /* 使CM3进入深度睡眠模式 */
#endif
#if SleepMode == 1
SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_TIMER0); /* 睡眠模式下使能外设TIMER0 */
SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_HIBERNATE); /* 睡眠模式下使能休眠模块 */
SysCtlSleep(); /* 使CM3进入睡眠模式 */
#endif
while(1) { /* CM3被唤醒 */
TimeDelay(500000);
GPIOPinWrite(USE_PORT,LED4,~LED4); /* 亮LED */
TimeDelay(500000);
GPIOPinWrite(USE_PORT,LED4,LED4); /* 灭LED */
}
}
/*********************************************************************************************************
** Function name: TIMERA_ISR
** Descriptions: 定时器0的中断服务程序
**
** input parameters: 无
** output parameters: 无
** Returned value: 无
** Created By: Weng Heiwei
** Created date: 2008.07.29
*********************************************************************************************************/
void INT_TIMERA_ISR(void)
{
unsigned long IntStatus;
IntStatus = TimerIntStatus(TIMER0_BASE,true); /* 获取屏蔽后的中断状态 */
TimerIntClear(TIMER0_BASE,IntStatus); /* 清除中断 */
GPIOPinWrite(USE_PORT,LED3,~GPIOPinRead(USE_PORT,LED3)); /* GPIO取反输出 */
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -