在线时间825 小时
UID3067179
注册时间2014-10-23
NXP金币2454
TA的每日心情 | 开心 8 小时前 |
---|
签到天数: 1372 天 [LV.10]以坛为家III
版主
- 积分
- 7898
- 最后登录
- 2024-12-12
|
通过RTC中断来唤醒深度睡眠和低功耗模式的MCU。
一、硬件分析
1.1、电路图部分
电路图上RTC有VBAT备用电源和32.768KHz时钟两部分
1.2、手册RTC部分学习
>RTC提供两个中断源
>RTC中断可以从深度睡眠和掉电模式中唤醒
>RTC框图
>RTC定时器包含两个定时器
二、程序部分
2.1、RTC初始化
- //RTC初始化
- void RTC_Init(void)
- {
- Chip_Clock_EnableRTCOsc(); //使能RTC时钟
- Chip_RTC_Init(LPC_RTC); //初始化RTC驱动
- Chip_RTC_Reset(LPC_RTC); //RTC复位
- Chip_RTC_Disable(LPC_RTC); //禁止RTC
- Chip_RTC_SetCount(LPC_RTC, 0); //设置计数寄存器值
- Chip_RTC_SetAlarm(LPC_RTC, 1000); //设置匹配寄存器值
- Chip_RTC_Enable1KHZ(LPC_RTC); //使能RTC 1KHz high resolution定时器
- Chip_RTC_Enable(LPC_RTC); //使能RTC
- Chip_RTC_ClearStatus(LPC_RTC, (RTC_CTRL_OFD | RTC_CTRL_ALARM1HZ | RTC_CTRL_WAKE1KHZ)); //清除状态标志位
- Chip_SYSCTL_EnablePeriphWakeup(SYSCTL_WAKEUP_RTCINT); //使能RTC中断唤醒
- Chip_SYSCTL_SetDeepSleepPD(0);
- Chip_SYSCTL_SetWakeup(SYSCTL_SLPWAKE_ADC_PD |
- SYSCTL_SLPWAKE_USBPLL_PD |
- SYSCTL_SLPWAKE_USBPAD_PD |
- SYSCTL_SLPWAKE_TS_PD
- );
- NVIC_EnableIRQ(RTC_IRQn); //使能中断
- Chip_RTC_EnableWakeup(LPC_RTC, (RTC_CTRL_ALARMDPD_EN | RTC_CTRL_WAKEDPD_EN)); //使能选择的唤醒事件
- }
复制代码
2.2、RTC中断程序
- //RTC中断处理
- void RTC_IRQHandler(void)
- {
- uint32_t rtcStatus;
- rtcStatus = Chip_RTC_GetStatus(LPC_RTC); //获取RTC状态
- Chip_RTC_EnableOptions(LPC_RTC,(rtcStatus & (RTC_CTRL_WAKE1KHZ | RTC_CTRL_ALARM1HZ)));//清除中断
- }
复制代码
2.4、测试程序
- void RTC_TEST(void)
- {
- int stateCounter = 0;
-
- Board_LED_Toggle(2); //蓝色LED翻转
- DEBUGOUT(" wake up \r\n");
- DEBUGOUT(" \r\n");
- rtcWake = rtcAlarm = false;
- /* 10 high resolution ticks that get slower each tick */
- if (stateCounter < 10)
- {
- /* Wakeup in 300, 400, 500, etc. milliSeconds */
- Chip_RTC_SetWake(LPC_RTC, (300 + (stateCounter * 100)));
- stateCounter++;
- }
- else
- { /* And 1 alarm tick with a small delay */
- /* Set alarm to wakeup in 3 seconds */
- Chip_RTC_SetAlarm(LPC_RTC, Chip_RTC_GetCount(LPC_RTC) + 4);
- stateCounter = 0;
- }
- /* Go to deep sleep state - will wake up automatically on interrupt */
- Chip_PMU_DeepSleepState(LPC_PMU);
- }
复制代码
2.5、主程序
- int main(void)
- {
- unsigned int cn=0;
- unsigned char ts=0;
- SystemCoreClockUpdate();
- Board_Init();
- LED_Init();
- RTC_Init();
- while (1)
- {
- RTC_TEST();
- }
- return 0;
- }
复制代码
三、执行结果
板子上蓝色LED灯闪烁
串口输出数据
串口输出不知为何会有乱码。
|
|