目的
为了达到节能状态,采用RTCalarm唤醒睡眠。
- 开启RTC以及RTC alarm
- 修改drv_rtc.c中rtc_init,增加连择时钟源,代码如下:
static rt_err_t _rtc_init(void)
{
#ifdef BSP_RTC_USING_LSE
Cy_RTC_SelectClockSource(CY_RTC_CLK_SELECT_WCO);
#else
Cy_RTC_SelectClockSource(CY_RTC_CLK_SELECT_ILO);
#endif
if (cyhal_rtc_init(&rtc_obj) != RT_EOK)
{
LOG_E("rtc init failed.");
return -RT_ERROR;
}
return RT_EOK;
}
- 增加alarm方面的函数如下:
static struct rt_alarm * p_alarm_hour = RT_NULL;
/* 闹钟的回调函数,多个闹钟,可以有多个回调函数,用于创建闹钟时注册。闹钟时间到了,会执行此函数 */
static void alarm_hour_cb(rt_alarm_t alarm, time_t timestamp)
{
LOG_D("alarm_hour_cb ok!
");
}
static void rtc_alarm_hour_create(void)
{
static time_t now;
struct tm *p_tm;
struct rt_alarm_setup alarm_setup_test;
if (p_alarm_hour != RT_NULL)
return;
now = time(NULL);
p_tm = localtime(&now);
alarm_setup_test.flag = RT_ALARM_SECOND;
alarm_setup_test.wktime.tm_year = p_tm->tm_year;
alarm_setup_test.wktime.tm_mon = p_tm->tm_mon;
alarm_setup_test.wktime.tm_mday = p_tm->tm_mday;
alarm_setup_test.wktime.tm_wday = p_tm->tm_wday;
alarm_setup_test.wktime.tm_hour = p_tm->tm_hour + 1;
alarm_setup_test.wktime.tm_min = p_tm->tm_min;
alarm_setup_test.wktime.tm_sec = p_tm->tm_sec;
p_alarm_hour = rt_alarm_create(alarm_hour_cb, &alarm_setup_test);
}
static void rtc_alarm_hour_start(void)
{
if (p_alarm_hour != RT_NULL)
rt_alarm_start(p_alarm_hour);
}
static void rtc_alarm_hour_stop(void)
{
if (p_alarm_hour != RT_NULL)
rt_alarm_stop(p_alarm_hour);
}
static void rtc_alarm_hour_delete(void)
{
if (p_alarm_hour != RT_NULL)
{
if (rt_alarm_delete(p_alarm_hour) == RT_EOK)
p_alarm_hour = RT_NULL;
}
}
- 修改rt_hw_rtc_init函数,增加alarm创建与启动。
static int rt_hw_rtc_init(void)
{
rt_err_t result = RT_EOK;
ifx32_rtc_dev.ops = &_rtc_ops;
if (rt_hw_rtc_register(&ifx32_rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR, RT_NULL) != RT_EOK)
{
LOG_E("rtc init failed");
result = -RT_ERROR;
}
else
{
LOG_D("rtc init success");
}
/* 设置ALARM*/
rtc_alarm_hour_create();
rtc_alarm_hour_start();
return result;
}
- 修改主函数代码如下:
#include
#include
#include "drv_gpio.h"
#define LED_PIN GET_PIN(0, 0)
#define USE_SECONDS_FOR_ALARM 10
#define LONG_GLITCH_DELAY_MS 100u /* in ms */
#define RTC_INTERRUPT_PRIORITY 3u
void set_rtc_alarm_date_time(void);
cyhal_rtc_t rtc_obj;
int main(void)
{
cy_rslt_t result;
__enable_irq();
rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
rt_thread_mdelay(500);
/* Initialize RTC */
cyhal_rtc_enable_event(&rtc_obj, CYHAL_RTC_ALARM, RTC_INTERRUPT_PRIORITY, true);
for (;;)
{
rt_kprintf("Go to DeepSleep mode
");
/* Set the RTC generate alarm after 10 seconds */
set_rtc_alarm_date_time();
cyhal_system_delay_ms(LONG_GLITCH_DELAY_MS);
/* Go to deep sleep */
cyhal_syspm_deepsleep();
rt_kprintf("Wakeup from DeepSleep mode
");
}
}
/*******************************************************************************/
void set_rtc_alarm_date_time(void)
{
cy_rslt_t result;
/* Print the RTC alarm time by UART */
//LOG_D("RTC alarm will be generated after 10 seconds
");
/* Set the RTC alarm for the specified number of seconds in the future by editing the macro(USE_SECONDS_FOR_ALARM) */
result = cyhal_rtc_set_alarm_by_seconds(&rtc_obj, USE_SECONDS_FOR_ALARM);
if (result != CY_RSLT_SUCCESS)
{
rt_kprintf("RTC alarm err
");
}
}
下载到开发板后,打开串口终端,显示系统进入睡眠,然后在10秒钟后唤醒
:
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
RTC
+关注
关注
2文章
423浏览量
65109
发布评论请先 登录
相关推荐
PSC开启模块出现以下错误
PSC_0_REGS, HW_PSC_EMIFA, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);}但出现以下错误:unresolved symbol
发表于 11-04 09:06
浙江常年大量回收英飞凌二手模块系列IGBT模块
英飞凌IGBT模块FF300R12KT3_E 300A,1200V,共发射极,用于矩阵开关,双向变换器等 62mm ? 无锡不限量收购回收英飞凌IGBT模块电话151-5220-9946QQ2360670759
发表于 02-24 17:06
重庆市长期高价回收各种英飞凌IGBT型号模块
英飞凌IGBT模块FF300R12KT3_E 300A,1200V,共发射极,用于矩阵开关,双向变换器等 62mm ?无锡不限量收购回收英飞凌IGBT模块FF400R12KT3_E
发表于 09-17 19:23
分析在RTT中RTC alarm文件的实现方法
alarm.c文件是缺少两个命令字的实现的。分别为RT_DEVICE_CTRL_RTC_SET_ALARM,RT_DEVICE_CTRL_RTC_GET_ALARM。分析
发表于 07-22 10:49
RTC alarm无法进入回调函数这是为什么
alarm 使用data可以正常查看设置时间但是alarm没有执行回调函数 ,alarm使用的示便代码无论怎么设置闹钟,好像闹钟时间都是当前时间减8小时msh
发表于 10-12 11:25
TMS320C6748 DSP 电源及睡眠控制器 (PSC)
PSC)是负责管理系统电源开启/关闭的转换、时钟开启/关闭以及复位(器件级和模块级)。PSC在片上模块(外围和CPU)主要用来提供微电源控制。一个PSC模块是由一个全局PSC(GPSC)和一组本地PSCs(LPSCs)构成。
发表于 11-14 17:04
•19次下载
英飞凌推出62mm CoolSiC™模块,为碳化硅开辟新应用领域
62mm模块配备了英飞凌的CoolSiC MOSFET芯片,可实现极高的电流密度。其极低的开关损耗和传导损耗可以最大限度地减少冷却器件的尺寸。
发表于 07-14 17:40
•1175次阅读
英飞凌联合 RT-Thread 发布 PSoC™ 62 with CAPSENSE ™ evaluation kit开发板
英飞凌联合 RT-Thread 发布 PSoC 62 with CAPSENSE evaluation kit开发板 (以下简称PSoC 6
评论