toilet

xaxa9ztb - Real Time Clock trên kit NUC220 của nuvoton

Thảo luận trong 'Bài viết dự thi'

Đang xem chủ đề này ( Thành viên: 0, Khách: 0)

  1. Đăng 16/6/14 #1

    xaxa9ztb Kỹ sư

    Số bài viết: 207
    Đã được thích: 195
    vi xử lý NUC220 của nuvoton tích hợp sẵn chức năng Real Time Clock (RTC-Thời gian thực) nên chúng ta không cần đến ds1307 hay 1302 cho các bài toán thời gian thực
    Cũng như 1307, RTC của NUC220 cũng sử dụng thạch anh ngoài 32.768kHz để tạo xung thời gian thực. RTC của NUC220 hơn 1307 ở chỗ nó có hỗ trợ calendar, hỗ trợ interupt Alarm,... Còn lại bộ định thời giây phút ngày tháng năm, các mode 12h/24h, về cơ bản là giống 1307.
    Các hàm cơ bản hay dùng
    Mã:
    _RTC_GET_HOUR() // đọc giá trị giờ
    _RTC_GET_MIN()   //đọc giá trị phút
    _RTC_GET_SEC()     //đọc giá trị giây
    _RTC_GET_YEAR() //đọc giá trị năm
    _RTC_GET_MON()   // đọc giá trị tháng
    _RTC_GET_DAY()    // đọc giá trị ngày trong tháng
    _RTC_GET_DWR() // đọc giá trị ngày trong tuần (thứ 2..CN)
    RTC_SetCurrentTime(uint32_t u32Hour, uint32_t u32Min, uint32_t u32Sec) //set thời gian hiện tại
    RTC_SetCurrentCalendar(uint32_t u32Year, uint32_t u32Mon, uint32_t u32Day) //set lịch hiện tại
    _RTC_SET_DWR(dwr)  // set ngày hiện tại trong tuần
    _RTC_ALARM_INT_ENABLE()  // bật interupt alarm
    RTC_SetAlarmTime(uint32_t u32Hour, uint32_t u32Min, uint32_t u32Sec) // set thời gian báo thức
    RTC_SetAlarmCalendar(uint32_t u32Year, uint32_t u32Mon, uint32_t u32Day) //set ngày, tháng, năm báo thức
    RTC_WaitAccessEnable(void)// hàm wait RTC
    ví dụ: hiển thị RTC lên lcd và set thời gian báo thức
    nguyên lý: khi đến thời gian hẹn giờ thì còi chíp sẽ kêu
    Screenshot - 6_11_2014 , 11_03_42 PM. Screenshot - 6_16_2014 , 12_30_15 AM.
    Mã:
    #include <stdio.h>
    #include<NUC200Series.h>
    #include"SYS.h"
    #include"GPIO.h"
    #include"RTC.h"
    #include"lcd.h"
    #define PLLCON_SETTING      SYSCLK_PLLCON_50MHz_XTAL
    #define PLL_CLOCK           50000000
    
    void delay(uint32_t ucnt)
    {
        volatile uint32_t i = ucnt;
    
        while (i--);
    }
    void SYS_Init(void)
    {
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/
        /* Unlock protected registers */
        SYS_UnlockReg();
    
        /* Enable External XTAL (4~24 MHz) */
        SYSCLK->PWRCON |= SYSCLK_PWRCON_XTL12M_EN_Msk;
    
        /* Waiting for 12MHz clock ready */
        SYS_WaitingForClockReady(SYSCLK_CLKSTATUS_XTL12M_STB_Msk);
    
        /* Switch HCLK clock source to XTAL */
        SYSCLK->CLKSEL0 = SYSCLK_CLKSEL0_HCLK_XTAL;
    
        /* Set PLL to power down mode and PLL_STB bit in CLKSTATUS register will be cleared by hardware.*/
        SYSCLK->PLLCON |= SYSCLK_PLLCON_PD_Msk;
    
        /* Set PLL frequency */
        SYSCLK->PLLCON = PLLCON_SETTING;
    
        /* Waiting for clock ready */
        SYS_WaitingForClockReady(SYSCLK_CLKSTATUS_PLL_STB_Msk);
    
        /* Switch HCLK clock source to PLL */
        SYSCLK->CLKSEL0 = SYSCLK_CLKSEL0_HCLK_PLL;
    
        /* Enable IP clock */
        SYSCLK->APBCLK = SYSCLK_APBCLK_UART0_EN_Msk;
    
        /* IP clock source */
        SYSCLK->CLKSEL1 = SYSCLK_CLKSEL1_UART_PLL;
    
        /* Update System Core Clock */
        /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
        //SystemCoreClockUpdate();
        PllClock        = PLL_CLOCK;            // PLL
        SystemCoreClock = PLL_CLOCK / 1;        // HCLK
        CyclesPerUs     = PLL_CLOCK / 1000000;  // For SYS_SysTickDelay()
    
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/
        /* Set PB multi-function pins for UART0 RXD, UART0 TXD, EINT0 and EINT1 */
        SYS->GPB_MFP = SYS_GPB_MFP_PB0_RXD0 | SYS_GPB_MFP_PB1_TXD0 | SYS_GPB_MFP_PB14_INT0 | SYS_GPB_MFP_PB15_INT1;
    
        /* Lock protected registers */
        SYS_LockReg();
    }
    void SetRTCStartupDateTime(void)
    {
        /* Wait RTC Register Access Enable */
        RTC_WaitAccessEnable();
        RTC_SetCurrentCalendar(15, 6, 14);
        RTC_SetCurrentTime(8, 40, 0);
        _RTC_SET_DWR(RTC_DWR_SUNDAY);
    }
    void RTC_AlarmTest(void)
    {
    
        /* Wait RTC Register Access Enable */
        RTC_WaitAccessEnable();
    
    
        /* Set RTC Alarm Date/Time */
        RTC_SetAlarmCalendar(15, 6, 14);
        RTC_SetAlarmTime(23, 11, 7);
    
        /* Wait RTC Register Access Enable */
        RTC_WaitAccessEnable();
    
        /* Enable RTC Alarm Interrupt */
        _RTC_ALARM_INT_ENABLE();
    
        _GPIO_SET_PIN_MODE(PB,1,GPIO_PMD_OUTPUT);
        PB1 =0;   // buzzer
        delay(500000);
        PB1 =1;
    
        /* Disable RTC Alarm Interrupt */
        _RTC_ALARM_INT_DISABLE();
    
    }
    int main(void)
    {
        SYS_Init();
        init_LCD16x2();
        lcd_clr();
        SetRTCStartupDateTime();
        printS(0,0,"NUVOTON NUC");
        printS(0,1,"codientu.org");
        delay(300000);
        lcd_clr();
        RTC_AlarmTest();
        while(1)
        {
            printC(0,1,(_RTC_GET_HOUR()-48));
            printC(2,1,58); // print ':' to lcd
            printC(3,1,(_RTC_GET_MIN()-48));
            printC(5,1,58);
            printC(6,1,(_RTC_GET_MIN()-48));
        }
    }
    
    p/s: thư viện lcd thì bạn xem lại bài trc của mình viết về giao tiếp với lcd
    daotruongpro thích bài này.
    #1

Chia sẻ trang này