Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
alarm
RTC
drv_rtc.c alarm 的实现
发布于 2020-08-05 18:28:21 浏览:2907
订阅该版
1. 在RTT提供RTC alarm.c文件是缺少两个命令字的实现的。分别为 - `RT_DEVICE_CTRL_RTC_SET_ALARM`, - `RT_DEVICE_CTRL_RTC_GET_ALARM`。 2. 分析alarm文件实现方法,可见由一个事件集IPC同步控制alarm的主线程。 ```c /** \brief rtc alarm service thread entry * */ static void rt_alarmsvc_thread_init(void *param) { rt_uint32_t recv; _container.current = RT_NULL; while (1) { if (rt_event_recv(&_container.event, 0xFFFF, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &recv) == RT_EOK) { alarm_update(recv); } } } ``` 3. 然后就找到发送事件同步函数代码 ```c void rt_alarm_update(rt_device_t dev, rt_uint32_t event) { rt_event_send(&_container.event, 1); } ``` 4.这样,只要在驱动drv_rtc.c添加相应的配置代码,实验alarm功能即可完成alarm.c的功能。配合stm32cubemx,生成相关代码。并在MDK上调试通过,采用中断方式响应。通过后,再移植到STUDIO上即可。 5.drv_rtc.c添加设置与查询函数 ```c static rt_err_t rt_rtc_control(rt_device_t dev, int cmd, void *args) { rt_err_t result = RT_EOK; RT_ASSERT(dev != RT_NULL); switch (cmd) { case RT_DEVICE_CTRL_RTC_GET_TIME: *(rt_uint32_t *)args = get_rtc_timestamp(); LOG_D("RTC: get rtc_time %x\n", *(rt_uint32_t *)args); break; case RT_DEVICE_CTRL_RTC_SET_TIME: if (set_rtc_time_stamp(*(rt_uint32_t *)args)) { result = -RT_ERROR; } LOG_D("RTC: set rtc_time %x\n", *(rt_uint32_t *)args); break; case RT_DEVICE_CTRL_RTC_SET_ALARM: if (set_rtc_alarm_stamp(*(struct rt_rtc_wkalarm *)args)) { result = -RT_ERROR; } LOG_D("RTC: set rtc_alarm tme : hour: %d , min: %d , sec: %d \n", *(struct rt_rtc_wkalarm *)args->tm_hour,*(struct rt_rtc_wkalarm *)args->tm_min,*(struct rt_rtc_wkalarm *)args->tm_sec); break; case RT_DEVICE_CTRL_RTC_GET_ALARM: *(struct rt_rtc_wkalarm *)args = get_rtc_alarm_stamp(); LOG_D("RTC: get rtc_alarm time : hour: %d , min: %d , sec: %d \n", *(struct rt_rtc_wkalarm *)args->tm_hour,*(struct rt_rtc_wkalarm *)args->tm_min,*(struct rt_rtc_wkalarm *)args->tm_sec); break; } return result; } ``` 6.对应的子函数的实现 ```c static rt_err_t set_rtc_alarm_stamp(struct rt_rtc_wkalarm wkalarm) { RTC_AlarmTypeDef sAlarm = {0}; //struct tm *p_tm; //p_tm = localtime(&time_stamp); if(wkalarm.enable == RT_FALSE) { if (HAL_RTC_DeactivateAlarm(&RTC_Handler,RTC_ALARM_A) != HAL_OK) { return -RT_ERROR; } LOG_D("stop rtc alarm."); }else { /** Enable the Alarm A */ sAlarm.AlarmTime.Hours = wkalarm.tm_hour; sAlarm.AlarmTime.Minutes = wkalarm.tm_min; sAlarm.AlarmTime.Seconds = wkalarm.tm_sec; sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET; sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY; sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; sAlarm.AlarmDateWeekDay = 1; sAlarm.Alarm = RTC_ALARM_A; if (HAL_RTC_SetAlarm_IT(&RTC_Handler, &sAlarm, RTC_FORMAT_BIN) != HAL_OK) { return -RT_ERROR; } LOG_D("set rtc alarm."); } return RT_EOK; } /** * @brief This function handles RTC alarms A and B interrupt through EXTI line 17. */ void RTC_Alarm_IRQHandler(void) { /* USER CODE BEGIN RTC_Alarm_IRQn 0 */ /* USER CODE END RTC_Alarm_IRQn 0 */ HAL_RTC_AlarmIRQHandler(&RTC_Handler); /* USER CODE BEGIN RTC_Alarm_IRQn 1 */ /* USER CODE END RTC_Alarm_IRQn 1 */ } void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) { rt_alarm_update(0,0); } struct rt_rtc_wkalarm get_rtc_alarm_stamp(void) { RTC_AlarmTypeDef sAlarm = {0}; //struct tm tm_new = {0}; struct rt_rtc_wkalarm wkalarm; if (HAL_RTC_GetAlarm(&RTC_Handler, &sAlarm,RTC_ALARM_A, RTC_FORMAT_BIN) != HAL_OK) { LOG_D("get rtc alarm fail!."); } wkalarm.tm_sec = sAlarm.AlarmTime.Seconds; wkalarm.tm_min = sAlarm.AlarmTime.Minutes; wkalarm.tm_hour = sAlarm.AlarmTime.Hours; LOG_D("get rtc alarm."); // return mktime(&tm_new); return wkalarm; } ``` 7.我是采用中断方式响应事件,上面代码添加中断处理函数。在回调里实现发送事件。 ```c /** * @brief This function handles RTC alarms A and B interrupt through EXTI line 17. */ void RTC_Alarm_IRQHandler(void) { /* USER CODE BEGIN RTC_Alarm_IRQn 0 */ /* USER CODE END RTC_Alarm_IRQn 0 */ HAL_RTC_AlarmIRQHandler(&RTC_Handler); /* USER CODE BEGIN RTC_Alarm_IRQn 1 */ /* USER CODE END RTC_Alarm_IRQn 1 */ } void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) { rt_alarm_update(0,0); } ``` 8.由于采用了中断,所以初始化要增加中继使能 ```c /* RTC interrupt DeInit */ HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0); HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn); ``` 9.再配合王老师应用例程,测试即可。 https://club.rt-thread.org/ask/question/e07b2690efcee5cf.html
7
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
mii
这家伙很懒,什么也没写!
文章
1
回答
563
被采纳
69
关注TA
发私信
相关文章
1
RTC驱动框架几点建议
2
求助:RTT在STM32F407上使用内置的RTC设置日期需重启生效,设置时间即时生效,有遇到同样问题的吗?
3
[新人试水] LPC1768 Nano3_9 添加RTC
4
STM32 关于RTC的问题
5
stm32f4xx-HAL BSP的RTC设置不对
6
关于STM32的RTC设置年份不正确的问题
7
RTT的RTC驱动调试
8
rtc驱动中的bkp模块起不到防止时间的重新设置
9
rtc时钟跑十几个小时后,比实际时间快几秒怎么解决
10
stm32如何断电之后开发板rtc时间继续往前跑
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
20
个答案
2
次被采纳
张世争
11
个答案
2
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部