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

📄 main.c

📁 LM3S系列Hibernate例程:冬眠RTC唤醒
💻 C
字号:
//  冬眠模块RTC唤醒示例,UART输出日历

#include  <hw_types.h>
#include  <hw_memmap.h>
#include  <hw_sysctl.h>
#include  <hw_gpio.h>
#include  <hw_uart.h>
#include  <hw_hibernate.h>
#include  <sysctl.h>
#include  <gpio.h>
#include  <uart.h>
#include  <hibernate.h>
#include  <stdio.h>

/*  将较长的标识符定义成较短的形式  */
#define  SysCtlPeriEnable       SysCtlPeripheralEnable
#define  SysCtlPeriDisable      SysCtlPeripheralDisable
#define  GPIOPinTypeIn          GPIOPinTypeGPIOInput
#define  GPIOPinTypeOut         GPIOPinTypeGPIOOutput
#define  HibIsActive            HibernateIsActive
#define  HibEnable()            HibernateEnableExpClk(SysCtlClockGet())
#define  HibClockSelect         HibernateClockSelect
#define  HibWakeSet             HibernateWakeSet
#define  HibRequest             HibernateRequest
#define  HibRTCSet              HibernateRTCSet
#define  HibRTCGet              HibernateRTCGet
#define  HibRTCMatch0Set        HibernateRTCMatch0Set
#define  HibRTCEnable           HibernateRTCEnable
#define  HibIntClear            HibernateIntClear

/*  定义按键  */
#define  KEY_PORT               SYSCTL_PERIPH_GPIOB
#define  KEY_PIN                GPIO_PORTB_BASE , GPIO_PIN_5
#define  keyGet()               GPIOPinRead(KEY_PIN)

/*  定义加载RTC初值的按键  */
#define  KEY_LOAD_PORT          SYSCTL_PERIPH_GPIOE
#define  KEY_LOAD_PIN           GPIO_PORTE_BASE , GPIO_PIN_3
#define  keyloadGet()           GPIOPinRead(KEY_LOAD_PIN)

/*  定义LED  */
#define  LED_PORT               SYSCTL_PERIPH_GPIOC
#define  LED_PIN                GPIO_PORTC_BASE , GPIO_PIN_5
#define  ledOn()                GPIOPinWrite(LED_PIN , (0 << 5))
#define  ledOff()               GPIOPinWrite(LED_PIN , (1 << 5))
#define  ledToggle()            GPIOPinWrite(LED_PIN , ~GPIOPinRead(LED_PIN))

/*  防止JTAG失效  */
void  jtagWait(void)
{
    SysCtlPeriEnable(KEY_PORT);                         /*  使能KEY所在的GPIO端口       */
    GPIOPinTypeIn(KEY_PIN);                             /*  设置KEY所在管脚为输入       */
    if ( keyGet()  ==  0x00 ) {                         /*  如果复位时按下KEY,则进入   */
        for (;;);                                       /*  死循环,以等待JTAG连接      */
    }
    SysCtlPeriDisable(KEY_PORT);                        /*  禁止KEY所在的GPIO端口       */
}

/*  延时  */
void  timeDelay(unsigned long  ulVal)
{
    do {
    } while ( --ulVal  !=  0 );
}

/*  UART0初始化  */
void  uart0Init(void)
{
    SysCtlPeriEnable(SYSCTL_PERIPH_GPIOA);              /*  使能UART0所在的GPIOA端口    */
    SysCtlPeriEnable(SYSCTL_PERIPH_UART0);              /*  使能UART0模块               */

    GPIOPinTypeUART(GPIO_PORTA_BASE ,                   /*  配置PA0和PA1为UART功能      */
                    GPIO_PIN_0 | GPIO_PIN_1);

    UARTConfigSet(UART0_BASE ,
                  9600 ,                                /*  波特率:9600                */
                  UART_CONFIG_WLEN_8 |                  /*  数据位:8                   */
                  UART_CONFIG_STOP_ONE |                /*  停止位:1                   */
                  UART_CONFIG_PAR_NONE);                /*  校验位:无                  */

    UARTEnable(UART0_BASE);                             /*  使能UART0端口               */
}

/*  发送1个字符  */
#define  uart0PutC(x)       UARTCharPut(UART0_BASE , x)

/*  发送字符串  */
void  uart0PutS(const  char  *pStr)
{
    char  c;
    for (;;)
    {
        c  =  *(pStr++);
        if (c  ==  '\0') break;
        uart0PutC(c);
    }
}

/*  计算并显示时间  */
void  timeDisplay(unsigned long  ulVal)
{
    char  cBuf[16];

    uart0PutS("\r\n");

    if ( (ulVal / 3600)  <  10 ) {                      /*  计算并显示小时              */
        uart0PutC ('0');
    }
    sprintf(cBuf , "%ld:" , ulVal / 3600);
    ulVal  %=  3600;
    uart0PutS(cBuf);

    if ( (ulVal / 60)  <  10 ) {                        /*  计算并显示分钟              */
        uart0PutC('0');
    }
    sprintf(cBuf , "%ld:" , ulVal / 60);
    ulVal  %=  60;
    uart0PutS(cBuf);

    if ( ulVal  <  10 ) {                               /*  显示秒钟                    */
        uart0PutC('0');
    }
    sprintf(cBuf , "%ld" , ulVal);
    uart0PutS(cBuf);

    uart0PutS("\r\n");
}

int  main(void)
{
    jtagWait();                                         /*  防止JTAG失效,重要!        */

    SysCtlLDOSet(SYSCTL_LDO_2_50V);                     /*  设置LDO输出电压             */

    SysCtlClockSet(SYSCTL_USE_OSC |                     /*  系统时钟设置,采用主振荡器  */
                   SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_8MHZ |
                   SYSCTL_SYSDIV_1);

    timeDelay(50 * (8000000UL / 4000));                 /*  8MHz晶振,延迟约50ms        */

    uart0Init();                                        /*  UART初始化                  */

    SysCtlPeriEnable(SYSCTL_PERIPH_HIBERNATE);          /*  使能冬眠模块                */

    HibEnable();                                        /*  使能冬眠                    */
    HibClockSelect(HIBERNATE_CLOCK_SEL_DIV128);         /*  选择4.1943MHz晶体/128       */
    timeDelay(25 * (8000000UL / 4000));                 /*  8MHz晶振,延迟约25ms        */

    HibWakeSet(HIBERNATE_WAKE_RTC);                     /*  进入冬眠后采用RTC唤醒       */

    SysCtlPeriEnable(KEY_LOAD_PORT);                    /*  使能按键所在的GPIO端口      */
    GPIOPinTypeIn(KEY_LOAD_PIN);                        /*  设置按键所在管脚为输入      */
    if ( keyloadGet()  ==  0x00 ) {                     /*  如果KEY_LOAD被按下,则      */
        HibRTCSet(35920UL);                             /*  设置RTC初值:09:58:40       */
    }
    SysCtlPeriDisable(KEY_LOAD_PORT);                   /*  禁止按键所在的GPIO端口      */

    HibRTCMatch0Set(5 + HibRTCGet());                   /*  设置RTC匹配0的值            */
    HibRTCEnable();                                     /*  使能冬眠RTC                 */

    timeDisplay(HibRTCGet());                           /*  显示RTC时间                 */
    timeDelay(50 * (8000000UL / 4000));                 /*  8MHz晶振,延迟约50ms        */

    HibRequest();                                       /*  请求进入冬眠状态            */

    for (;;) {
    }
}

⌨️ 快捷键说明

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