RP2040 C SDK RTC功能使用

RP2040 C SDK RTC功能使用


  • 📍《RP2040 C SDK串口功能使用》
  • 🥕RP2040 RTC API官方文档说明:https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#group_hardware_rtc
  • 🥕官方例程参考:https://github.com/raspberrypi/pico-examples

📑RTC 相关API接口函数介绍

  • 🌿void rtc_init (void):初始化rtc。
  • 🌿bool rtc_set_datetime (const datetime_t *t):设置rtc
  • 形参1:
datetime_t t = {.year = 2024,.month = 9,//< 1..12, 1 is January.day = 04,//< 1..28,29,30,31 depending on month.dotw = 3, // 0 is Sunday, so 5 is Friday.hour = 23,//< 0..23.min = 30,//< 0..59.sec = 00};//< 0..59
  • 🌿bool rtc_get_datetime (datetime_t *t):获取时间。
  • 形参1:参考上面的。
  • 🌿bool rtc_running (void):查询rtc运行状态。
  • 🌿void rtc_set_alarm (const datetime_t *t, rtc_callback_t user_callback):设置报警中断
  • 形参1:时间句柄。
  • 形参2:回调函数。
  • 🌿void rtc_enable_alarm (void):使能rtc报警。
  • 🌿void rtc_disable_alarm (void):失能rtc报警
✨使用rtc功能外设,需要在CMakeLists.txt文件中,添加hardware_rtc配置
# Add the standard library to the build
target_link_libraries(RP2040_RTCpico_stdlibhardware_rtc)

📙例程

  • 📘hello_rtc官方给出的使用例程:
/*** Copyright (c) 2020 Raspberry Pi (Trading) Ltd.** SPDX-License-Identifier: BSD-3-Clause*/#include <stdio.h>
#include "hardware/rtc.h"
#include "pico/stdlib.h"
#include "pico/util/datetime.h"/// \tag::hello_rtc_main[]
int main() {stdio_init_all();printf("Hello RTC!\n");char datetime_buf[256];char *datetime_str = &datetime_buf[0];// Start on Friday 5th of June 2020 15:45:00datetime_t t = {.year  = 2020,.month = 06,.day   = 05,.dotw  = 5, // 0 is Sunday, so 5 is Friday.hour  = 15,.min   = 45,.sec   = 00};// Start the RTCrtc_init();rtc_set_datetime(&t);// clk_sys is >2000x faster than clk_rtc, so datetime is not updated immediately when rtc_get_datetime() is called.// tbe delay is up to 3 RTC clock cycles (which is 64us with the default clock settings)sleep_us(64);// Print the timewhile (true) {rtc_get_datetime(&t);datetime_to_str(datetime_str, sizeof(datetime_buf), &t);printf("\r%s  ", datetime_str);sleep_ms(100);}
}
  • 📗RTC报警中断使用例程:

每分钟的固定秒数,产生一次报警中断,一次配置重复触发。

  • 🥕参考:https://github.com/khoih-prog/RP2040_RTC

/*CMSIS-DAP烧录命令:openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c  "adapter speed 5000"-c "program debugprobe.elf verify reset exit"jlink命令: openocd -f interface/jlink.cfg -f target/rp2040.cfg  -c  "adapter speed 2000" -c  "program RP2040_RTC.elf verify reset exit"*/
#include <stdio.h>
#include "pico/stdlib.h"
// #include "hardware/uart.h"
#include "hardware/gpio.h"
#include "hardware/divider.h"
#include "hardware/clocks.h"
#include "hardware/rtc.h"
#include "pico/util/datetime.h"#define GPIO 25#define BUILTIN_LED PICO_DEFAULT_LED_PIN#define ALARM_AT_SECONDS 5
#define ALARM_REPEAT_FOREVER truevolatile bool alarmTriggered = false;
bool setAlarmDone = false;
datetime_t t = {.year = 2024,.month = 9,//注意这里不能写09,编译会报错,可以用16进制:0x09.day = 04,.dotw = 3, // 0 is Sunday, so 5 is Friday.hour = 23,.min = 30,.sec = 00};datetime_t alarmT;//// This is ISR. Be careful. No Serial.print here.
void rtcCallback(void)
{alarmTriggered = true;
}void set_RTC_Alarm(datetime_t *alarmTime)
{rtc_set_alarm(alarmTime, rtcCallback);
}void setAlarmOnce(uint8_t alarmSeconds)
{rtc_get_datetime(&alarmT);if (alarmSeconds > alarmT.sec)alarmT.sec = alarmSeconds;else{// Alarm in next minutealarmT.sec = alarmSeconds;alarmT.min += 1;}set_RTC_Alarm(&alarmT);printf("Set One-time Alarm @ alarmSeconds = %d\n", alarmSeconds);
}void setAlarmRepeat(uint8_t alarmSeconds)
{alarmT.min = alarmT.hour = alarmT.day = alarmT.dotw = alarmT.month = alarmT.year = -1;alarmT.sec = (t.sec + ALARM_AT_SECONDS)%60;set_RTC_Alarm(&alarmT);// irq_set_enabled(RTC_IRQ, true);printf("Set Repeatitive Alarm @ alarmSeconds = %d\n", alarmT.sec);
}void setAlarm()
{
#if ALARM_REPEAT_FOREVERsetAlarmRepeat(ALARM_AT_SECONDS);
#elsesetAlarmOnce(ALARM_AT_SECONDS);
#endifsetAlarmDone = true;
}static void alarm_callback(void)
{alarmTriggered = true;// datetime_t t = {0};rtc_get_datetime(&t);char datetime_buf[256];char *datetime_str = &datetime_buf[0];datetime_to_str(datetime_str, sizeof(datetime_buf), &t);printf("Alarm Fired At %s\n", datetime_str);//不推荐在中断回调函数里调用这些语句stdio_flush();alarmT.min = alarmT.hour = alarmT.day = alarmT.dotw = alarmT.month = alarmT.year = -1;alarmT.sec = (t.sec + ALARM_AT_SECONDS)%60;}int main()
{char datetime_buf[256];char *datetime_str = &datetime_buf[0];stdio_init_all();set_sys_clock_khz(133000, true); // 324usuint f_clk_rtc = frequency_count_khz(CLOCKS_FC0_SRC_VALUE_CLK_RTC);uint f_clk_sys = frequency_count_khz(CLOCKS_FC0_SRC_VALUE_CLK_SYS);printf("clk_rtc  = %dkHz\n", f_clk_rtc);printf("clk_sys  = %dkHz\n", f_clk_sys);// Set up our UART//  uart_init(UART_ID, BAUD_RATE);// Set the TX and RX pins by using the function select on the GPIO// Set datasheet for more information on function select//  gpio_set_function(UART_TX_PIN, GPIO_FUNC_UART);//  gpio_set_function(UART_RX_PIN, GPIO_FUNC_UART);printf("Hello RTC!\n");// Start the RTCrtc_init();rtc_set_datetime(&t);bool rtc_status = rtc_running(); //printf("RTC is running = %d\n", rtc_status);// rtc_set_alarm (&alarm, &alarm_callback); // Set an alarm for 5 second from now// irq_set_enabled(RTC_IRQ, true);// irq_set_priority (RTC_IRQ, 1); //设置中断优先级sleep_us(64);// GPIO initialisation.// We will make this GPIO an input, and pull it up by defaultgpio_init(BUILTIN_LED);gpio_set_dir(BUILTIN_LED, 1);gpio_pull_up(BUILTIN_LED);alarmT.min = alarmT.hour = alarmT.day = alarmT.dotw = alarmT.month = alarmT.year = -1;// if (!setAlarmDone)// {//   setAlarm();//   printf("Set Repeatitive Alarm @ alarmSeconds = %d\n",alarmT.sec );// }alarmT.sec = 6;//每1分钟的第6秒报警一次,相对于1分报警一次。
set_RTC_Alarm(&alarmT);while (true){rtc_get_datetime(&t);datetime_to_str(datetime_str, sizeof(datetime_buf), &t);printf("\r%s \n", datetime_str);stdio_flush();sleep_ms(1000);gpio_xor_mask(1ul << BUILTIN_LED); // Toggle the LEDif (alarmTriggered){alarmTriggered = false;printf("clk_sys = %dkHz,clk_rtc = %dkHz,rtc_status:%d\n", f_clk_sys, rtc_running());//57/30printf("Set Repeatitive Alarm @ alarmSeconds = %d\n", alarmT.sec);}}return 0;
}
  • 📗RTC报警中断间隔秒数重复例程:

运行到固定的秒数,产生一次报警中断,如下重复固定秒数,还需要在报警中断后,再次配置一次,下一个间隔时间触发一次。中断后如果不进行配置,则变成每分钟固定秒数触发。


/*CMSIS-DAP烧录命令:openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c  "adapter speed 5000"-c "program debugprobe.elf verify reset exit"jlink命令: openocd -f interface/jlink.cfg -f target/rp2040.cfg  -c  "adapter speed 2000" -c  "program RP2040_RTC.elf verify reset exit"*/
#include <stdio.h>
#include "pico/stdlib.h"
// #include "hardware/uart.h"
#include "hardware/gpio.h"
#include "hardware/divider.h"
#include "hardware/clocks.h"
#include "hardware/rtc.h"
#include "pico/util/datetime.h"// GPIO defines
// Example uses GPIO 2
#define GPIO 25#define BUILTIN_LED PICO_DEFAULT_LED_PIN#define ALARM_AT_SECONDS 5
#define ALARM_REPEAT_FOREVER truevolatile bool alarmTriggered = false;
bool setAlarmDone = false;
datetime_t t = {.year = 2024,.month = 9,.day = 04,.dotw = 3, // 0 is Sunday, so 5 is Friday.hour = 23,.min = 30,.sec = 00};datetime_t alarmT;static volatile bool fired = false;//// This is ISR. Be careful. No Serial.print here.
void rtcCallback(void)
{alarmTriggered = true;
}void set_RTC_Alarm(datetime_t *alarmTime)
{rtc_set_alarm(alarmTime, rtcCallback);
}void setAlarmOnce(uint8_t alarmSeconds)
{rtc_get_datetime(&alarmT);if (alarmSeconds > alarmT.sec)alarmT.sec = alarmSeconds;else{// Alarm in next minutealarmT.sec = alarmSeconds;alarmT.min += 1;}set_RTC_Alarm(&alarmT);printf("Set One-time Alarm @ alarmSeconds = %d\n", alarmSeconds);
}void setAlarmRepeat(uint8_t alarmSeconds)
{alarmT.min = alarmT.hour = alarmT.day = alarmT.dotw = alarmT.month = alarmT.year = -1;alarmT.sec = (t.sec + ALARM_AT_SECONDS)%60;set_RTC_Alarm(&alarmT);// irq_set_enabled(RTC_IRQ, true);printf("Set Repeatitive Alarm @ alarmSeconds = %d\n", alarmT.sec);
}void setAlarm()
{
#if ALARM_REPEAT_FOREVERsetAlarmRepeat(ALARM_AT_SECONDS);
#elsesetAlarmOnce(ALARM_AT_SECONDS);
#endifsetAlarmDone = true;
}
static void alarm_callback(void)
{alarmTriggered = true;// datetime_t t = {0};rtc_get_datetime(&t);char datetime_buf[256];char *datetime_str = &datetime_buf[0];datetime_to_str(datetime_str, sizeof(datetime_buf), &t);printf("Alarm Fired At %s\n", datetime_str);stdio_flush();alarmT.min = alarmT.hour = alarmT.day = alarmT.dotw = alarmT.month = alarmT.year = -1;alarmT.sec = (t.sec + ALARM_AT_SECONDS)%60;}
int main()
{char datetime_buf[256];char *datetime_str = &datetime_buf[0];stdio_init_all();set_sys_clock_khz(133000, true); // 324usuint f_clk_rtc = frequency_count_khz(CLOCKS_FC0_SRC_VALUE_CLK_RTC);uint f_clk_sys = frequency_count_khz(CLOCKS_FC0_SRC_VALUE_CLK_SYS);printf("clk_rtc  = %dkHz\n", f_clk_rtc);printf("clk_sys  = %dkHz\n", f_clk_sys);// Set up our UART//  uart_init(UART_ID, BAUD_RATE);// Set the TX and RX pins by using the function select on the GPIO// Set datasheet for more information on function select//  gpio_set_function(UART_TX_PIN, GPIO_FUNC_UART);//  gpio_set_function(UART_RX_PIN, GPIO_FUNC_UART);printf("Hello RTC!\n");// char datetime_buf[256];// char *datetime_str = &datetime_buf[0];// Start on Friday 5th of June 2020 15:45:00// Start the RTCrtc_init();rtc_set_datetime(&t);bool rtc_status = rtc_running(); //printf("RTC is running = %d\n", rtc_status);// rtc_set_alarm (&alarm, &alarm_callback); // Set an alarm for 5 second from now// irq_set_enabled(RTC_IRQ, true);// irq_set_priority (RTC_IRQ, 1); //设置中断优先级//  clk_sys is >2000x faster than clk_rtc, so datetime is not updated immediately when rtc_get_datetime() is called.//  tbe delay is up to 3 RTC clock cycles (which is 64us with the default clock settings)sleep_us(64);// GPIO initialisation.// We will make this GPIO an input, and pull it up by defaultgpio_init(BUILTIN_LED);gpio_set_dir(BUILTIN_LED, 1);gpio_pull_up(BUILTIN_LED);alarmT.min = alarmT.hour = alarmT.day = alarmT.dotw = alarmT.month = alarmT.year = -1;alarmT.sec = (t.sec + ALARM_AT_SECONDS)%60;//每间隔5秒钟报警一次//alarmT.sec = 6;//每1分钟第6秒报警一次
set_RTC_Alarm(&alarmT);
//setAlarm();//rtc_set_alarm(&alarmT, &alarm_callback);while (true){rtc_get_datetime(&t);datetime_to_str(datetime_str, sizeof(datetime_buf), &t);printf("\r%s \n", datetime_str);stdio_flush();sleep_ms(1000);gpio_xor_mask(1ul << BUILTIN_LED); // Toggle the LED// if (!setAlarmDone)// {//   setAlarm();//   printf("Set Repeatitive Alarm @ alarmSeconds = %d\n",alarmT.sec );// }if (alarmTriggered){alarmTriggered = false;printf("clk_sys = %dkHz,clk_rtc = %dkHz,rtc_status:%d\n", f_clk_sys, rtc_running());// rtc_set_alarm(&alarmT, &alarm_callback);setAlarm();//配置下一次报警时间// printf("Set Repeatitive Alarm @ alarmSeconds = %d\n", alarmT.sec);}}return 0;
}

在这里插入图片描述

🔰两者代码配置区别:
  • 🌿每分钟重复触发:
rtc_get_datetime(&alarmT);alarmT.min = alarmT.hour = alarmT.day = alarmT.dotw = alarmT.month = alarmT.year = -1;alarmT.sec =  alarmSeconds;set_RTC_Alarm(&alarmT);
  • 🌿间隔秒数重复触发:
 alarmT.min = alarmT.hour = alarmT.day = alarmT.dotw = alarmT.month = alarmT.year = -1;alarmT.sec = (t.sec + ALARM_AT_SECONDS)%60;//每间隔5秒钟报警一次set_RTC_Alarm(&alarmT);
  • 🌿如果只配置触发一次:
datetime_t alarm = {.year = 2024,.month = 0x09,.day = 04,.dotw = 3, // 0 is Sunday, so 5 is Friday.hour = 23,.min = 30,.sec = 00};rtc_set_alarm(&alarm, &alarm_callback);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/419576.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】MySQL中表的增删改查——(基础篇)(超详解)

前言&#xff1a; &#x1f31f;&#x1f31f;本期讲解关于MySQL中CDUD的基础操作&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;http://t.csdnimg.cn/fNldO &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 目录 …

【Python篇】详细学习 pandas 和 xlrd:从零开始

文章目录 详细学习 pandas 和 xlrd&#xff1a;从零开始前言一、环境准备和安装1.1 安装 pandas 和 xlrd1.2 验证安装 二、pandas 和 xlrd 的基础概念2.1 什么是 pandas&#xff1f;2.2 什么是 xlrd&#xff1f; 三、使用 pandas 读取 Excel 文件3.1 读取 Excel 文件的基础方法…

Git常用命令备忘

Git常用命令备忘 Git已经成为程序员日常工具之一&#xff0c;那些Git基本的命令&#xff0c;每天都要用得命令你都记住了吗&#xff1f;如果还没的话&#xff0c;笔者整理了一份清单&#xff0c;以备不时之需所用。 ####三个基本概念 工作区(Workspace)是计算机中项目的根目…

熬夜后补救措施

人体的肝功能问题 直接体现在体态和容颜上 伤肝 三大坏行为 熬夜后补救 *补充养b族、口、、锌、硒 加强代谢 能力 (1)另外熬夜后一定要多喝水 提升身体代谢能力 (2)谷肤甘肽清肝 肝脏排毒&#xff0c;减轻负拒 (3)水飞前含量高点 &#xff08;4)熬夜出更多油 容易长痘 需要清…

springboot项目--后端问题记录

springboot项目后端记录 前言一、包1. lombok--自动生成勾子方法作用依赖使用 2. Validated--自动校验作用依赖使用一般参数校验实体参数校验 结论 3. JWT(json web taken) 令牌生成什么是takenJWT包依赖使用获取taken校验 封装的工具类使用 二、处理技巧1. 全局异常处理作用代…

JDBC详细知识点和操作

javaweb的作用&#xff0c;属于中间者&#xff0c;负责逻辑处理 这三部分互相协作组成了网页 javaweb也就是这三部分 一.数据库部分&#xff08;略&#xff09; 二.javaweb程序 1.JDBC 概念&#xff1a;通过java代码操作数据库 数据库种类有很多&#xff0c;比如Oracle&a…

C高级编程 第十六天(树 二叉树)

1.树 1.1结构特点 非线性结构&#xff0c;有一个直接前驱&#xff0c;但可能有多个直接后继有递归性&#xff0c;树中还有树可以为空&#xff0c;即节点个数为零 1.2相关术语 根&#xff1a;即根结点&#xff0c;没有前驱叶子&#xff1a;即终端结点&#xff0c;没有后继森…

6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)

目录 一.堆(Heap)的基本介绍 二.堆的常用操作&#xff08;以小根堆为例&#xff09; 三.实现代码 3.1 堆结构定义 3.2 向下调整算法* 3.3 初始化堆* 3.4 销毁堆 3.4 向上调整算法* 3.5 插入数据 3.6 删除数据 3.7 返回堆顶数据 四.下篇内容 1.堆排序 2.TopK问题 一…

LeetCode第414场周赛(第一题)

目录 一&#xff1a;题目&#xff1a;3280. 将日期转换为二进制表示 一&#xff1a;题目&#xff1a;3280. 将日期转换为二进制表示 给你一个字符串 date&#xff0c;它的格式为 yyyy-mm-dd&#xff0c;表示一个公历日期。 date 可以重写为二进制表示&#xff0c;只需要将年…

一款免费开源功能丰富的看图软件NeeView

NeeView 是一款功能丰富的图像查看软件&#xff0c;它以其独特的浏览体验和广泛的支持格式受到用户的欢迎。NeeView 不仅可以浏览普通的图像文件&#xff0c;还能够查看压缩包内的图片、预览PDF文档甚至播放视频文件。 NeeView 的主要特点&#xff1a; 多格式支持&#xff1a…

高频知识总结 | 算法题如何刷?我的高效刷题方法

1. 前言 所以本文章主要就是详细的告诉大家我的刷题方法论&#xff0c;可以做一个参考&#xff0c;如果你觉得我的分享对你有帮助&#xff0c;希望多多点赞收藏评论转发支持&#xff01; 2. 算法题到底该怎么刷&#xff1f; 回答这个问题只需要两个点&#xff1a;一是刷什么…

JavaWeb笔记整理13——Mybatis

目录 Mybatis介绍 删除 预编译SQL SQL注入 新增 更新 查询 数据封装 条件查询 XML映射文件 动态SQL 更新案例 foreach Mybatis介绍 删除 预编译SQL SQL注入 新增 更新 查询 数据封装 条件查询 XML映射文件 动态SQL <if> 更新案例<set> foreach &l…

AIGC简化文件管理:Python自动重命名Word和PDF文件

1.背景 大家应该也有遇到&#xff0c;自己电脑有很多文件命名不合理的文件&#xff0c;比如&#xff1a;文件1、想法3 &#xff0c;当你长时间再看到这个文件的时候&#xff0c;已经很难知道文件内容。 今天我们将借助AIGC的编码能力&#xff0c;帮我们生成一个批量改文件名的…

Linux内核编程(十五)网络设备驱动

本文目录 一、常见的网络协议二、网络模型二、网络数据的封装和解封装二、抓包工具wireshark三、传输介质四、RJ-45接口1. 百兆网口2. 千兆网口 五、PHY芯片1. 网络变压器的作用2. PHY芯片类型判断 六、MAC控制器七、MAC控制器与PHY芯片连接方式1. MII接口方式&#xff08;百兆…

CSS学习13--学成网例子

CSS例子 学成网 需要使用的图片&#xff1a; 代码&#xff1a; <html><head><style>/*CSS初始化*/* { /*清除内外边框*/padding: 0;margin: 0;}ul {list-style: none; /*清除列表样式*/}.clearfix:before,.clearfix:after { /*清除浮动*/content: &qu…

【Java毕业设计】基于SpringBoot+Vue+uniapp的农产品商城系统

文章目录 一、系统架构1、后端&#xff1a;SpringBoot、Mybatis2、前端&#xff1a;Vue、ElementUI4、小程序&#xff1a;uniapp3、数据库&#xff1a;MySQL 二、系统功能三、系统展示1、小程序2、后台管理系统 一、系统架构 1、后端&#xff1a;SpringBoot、Mybatis 2、前端…

计算机毕业设计SpringBoot+VUE自动灌装生产线 MES 系统设计

采用 B/S 架构&#xff0c;MES 应用软件通过 TCP/IP 协议与自动灌装生产线上的各个工作单元中的 PLC 控制器进行通信&#xff0c;查询或采集由 PLC 控制器采集的生产数据。通过 JAVA 构建的平台与数据库进行连接&#xff0c;实现灌装生产线的生产管理、订单管理、质量管理和数据…

问题: java.sql.SQLException:The server time zone value ‘�й���׼ʱ��‘

原文: Mybatis PlusThe server time zone valuehis unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to uti…

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中&#xff0c; "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时&#xff0c;经常听到第一范式&#xff08;1NF&#xff09;、第二范式&#xff08;2NF&#xff09;、第三范式&#xff08;3NF&#xff09;以及 BCNF&#xff08;Boyce-…

C++操作符重载实例(独立函数)

C操作符重载实例&#xff0c;我们把坐标值CVector的加法进行重载&#xff0c;计算c3c1c2时&#xff0c;也就是计算x3x1x2&#xff0c;y3y1y2&#xff0c;今天我们以独立函数的方式重载操作符&#xff08;加号&#xff09;&#xff0c;以下是C代码&#xff1a; c1802.cpp源代码…