📄 systickwakeup.c
字号:
#include "config.h"
/* SleepMode为睡眠方式控制 */
/* 0 : 深度睡眠方式 */
/* 1 : 普通睡眠方式 */
#define SleepMode 0 // 睡眠方式
#define SleepCLK 30000 // 睡眠时的时钟频率--深度睡眠时本例为30KHZ,普通睡眠时本例为6MHZ
#define SleepTime (SleepCLK) // 睡眠时间10S
#define LED2 GPIO_PIN_2
#define LED3 GPIO_PIN_3
#define LED4 GPIO_PIN_4
#define Start (1 << 0)
#define Write (1 << 1)
#define Read (0 << 1)
volatile unsigned long RegVal;
int main(void)
{
/* 设置系统时钟--6MHZ */
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC |
SYSCTL_XTAL_6MHZ| SYSCTL_OSC_MAIN);
/* 使能外设GPIOA */
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH);
/* 配置引脚驱动 */
GPIOPadConfigSet(GPIO_PORTA_BASE,LED2|LED3|LED4,
GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);
GPIODirModeSet(GPIO_PORTA_BASE,LED2|LED3|LED4,
GPIO_DIR_MODE_OUT);
HWREG(0x40048020) = Start | Read | (1<<3); // MR1
RegVal = HWREG(0x40048030);
HWREG(0x40048020) = Start | Read | (0<<3); // MR0
RegVal = HWREG(0x40048030);
HWREG(0x40048020) = Start | Write | (0<<3); // 写MR0
HWREG(0x4004802C) = RegVal | (1<<11);
/* 测试引脚功能 */
GPIOPinWrite(GPIO_PORTA_BASE,LED2|LED3|LED4,~(LED2|LED3|LED4)); // 亮LED
TimeDelay(500000);
GPIOPinWrite(GPIO_PORTA_BASE,LED2|LED3|LED4,LED2|LED3|LED4); // 灭LED
SysCtlPeripheralDisable(SYSCTL_PERIPH_ETH);
//SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOA);
/* 设置SysTick的加载值 */
SysTickPeriodSet(SleepTime);
/* 使能SysTick的中断 */
SysTickIntEnable();
/* 使能总中断 */
IntMasterEnable();
/* 启动SysTick */
/* 使用DCGCn寄存器或SCGCn寄存器进行控制睡眠时的外设使能,需置位RCC寄存器的ACG位,以开启自动时钟门控 */
SysCtlPeripheralClockGating(true);
/* 选择深度睡眠时的系统时钟源--本例选择30KHZ内部时钟振荡器 */
HWREG(SYSCTL_DSLPCLKCFG) = (3 << 4);
#if SleepMode == 0
/* 在深度睡眠的情况下使能外设TIMER0,使得TIMER0在系统时钟的情况下继续运行 */
HWREG(SYSCTL_DCGC0) = 0x00000000;
HWREG(SYSCTL_DCGC1) = 0x00000000;
HWREG(SYSCTL_DCGC2) = 0x00000000;
//SysCtlPeripheralDeepSleepEnable(SYSCTL_PERIPH_GPIOA);
//SysCtlPeripheralDeepSleepEnable(SYSCTL_PERIPH_TIMER0);
/* 使CM3进入深度睡眠模式--内核停止运行,程序停止运行,必须由中断唤醒内核 */
SysTickEnable();
SysCtlDeepSleep();
#endif
#if SleepMode == 1
HWREG(SYSCTL_SCGC0) = 0x00000000;
HWREG(SYSCTL_SCGC1) = 0x00000000;
HWREG(SYSCTL_SCGC2) = 0x00000000;
SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_TIMER0);
/* 在普通睡眠的情况下使能外设TIMER0,使得TIMER0在系统时钟的情况下继续运行 */
/* 使CM3进入普通睡眠模式--内核停止运行,程序停止运行,必须由中断唤醒内核 */
SysCtlSleep();
#endif
/* 中断唤醒后,继续运行程序 */
while(1)
{
TimeDelay(500000);
GPIOPinWrite(GPIO_PORTA_BASE, LED3 | LED4,~(LED3 | LED4));
TimeDelay(500000);
GPIOPinWrite(GPIO_PORTA_BASE, LED3 | LED4, (LED3 | LED4));
}
}
void SysTick_ISR(void)
{
/* LED取反输出 */
GPIOPinWrite(GPIO_PORTA_BASE,LED2,~GPIOPinRead(GPIO_PORTA_BASE,LED2));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -