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

📄 intwakesleep.c

📁 深度睡眠模式操作技术笔记
💻 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   (6000000)                                            /* 睡眠时的系统时钟频率           */
#define Baud       (9600)                                               /* 串口通信的波特率               */
#define ClkSrc     (0 << 4)                                             /* 深度睡眠模式的时钟源           */

/*********************************************************************************************************
** Function name:           main	   
** Descriptions:            本示例程序演示了GPIO中断和串口接收中断唤醒睡眠状态
**
** input parameters:        无
** output parameters:       无      
** Returned value:          无	 
** Created By:              Weng Heiwei
** Created date:            2008.07.29
*********************************************************************************************************/
int  main(void)
{
  SysCtlClockSet(SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL |                    /* 配置PLL                        */
                 SYSCTL_XTAL_6MHZ | SYSCTL_OSC_MAIN);                   /* 运行模式下系统时钟为20MHZ      */
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);                          
  SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);                      /* 使能休眠模块                   */
  
  GPIOPadConfigSet(USE_PORT,                                            /* 引脚配置为弱上拉,驱动电流2mA  */
                   OE_LED|BE_LED|KEY_LED|FE_LED|RX_LED|KEY,             
                   GPIO_STRENGTH_2MA,
                   GPIO_PIN_TYPE_STD_WPU);
  
  GPIODirModeSet(USE_PORT,
                 OE_LED|BE_LED|KEY_LED|FE_LED|RX_LED,             
                 GPIO_DIR_MODE_OUT);
  GPIODirModeSet(USE_PORT,KEY,GPIO_DIR_MODE_IN);                        /* 设置引脚数据方向               */
  
  GPIOIntTypeSet(USE_PORT,KEY,GPIO_FALLING_EDGE);                       /* 配置引脚KEY1中断的产生方式     */
  
  GPIOPinIntEnable(USE_PORT,KEY);                                       /* 引脚中断使能                   */
  
  IntEnable(INT_GPIOA);                                                 /* GPIOA模块中断使能              */
 
  GPIOPinWrite(USE_PORT,OE_LED | BE_LED | KEY_LED | FE_LED | RX_LED,
                        ~(OE_LED | BE_LED | KEY_LED | FE_LED | RX_LED));
  TimeDelay(500000);
  GPIOPinWrite(USE_PORT,OE_LED | BE_LED | KEY_LED | FE_LED | RX_LED,
                        (OE_LED | BE_LED | KEY_LED | FE_LED | RX_LED)); /* 测试引脚功能                   */
  
  Uart0Init(Baud,1);                                                    /* UART0初始化                    */
  
  IntMasterEnable();                                                    /* 中断总允许                     */    
  
  HibernateEnableExpClk(SysCtlClockGet());                              /* 使能32KHz的内部振荡器          */
    
  SysCtlPeripheralClockGating(true);                                    /* 置位ACG,开启自动时钟门控      */
  HWREG(SYSCTL_DSLPCLKCFG) = (0 << 23) |                                /* 配置深度睡眠模式下的           */
                                                                        /* 系统时钟分频值                 */
                             ClkSrc;                                    /* 选择深度睡眠模式下的时钟源     */
  while(1) { 
    Uart0Send("**Enter Sleep!**\r\n",strlen("**Enter Sleep!**\r\n"));
    #if SleepMode == 0                                                  /* 深度睡眠模式操作               */
      UARTConfigSetExpClk(UART0_BASE,                                   /* 因为系统时钟频率的改变         */
                          SleepCLK,                                     /* 重新配置串口通信参数           */
                          Baud,
                          UART_CONFIG_WLEN_8  |                 
                          UART_CONFIG_STOP_ONE |               
                          UART_CONFIG_PAR_NONE);
      
      SysCtlPeripheralDeepSleepEnable(SYSCTL_PERIPH_GPIOA);             /* 在深度睡眠模式下使能GPIOA      */
      SysCtlPeripheralDeepSleepEnable(SYSCTL_PERIPH_UART0);             /* 在深度睡眠模式下使能UART0      */
      SysCtlPeripheralDeepSleepEnable(SYSCTL_PERIPH_HIBERNATE);         /* 在深度睡眠模式下使能休眠模块   */
      SysCtlDeepSleep();                                                /* 使CM3进入深度睡眠模式          */
      
      UARTConfigSet(UART0_BASE ,                                        /* CM3被中断异常唤醒              */
                    Baud ,                                              /* 重新配置串口通信参数           */
                    UART_CONFIG_WLEN_8 |                  
                    UART_CONFIG_STOP_ONE |                
                    UART_CONFIG_PAR_NONE);                              
    #endif
      
    #if SleepMode == 1                                                  /* 睡眠模式操作                   */
      SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_GPIOA);                 /* 在睡眠模式下使能GPIOA          */
      SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UART0);                 /* 在睡眠模式下使能UART0          */
      SysCtlSleep();                                                    /* 使CM3进入睡眠模式              */
    #endif

    Uart0Send("Exit Sleep!\r\n",strlen("Exit Sleep!\r\n"));
    while(1) {   
      if (ucBit) {
        Uart0Send("RX:",strlen("RX:"));                               
        Uart0Send(ucBuffer,ucNum);                                    /* 回发数据                       */
        Uart0Send("\r\n",strlen("\r\n"));                             
        ucBit = 0;                                                    /* 清发送标志                     */
        ucNum = 0;
        memset(ucBuffer,0,200);                                       /* 清理缓冲区                     */
        break;
      }
    }
  }
}
/*********************************************************************************************************
** Function name:           KEY1_ISR	   
** Descriptions:            GPIO的中断服务子程序
**
** input parameters:        无
** output parameters:       无      
** Returned value:          无	 
** Created By:              Weng Heiwei
** Created date:            2008.07.29
*********************************************************************************************************/
void KEY1_ISR(void)
{
  unsigned long IntStatus;
  GPIOPinWrite(USE_PORT,KEY_LED,~GPIOPinRead(USE_PORT,KEY_LED));        /* GPIO取反输出                   */
  IntStatus = GPIOPinIntStatus(USE_PORT,true);                          /* 获取屏蔽后的中断状态           */
  GPIOPinIntClear(USE_PORT,IntStatus);                                  /* 清除中断                       */
}
/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -