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

📄 main.c

📁 基于《Stellaris外设驱动库》的例程:定时器32位RTC用法示例 该程序演示了如何使用定时器配置为32为RTC模式
💻 C
字号:
//  基于《Stellaris外设驱动库》的Timer例程:32位RTC示例
//  32.768kHz振荡信号从CCP2管脚输入,RTC时钟从UART2输出


#include  "UART_GetPut.H"
#include  <hw_types.h>
#include  <hw_memmap.h>
#include  <hw_ints.h>
#include  <hw_sysctl.h>
#include  <hw_gpio.h>
#include  <hw_uart.h>
#include  <hw_timer.h>
#include  <interrupt.h>
#include  <sysctl.h>
#include  <gpio.h>
#include  <uart.h>
#include  <timer.h>
#include  <stdio.h>
#include  "LM3S1138_PinMap.H"


//  将较长的标识符定义成较短的形式
#define  SysCtlPeriEnable       SysCtlPeripheralEnable
#define  SysCtlPeriDisable      SysCtlPeripheralDisable
#define  GPIOPinTypeIn          GPIOPinTypeGPIOInput
#define  GPIOPinTypeOut         GPIOPinTypeGPIOOutput


//  定义KEY
#define  KEY_PERIPH             SYSCTL_PERIPH_GPIOG
#define  KEY_PORT               GPIO_PORTG_BASE
#define  KEY_PIN                GPIO_PIN_5


//  防止JTAG失效
void  JTAG_Wait(void)
{
    SysCtlPeriEnable(KEY_PERIPH);                               //  使能KEY所在的GPIO端口
    GPIOPinTypeIn(KEY_PORT , KEY_PIN);                          //  设置KEY所在管脚为输入

    if ( GPIOPinRead(KEY_PORT , KEY_PIN)  ==  0x00 )            //  如果复位时按下KEY,则进入
    {
        for (;;);                                               //  死循环,以等待JTAG连接
    }

    SysCtlPeriDisable(KEY_PERIPH);                              //  禁止KEY所在的GPIO端口
}


//  产生32.768kHz方波,为定时器RTC功能提供时钟源
void  _32kHz_Init(void)
{
    SysCtlPeriEnable(CCP0_PERIPH);                              //  使能CCP0所在的GPIO端口
    GPIOPinTypeTimer(CCP0_PORT , CCP0_PIN);                     //  配置CCP0所在管脚为Timer功能
    SysCtlPeriEnable(SYSCTL_PERIPH_TIMER0);                     //  使能TIMER0模块

    TimerConfigure(TIMER0_BASE ,                                //  配置Timer0A为16位PWM
                   TIMER_CFG_16_BIT_PAIR | TIMER_CFG_A_PWM); 

    TimerLoadSet(TIMER0_BASE , TIMER_A , 183);                  //  设置TimerA初值,决定PWM周期
    TimerMatchSet(TIMER0_BASE , TIMER_A , 92);                  //  设置TimerA匹配值,决定PWM占空比
    TimerEnable(TIMER0_BASE , TIMER_A); 
}


//  定时器初始化
void  TimerRTC_Init(unsigned long  ulVal)
{
    SysCtlPeriEnable(CCP2_PERIPH);                              //  使能CCP2所在的GPIO端口
    GPIOPinTypeTimer(CCP2_PORT , CCP2_PIN);                     //  配置CCP2管脚为RTC时钟输入

    SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1);                     //  使能定时器模块
    TimerConfigure(TIMER1_BASE , TIMER_CFG_32_RTC);             //  配置定时器为32位RTC模式
    TimerLoadSet(TIMER1_BASE , TIMER_A , ulVal);                //  设置RTC计数器初值
    TimerMatchSet(TIMER1_BASE , TIMER_A , 5 + ulVal);           //  设置RTC匹配值

    TimerIntEnable(TIMER1_BASE , TIMER_RTC_MATCH);              //  使能RTC匹配中断
    IntEnable(INT_TIMER1A);                                     //  使能定时器中断
    IntMasterEnable();                                          //  使能处理器中断

    TimerRTCEnable(TIMER1_BASE);                                //  使能RTC计数
    TimerEnable(TIMER1_BASE , TIMER_A);                         //  使能定时器计数
}


//  计算并显示RTC时钟
void  TimerRTC_Disp(unsigned long  ulVal)
{
    char  cBuf[16];

    //  计算并显示小时
    if ( ulVal / 3600  <  10 )
    {
        UART_Putc('0');
    }

    sprintf(cBuf , "%ld:" , ulVal / 3600);
    ulVal  %=  3600;
    UART_Puts(cBuf);

    //  计算并显示分钟
    if ( ulVal / 60  <  10 )
    {
        UART_Putc('0');
    }

    sprintf(cBuf , "%ld:" , ulVal / 60);
    ulVal  %=  60;
    UART_Puts(cBuf);

    //  显示秒钟,并回车换行
    if ( ulVal  <  10 )
    {
        UART_Putc('0');
    }

    sprintf(cBuf , "%ld\r\n" , ulVal);
    UART_Puts(cBuf);
}


//  系统初始化
void  SystemInit(void)
{
    SysCtlLDOSet(SYSCTL_LDO_2_50V);                             //  设置LDO输出电压

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

    UART_GetPutInit();
    _32kHz_Init();
}


void  main(void)
{
    //  定义时分秒变量,假定当前时间为09:58:40
    unsigned long  ulHour    =  9;                              //  定义小时变量
    unsigned long  ulMinute  =  58;                             //  定义分钟变量
    unsigned long  ulSecond  =  40;                             //  定义秒钟变量

    unsigned long  ulVal;
    
    JTAG_Wait();                                                //  防止JTAG失效,重要!
    SystemInit();                                               //  系统初始化

    ulVal  =  3600 * ulHour + 60 * ulMinute + ulSecond;
    TimerRTC_Init(ulVal);                                       //  定时器初始化

    ulVal  =  TimerValueGet(TIMER1_BASE , TIMER_A);             //  读取当前RTC计时器值
    TimerRTC_Disp(ulVal);                                       //  显示初始时间

    for (;;)
    {
    }
}


//  定时器的中断服务函数
void  Timer1A_ISR(void)
{
    unsigned long  ulStatus;
    unsigned long  ulVal;

    ulStatus  =  TimerIntStatus(TIMER1_BASE , true);
    TimerIntClear(TIMER1_BASE , ulStatus);

    if ( ulStatus & TIMER_RTC_MATCH )
    {
        ulVal  =  TimerValueGet(TIMER1_BASE , TIMER_A);         //  读取当前RTC计时器值
        TimerMatchSet(TIMER1_BASE , TIMER_A , 5 + ulVal);       //  重新设置RTC匹配值
        TimerRTC_Disp(ulVal);                                   //  显示当前时间
    }
}

⌨️ 快捷键说明

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