查看: 1728|回复: 1

[原创] 【LPC11U68开发板】+ 7、RTC时钟学习

[复制链接]
  • TA的每日心情
    开心
    2024-4-10 10:22
  • 签到天数: 1317 天

    [LV.10]以坛为家III

    124

    主题

    2831

    帖子

    31

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    7570
    最后登录
    2024-4-10
    发表于 2018-11-28 21:54:57 | 显示全部楼层 |阅读模式
        通过RTC中断来唤醒深度睡眠和低功耗模式的MCU。
                
        一、硬件分析

            1.1、电路图部分
            电路图上RTC有VBAT备用电源和32.768KHz时钟两部分
           1.png


          1.2、手册RTC部分学习
           >RTC提供两个中断源
           100.png    
           >RTC中断可以从深度睡眠和掉电模式中唤醒
           101.png
           >RTC框图
           102.png
            
            >RTC定时器包含两个定时器
             103.png
             


        二、程序部分
       
        2.1、RTC初始化
       
    1. //RTC初始化
    2. void RTC_Init(void)
    3. {
    4.         Chip_Clock_EnableRTCOsc();                //使能RTC时钟
    5.         Chip_RTC_Init(LPC_RTC);                                //初始化RTC驱动
    6.         Chip_RTC_Reset(LPC_RTC);                        //RTC复位
    7.         Chip_RTC_Disable(LPC_RTC);                //禁止RTC
    8.         Chip_RTC_SetCount(LPC_RTC, 0);                                //设置计数寄存器值
    9.         Chip_RTC_SetAlarm(LPC_RTC, 1000);                        //设置匹配寄存器值
    10.         Chip_RTC_Enable1KHZ(LPC_RTC);                                        //使能RTC 1KHz high resolution定时器
    11.         Chip_RTC_Enable(LPC_RTC);                                                        //使能RTC
    12.         Chip_RTC_ClearStatus(LPC_RTC, (RTC_CTRL_OFD | RTC_CTRL_ALARM1HZ | RTC_CTRL_WAKE1KHZ));  //清除状态标志位
    13.         Chip_SYSCTL_EnablePeriphWakeup(SYSCTL_WAKEUP_RTCINT);  //使能RTC中断唤醒
    14.         Chip_SYSCTL_SetDeepSleepPD(0);
    15.         Chip_SYSCTL_SetWakeup(SYSCTL_SLPWAKE_ADC_PD    |
    16.                                                   SYSCTL_SLPWAKE_USBPLL_PD |
    17.                                                   SYSCTL_SLPWAKE_USBPAD_PD |
    18.                                                   SYSCTL_SLPWAKE_TS_PD
    19.                                                   );
    20.         NVIC_EnableIRQ(RTC_IRQn);                                //使能中断
    21.         Chip_RTC_EnableWakeup(LPC_RTC, (RTC_CTRL_ALARMDPD_EN | RTC_CTRL_WAKEDPD_EN));  //使能选择的唤醒事件
    22. }
    复制代码


        2.2、RTC中断程序
       
    1. //RTC中断处理
    2. void RTC_IRQHandler(void)
    3. {
    4.         uint32_t rtcStatus;
    5.         rtcStatus = Chip_RTC_GetStatus(LPC_RTC);   //获取RTC状态
    6.         Chip_RTC_EnableOptions(LPC_RTC,(rtcStatus & (RTC_CTRL_WAKE1KHZ | RTC_CTRL_ALARM1HZ)));//清除中断
    7. }
    复制代码


        2.4、测试程序

    1. void RTC_TEST(void)
    2. {
    3.         int stateCounter = 0;
    4.        
    5.         Board_LED_Toggle(2);   //蓝色LED翻转
    6.   DEBUGOUT("    wake up \r\n");
    7.         DEBUGOUT("    \r\n");

    8.         rtcWake = rtcAlarm = false;

    9.                 /* 10 high resolution ticks that get slower each tick */
    10.                 if (stateCounter < 10)
    11.                 {
    12.                         /* Wakeup in 300, 400, 500, etc. milliSeconds */
    13.                         Chip_RTC_SetWake(LPC_RTC, (300 + (stateCounter * 100)));

    14.                         stateCounter++;
    15.                 }
    16.                 else
    17.                 {        /* And 1 alarm tick with a small delay */
    18.                                 /* Set alarm to wakeup in 3 seconds */
    19.                         Chip_RTC_SetAlarm(LPC_RTC, Chip_RTC_GetCount(LPC_RTC) + 4);

    20.                         stateCounter = 0;
    21.                 }

    22.                 /* Go to deep sleep state - will wake up automatically on interrupt */
    23.                 Chip_PMU_DeepSleepState(LPC_PMU);
    24. }
    复制代码

        2.5、主程序
       
    1. int main(void)
    2. {
    3.         unsigned int cn=0;
    4.         unsigned char ts=0;
    5.         SystemCoreClockUpdate();
    6.         Board_Init();
    7.         LED_Init();
    8.         RTC_Init();

    9.         while (1)
    10.         {
    11.                         RTC_TEST();
    12.         }

    13.         return 0;
    14. }
    复制代码

        三、执行结果
      
            板子上蓝色LED灯闪烁
            串口输出数据
             2.png
      
            串口输出不知为何会有乱码。





























































    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 00:34
  • 签到天数: 1995 天

    [LV.Master]伴坛终老

    23

    主题

    6159

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    11874
    最后登录
    2024-4-19
    发表于 2018-11-29 00:29:34 | 显示全部楼层
    可能是没有接地,有信号干扰导致乱码吧
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-20 19:35 , Processed in 0.125833 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表