?? 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)
{
/* 設(shè)置系統(tǒng)時鐘--6MHZ */
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC |
SYSCTL_XTAL_6MHZ| SYSCTL_OSC_MAIN);
/* 使能外設(shè)GPIOA */
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH);
/* 配置引腳驅(qū)動 */
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);
/* 設(shè)置SysTick的加載值 */
SysTickPeriodSet(SleepTime);
/* 使能SysTick的中斷 */
SysTickIntEnable();
/* 使能總中斷 */
IntMasterEnable();
/* 啟動SysTick */
/* 使用DCGCn寄存器或SCGCn寄存器進行控制睡眠時的外設(shè)使能,需置位RCC寄存器的ACG位,以開啟自動時鐘門控 */
SysCtlPeripheralClockGating(true);
/* 選擇深度睡眠時的系統(tǒng)時鐘源--本例選擇30KHZ內(nèi)部時鐘振蕩器 */
HWREG(SYSCTL_DSLPCLKCFG) = (3 << 4);
#if SleepMode == 0
/* 在深度睡眠的情況下使能外設(shè)TIMER0,使得TIMER0在系統(tǒng)時鐘的情況下繼續(xù)運行 */
HWREG(SYSCTL_DCGC0) = 0x00000000;
HWREG(SYSCTL_DCGC1) = 0x00000000;
HWREG(SYSCTL_DCGC2) = 0x00000000;
//SysCtlPeripheralDeepSleepEnable(SYSCTL_PERIPH_GPIOA);
//SysCtlPeripheralDeepSleepEnable(SYSCTL_PERIPH_TIMER0);
/* 使CM3進入深度睡眠模式--內(nèi)核停止運行,程序停止運行,必須由中斷喚醒內(nèi)核 */
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);
/* 在普通睡眠的情況下使能外設(shè)TIMER0,使得TIMER0在系統(tǒng)時鐘的情況下繼續(xù)運行 */
/* 使CM3進入普通睡眠模式--內(nèi)核停止運行,程序停止運行,必須由中斷喚醒內(nèi)核 */
SysCtlSleep();
#endif
/* 中斷喚醒后,繼續(xù)運行程序 */
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));
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -