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

📄 drvrtc.c

📁 cortex-m0 LCD1602程序
💻 C
📖 第 1 页 / 共 3 页
字号:
    }
    
    /*-----------------------------------------------------------------------------------------------------*/
    /* Second, set RTC 24/12 hour setting                                                                  */
    /*-----------------------------------------------------------------------------------------------------*/
    if (sPt->u8cClockDisplay == DRVRTC_CLOCK_12)
    {
        DrvRTC_WriteEnable();
 		RTC->TSSR.HR24_HR12 = DRVRTC_CLOCK_12;

        /*-------------------------------------------------------------------------------------------------*/
        /* important, range of 12-hour PM mode is 21 upto 32                                               */
        /*-------------------------------------------------------------------------------------------------*/
        if (sPt->u8cAmPm == DRVRTC_PM)
            sPt->u32cHour += 20;
    }
    else    
    {
        /* RTC_CLOCK_24 */
        DrvRTC_WriteEnable();
 		RTC->TSSR.HR24_HR12 = DRVRTC_CLOCK_24;
        RTCDEBUG ("RTC: 24-hour\n");
    }

    /*-----------------------------------------------------------------------------------------------------*/
    /* Set RTC Calender Loading                                                                            */
    /*-----------------------------------------------------------------------------------------------------*/
    u32Reg    = ((sPt->u32Year - DRVRTC_YEAR2000) / 10) << 20;
    u32Reg    |= (((sPt->u32Year - DRVRTC_YEAR2000) % 10) << 16);
    u32Reg    |= ((sPt->u32cMonth  / 10) << 12);
    u32Reg    |= ((sPt->u32cMonth  % 10) << 8);
    u32Reg    |= ((sPt->u32cDay    / 10) << 4);
    u32Reg    |= (sPt->u32cDay     % 10);
    g_u32Reg = u32Reg;
	
	DrvRTC_WriteEnable();
 	RTC->TSSR.HR24_HR12 = DRVRTC_CLOCK_24;
    outpw(&RTC->CLR, (uint32_t)g_u32Reg);

	/*-----------------------------------------------------------------------------------------------------*/
    /* Set RTC Time Loading                                                                                */
    /*-----------------------------------------------------------------------------------------------------*/
    u32Reg     = ((sPt->u32cHour / 10) << 20);
    u32Reg    |= ((sPt->u32cHour % 10) << 16);
    u32Reg    |= ((sPt->u32cMinute / 10) << 12);
    u32Reg    |= ((sPt->u32cMinute % 10) << 8);
    u32Reg    |= ((sPt->u32cSecond / 10) << 4);
    u32Reg    |= (sPt->u32cSecond % 10);
    g_u32Reg = u32Reg;

 	DrvRTC_WriteEnable();
    outpw(&RTC->TLR, (uint32_t)g_u32Reg);

	outpw(&RTC->DWR, sPt->u32cDayOfWeek);

	RTC->TTR.TWKE = sPt->u8IsEnableWakeUp;

	/* Waiting for RTC settings stable */
  	while(i32delay--);

    return E_SUCCESS;
}

/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvRTC_Read                                                                               */
/*                                                                                                         */
/* Parameter:                                                                                              */
/*               eTime                    		Currnet_Timer/ Alarm_Time                                  */
/*               S_DRVRTC_TIME_DATA_T *spt   	Time Data                                                  */
/* Returns:                                                                                                */
/*               E_SUCCESS               Success.                                                          */
/*               E_DRVRTC_ERR_EIO		 Initial RTC FAILED.                                               */
/*                                                                                                         */
/* DESCRIPTION                                                                                             */
/*               Read current date/time or alarm date/time from RTC setting                                */
//*--------------------------------------------------------------------------------------------------------*/
int32_t DrvRTC_Read(E_DRVRTC_TIME_SELECT eTime, S_DRVRTC_TIME_DATA_T *sPt)
{
    uint32_t u32Tmp;
    
    sPt->u8cClockDisplay = RTC->TSSR.HR24_HR12;     /* 12/24-hour */
    sPt->u32cDayOfWeek   = RTC->DWR.DWR;            /* Day of week */

    switch (eTime)
    {
        case DRVRTC_CURRENT_TIME:		    /* Get Current Time */
        {
			g_u32hiYear  = RTC->CLR.YEAR10 ;
    		g_u32loYear  = RTC->CLR.YEAR1;
    		g_u32hiMonth = RTC->CLR.MON10;
    		g_u32loMonth = RTC->CLR.MON1;
    		g_u32hiDay   = RTC->CLR.DAY10;
    		g_u32loDay   = RTC->CLR.DAY1;

		    g_u32hiHour =  RTC->TLR.HR10;
    		g_u32loHour =  RTC->TLR.HR1;
    		g_u32hiMin  =  RTC->TLR.MIN10;
    		g_u32loMin  =  RTC->TLR.MIN1;
    		g_u32hiSec  =  RTC->TLR.SEC10;
    		g_u32loSec  =  RTC->TLR.SEC1;
            break;
		}
        case DRVRTC_ALARM_TIME:		        /* Get Alarm Time */
        {
			g_u32hiYear  = RTC->CAR.YEAR10 ;
    		g_u32loYear  = RTC->CAR.YEAR1;
    		g_u32hiMonth = RTC->CAR.MON10;
    		g_u32loMonth = RTC->CAR.MON1;
    		g_u32hiDay   = RTC->CAR.DAY10;
    		g_u32loDay   = RTC->CAR.DAY1;

		    g_u32hiHour =  RTC->TAR.HR10;
    		g_u32loHour =  RTC->TAR.HR1;
    		g_u32hiMin  =  RTC->TAR.MIN10;
    		g_u32loMin  =  RTC->TAR.MIN1;
    		g_u32hiSec  =  RTC->TAR.SEC10;
    		g_u32loSec  =  RTC->TAR.SEC1;
            break;
        }
        default:
        {
            return E_DRVRTC_ERR_ENOTTY;
        }
    }

    u32Tmp = (g_u32hiYear * 10);	                    /* Compute to 20XX year */
    u32Tmp+= g_u32loYear;
    sPt->u32Year   =   u32Tmp  + DRVRTC_YEAR2000;
    
    u32Tmp = (g_u32hiMonth * 10);			            /* Compute 0~12 month */
    sPt->u32cMonth = u32Tmp + g_u32loMonth;
    
    u32Tmp = (g_u32hiDay * 10);					        /* Compute 0~31 day */
    sPt->u32cDay   =  u32Tmp  + g_u32loDay;

    if (sPt->u8cClockDisplay == DRVRTC_CLOCK_12)	    /* Compute12/24 hout */
    {
        u32Tmp = (g_u32hiHour * 10);
        u32Tmp+= g_u32loHour;
        sPt->u32cHour = u32Tmp;                         /* AM: 1~12. PM: 21~32. */

        if (sPt->u32cHour >= 21)
        {
            sPt->u8cAmPm = DRVRTC_PM;
            sPt->u32cHour -= 20;
        }
        else
        {
            sPt->u8cAmPm = DRVRTC_AM;
        }
        
        u32Tmp = (g_u32hiMin  * 10);
        u32Tmp+= g_u32loMin;
        sPt->u32cMinute = u32Tmp;
        
        u32Tmp = (g_u32hiSec  * 10);
        u32Tmp+= g_u32loSec;
        sPt->u32cSecond = u32Tmp;

    }
    else
    {   									            /* RTC_CLOCK_24 */
        u32Tmp = (g_u32hiHour * 10);
        u32Tmp+= g_u32loHour;
        sPt->u32cHour   = u32Tmp;
        
        u32Tmp = (g_u32hiMin  * 10);
        u32Tmp+= g_u32loMin;
        sPt->u32cMinute = u32Tmp;
        
        u32Tmp = (g_u32hiSec  * 10);
        u32Tmp+= g_u32loSec;
        sPt->u32cSecond = u32Tmp;
    }

    return E_SUCCESS;

}

/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvRTC_Write                                                                              */
/*                                                                                                         */
/* Parameter:                                                                                              */
/*               eTime                    		Currnet_Timer/ Alarm_Time                                  */
/*               S_DRVRTC_TIME_DATA_T *sPt      Time Data                                                  */
/* Returns:                                                                                                */
/*               E_SUCCESS               Success.                                                          */
/*               E_DRVRTC_ERR_EIO        Initial RTC FAILED.                                               */
/*                                                                                                         */
/* DESCRIPTION                                                                                             */
/*               Update current date/time or alarm date/time from RTC                                      */
//*--------------------------------------------------------------------------------------------------------*/
int32_t DrvRTC_Write(E_DRVRTC_TIME_SELECT eTime, S_DRVRTC_TIME_DATA_T *sPt)
{
    uint32_t u32Reg;

    /*-----------------------------------------------------------------------------------------------------*/
    /* Check RTC time data value is reasonable or not.                                                     */
    /*-----------------------------------------------------------------------------------------------------*/
    if ( ((sPt->u32Year - DRVRTC_YEAR2000) > 99)|
         ((sPt->u32cMonth == 0) || (sPt->u32cMonth > 12))|
         ((sPt->u32cDay   == 0) || (sPt->u32cDay   > 31)))
    {
        RTCDEBUG ("\nRTC: Year value is incorrect\n");
        return E_DRVRTC_ERR_FAILED;
    }

    if ((sPt->u32Year - DRVRTC_YEAR2000) > 99)
    {
        RTCDEBUG ("\nRTC: Year value is incorrect\n");
        return E_DRVRTC_ERR_FAILED;
    }

    if ((sPt->u32cMonth == 0) || (sPt->u32cMonth > 12))
    {
        RTCDEBUG ("\nRTC: Month value is incorrect\n");
        return E_DRVRTC_ERR_FAILED;
    }

    if ((sPt->u32cDay == 0) || (sPt->u32cDay > 31))
    {
        RTCDEBUG ("\nRTC: Day value is incorrect\n");
        return E_DRVRTC_ERR_FAILED;
    }

    if (sPt->u8cClockDisplay == DRVRTC_CLOCK_12)
    {
        if ((sPt->u32cHour == 0) || (sPt->u32cHour > 12))
        {
            RTCDEBUG ("\nRTC: Hour value is incorrect\n");
            return E_DRVRTC_ERR_FAILED;
        }
    }
    else if (sPt->u8cClockDisplay == DRVRTC_CLOCK_24)
    {
        if (sPt->u32cHour > 23)
        {
            RTCDEBUG ("\nRTC: Hour value is incorrect\n");
            return E_DRVRTC_ERR_FAILED;
        }
    }
    else
    {
        RTCDEBUG ("\nRTC: Clock mode is incorrect\n");
        return E_DRVRTC_ERR_FAILED;
    }

    if (sPt->u32cMinute > 59)
    {
        RTCDEBUG ("\nRTC: Minute value is incorrect\n");
        return E_DRVRTC_ERR_FAILED;
    }

    if (sPt->u32cSecond > 59)
    {
        RTCDEBUG ("\nRTC: Second value is incorrect\n");
        return E_DRVRTC_ERR_FAILED;
    }

    if (sPt->u32cDayOfWeek > 6)
    {
        RTCDEBUG ("\nRTC: Day of week value is incorrect\n");
        return E_DRVRTC_ERR_FAILED;
    }

    /*-----------------------------------------------------------------------------------------------------*/
    /* Important, call RTC_Open() before write data into any register.                                     */
    /*-----------------------------------------------------------------------------------------------------*/
    g_u32Reg = DrvRTC_WriteEnable();
    if (g_u32Reg != 0)
    {
        return E_DRVRTC_ERR_FAILED;
    }

    switch (eTime)
    {

        case DRVRTC_CURRENT_TIME:
            /*---------------------------------------------------------------------------------------------*/
            /* Second, set RTC time data.                                                                  */
            /*---------------------------------------------------------------------------------------------*/
            if (sPt->u8cClockDisplay == DRVRTC_CLOCK_12)
            {
                g_chHourMode = DRVRTC_CLOCK_12;
				RTC->TSSR.HR24_HR12 = DRVRTC_CLOCK_12;
                RTCDEBUG ("RTC: 12-hour\n");
                /*-----------------------------------------------------------------------------------------*/
                /* important, range of 12-hour PM mode is 21 upto 32                                       */
                /*-----------------------------------------------------------------------------------------*/
                if (sPt->u8cAmPm == DRVRTC_PM)
                    sPt->u32cHour += 20;
            }
            else                                                                  
            {
                /* RTC_CLOCK_24 */
                g_chHourMode = DRVRTC_CLOCK_24;
    			RTC->TSSR.HR24_HR12 = DRVRTC_CLOCK_24;

⌨️ 快捷键说明

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