体验高精度实时时钟解决方案,实现时间敏感操作的无缝同步。
A
A
硬件概览
它是如何工作的?
RTC 17 Click 基于 RV5C387A,这是一款由日新微电子公司提供的、优化用于低功耗操作的 I2C 可配置实时时钟/日历。RV5C387A 被配置为向 MCU 传输日历和时间数据,并具有集成的中断生成功能。它以从秒到日历年最后两位数的单位读取和写入 MCU 的时间数据。当日历年的最后两位数是 4 的倍数时,该年份将自动识别为闰年。因此,直到 2099 年的闰年都可以自动识别。该 Click board™ 使用标准 I2C 双线接口与 MCU 通信,以读取数据和配置设置,支持高达 400kHz 的快速模式操作。
它还包含一个报警电路,配置为在预设时间从其 A、B 或 C 中断引脚向 mikroBUS™ 插座的 INT 引脚生成中断信号。报警电路允许通过 Alarm_W 和 Alarm_D 寄存器指定两个报警设置。Alarm_W 寄存器(中断 B)允许设置星期、小时和分钟报警,包括多星期几设置的组合,例如星期一和星期三,而 Alarm_D 寄存器(中断 C)允许设置小时和分钟报警。此外,RV5C387A 除了可以从中断 A 引脚生成的报警电路中断信号外,还可以生成周期性中断信号。RTC 17 Click 还具有一个标记为 CLKO 的板载
连接器,提供 32kHz 的时钟脉冲。像这样的最常见 RTC 配置是电池备份,它在停电时保持时间并继续工作。正因如此,除了 BU9873 外,RTC 17 Click 还配备了一个与 3000TR 电池座兼容的纽扣电池座,适用于 12mm 纽扣电池。该 Click board™ 可以通过 VCC SEL 跳线选择 3.3V 或 5V 逻辑电压级别操作。这种方式,3.3V 和 5V 兼容的 MCU 都可以正确使用通信线路。此外,该 Click board™ 配备了包含易于使用的函数和示例代码的库,可用作进一步开发的参考。
功能概述
开发板
Curiosity PIC32 MZ EF 开发板是一个完全集成的 32 位开发平台,特点是高性能的 PIC32MZ EF 系列(PIC32MZ2048EFM),该系列具有 2MB Flash、512KB RAM、集成的浮点单元(FPU)、加密加速器和出色的连接选项。它包括一个集成的程序员和调试器,无需额外硬件。用户可以通过 MIKROE
mikroBUS™ Click™ 适配器板扩展功能,通过 Microchip PHY 女儿板添加以太网连接功能,使用 Microchip 扩展板添加 WiFi 连接能力,并通过 Microchip 音频女儿板添加音频输入和输出功能。这些板完全集成到 PIC32 强大的软件框架 MPLAB Harmony 中,该框架提供了一个灵活且模块化的接口
来应用开发、一套丰富的互操作软件堆栈(TCP-IP、USB)和易于使用的功能。Curiosity PIC32 MZ EF 开发板提供了扩展能力,使其成为连接性、物联网和通用应用中快速原型设计的绝佳选择。
微控制器概述
MCU卡片 / MCU
建筑
PIC32
MCU 内存 (KB)
2048
硅供应商
Microchip
引脚数
100
RAM (字节)
524288
使用的MCU引脚
mikroBUS™映射器
“仔细看看!”
Click board™ 原理图
一步一步来
项目组装
实时跟踪您的结果
通过调试模式的应用程序输出
1. 一旦代码示例加载完成,按下 "DEBUG" 按钮将启动构建过程,并将其编程到创建的设置上,然后进入调试模式。
2. 编程完成后,IDE 中将出现一个带有各种操作按钮的标题。点击绿色的 "PLAY" 按钮开始读取通过 Click board™ 获得的结果。获得的结果将在 "Application Output" 标签中显示。
软件支持
库描述
该库包含 RTC 17 Click 驱动程序的 API。
关键功能:
rtc17_set_time
- 该函数设置起始时间值 - 秒、分钟和小时。rtc17_read_time
- 该函数读取当前时间值 - 秒、分钟和小时。rtc17_read_date
- 该函数读取当前日期值 - 星期几、日期、月份和年份。
开源
代码示例
这个示例可以在 NECTO Studio 中找到。欢迎下载代码,或者您也可以复制下面的代码。
/*!
* @file main.c
* @brief RTC17 Click example
*
* # Description
* This example demonstrates the use of RTC 17 click board by reading and displaying
* the time and date values.
*
* The demo application is composed of two sections :
*
* ## Application Init
* Initializes the driver and logger and performs the click default configuration
* which sets 24h time mode and interrupt to be synchronized with second count-up.
* And after that setting the starting time and date.
*
* ## Application Task
* Waits for the second count-up interrupt and then reads and displays the current
* time and date values on the USB UART.
*
* @author Stefan Filipovic
*
*/
#include "board.h"
#include "log.h"
#include "rtc17.h"
static rtc17_t rtc17;
static log_t logger;
static rtc17_time_t time;
static rtc17_date_t date;
/**
* @brief RTC 17 get day of week name function.
* @details This function returns the name of day of the week as a string.
* @param[in] ctx : Click context object.
* See #rtc17_t object definition for detailed explanation.
* @param[in] day_of_week : Day of week decimal value.
* @return Name of day as a string.
* @note None.
*/
static char *rtc17_get_day_of_week_name ( uint8_t day_of_week );
void application_init ( void )
{
log_cfg_t log_cfg; /**< Logger config object. */
rtc17_cfg_t rtc17_cfg; /**< Click config object. */
/**
* Logger initialization.
* Default baud rate: 115200
* Default log level: LOG_LEVEL_DEBUG
* @note If USB_UART_RX and USB_UART_TX
* are defined as HAL_PIN_NC, you will
* need to define them manually for log to work.
* See @b LOG_MAP_USB_UART macro definition for detailed explanation.
*/
LOG_MAP_USB_UART( log_cfg );
log_init( &logger, &log_cfg );
log_info( &logger, " Application Init " );
// Click initialization.
rtc17_cfg_setup( &rtc17_cfg );
RTC17_MAP_MIKROBUS( rtc17_cfg, MIKROBUS_1 );
if ( I2C_MASTER_ERROR == rtc17_init( &rtc17, &rtc17_cfg ) )
{
log_error( &logger, " Communication init." );
for ( ; ; );
}
if ( RTC17_ERROR == rtc17_default_cfg ( &rtc17 ) )
{
log_error( &logger, " Default configuration." );
for ( ; ; );
}
time.hour = 23;
time.minute = 59;
time.second = 50;
if ( RTC17_OK == rtc17_set_time ( &rtc17, &time ) )
{
log_printf( &logger, " Set time: %.2u:%.2u:%.2u\r\n",
( uint16_t ) time.hour, ( uint16_t ) time.minute, ( uint16_t ) time.second );
}
date.day_of_week = RTC17_SATURDAY;
date.day = 31;
date.month = 12;
date.year = 22;
if ( RTC17_OK == rtc17_set_date ( &rtc17, &date ) )
{
log_printf( &logger, " Set date: %s, %.2u.%.2u.20%.2u.\r\n",
rtc17_get_day_of_week_name ( date.day_of_week ),
( uint16_t ) date.day, ( uint16_t ) date.month, ( uint16_t ) date.year );
}
log_info( &logger, " Application Task " );
}
void application_task ( void )
{
// Wait for interrupt which is synchronized with second count-up
while ( rtc17_get_int_pin ( &rtc17 ) );
rtc17_clear_interrupts ( &rtc17 );
if ( RTC17_OK == rtc17_read_time ( &rtc17, &time ) )
{
log_printf( &logger, " Time: %.2u:%.2u:%.2u\r\n",
( uint16_t ) time.hour, ( uint16_t ) time.minute, ( uint16_t ) time.second );
}
if ( RTC17_OK == rtc17_read_date ( &rtc17, &date ) )
{
log_printf( &logger, " Date: %s, %.2u.%.2u.20%.2u.\r\n\n",
rtc17_get_day_of_week_name ( date.day_of_week ),
( uint16_t ) date.day, ( uint16_t ) date.month, ( uint16_t ) date.year );
}
}
void main ( void )
{
application_init( );
for ( ; ; )
{
application_task( );
}
}
static char *rtc17_get_day_of_week_name ( uint8_t day_of_week )
{
switch ( day_of_week )
{
case RTC17_MONDAY:
{
return "Monday";
}
case RTC17_TUESDAY:
{
return "Tuesday";
}
case RTC17_WEDNESDAY:
{
return "Wednesday";
}
case RTC17_THURSDAY:
{
return "Thursday";
}
case RTC17_FRIDAY:
{
return "Friday";
}
case RTC17_SATURDAY:
{
return "Saturday";
}
case RTC17_SUNDAY:
{
return "Sunday";
}
default:
{
return "Unknown";
}
}
}
// ------------------------------------------------------------------------ END