⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 systickwakeup.c

📁 深度睡眠模式操作技术笔记
💻 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 + -