将实时时钟集成到您的系统中,以进行准确的时间戳和精确的事件排序。
A
A
硬件概览
它是如何工作的?
RTC 16 Click基于BU9873,这是一款来自Rohm Semiconductors的I2C可配置实时时钟/日历,优化了低功耗操作。BU9873被配置为向MCU执行日历和时间数据的串行传输,并带有集成的中断生成功能。它还包含内置的高精度振荡调整电路,该电路使得可以使用数字方法调整时间计数,并纠正晶体振荡器的振荡频率偏差。自动闰年识别也是该RTC的特点之一,直至2099年。这个Click板™通过标准的I2C 2-Wire
接口与MCU通信,以读取数据和配置设置,支持最高400kHz的快速模式操作。还提供了警报和中断功能,当星期几、小时或分钟与预设时间匹配时,将在mikroBUS™插座的INT引脚上输出中断信号。每周的每天可以选择警报为打开或关闭,允许每天输出警告或在由红色LED标记的ALARM指示的特定日期输出。此外,RTC 16 Click还具有一个标记为CLKOUT的板载标头,提供32kHz的时钟脉冲。像这样,最常见的RTC
配置是备有电池支持,即在断电情况下保持时间并在不间断地工作。因此,除了BU9873外,RTC 16 Click还配有与3000TR电池座兼容的按钮电池座,适用于12mm硬币电池。这个Click板™可以通过VCC SEL跳线选择3.3V或5V逻辑电压电平运行。这样,既可以使3.3V又可以使5V的MCU正确使用通信线。此外,这个Click板™配备了一个包含易于使用的函数和示例代码的库,可用作进一步开发的参考。
功能概述
开发板
EasyAVR v7 是第七代AVR开发板,专为快速开发嵌入式应用的需求而设计。它支持广泛的16位AVR微控制器,来自Microchip,并具有一系列独特功能,如强大的板载mikroProg程序员和通过USB的在线电路调试器。开发板布局合理,设计周到,使得最终用户可以在一个地方找到所有必要的元素,如开关、按钮、指示灯、连接器等。EasyAVR v7 通过每个端口的四种不同连接器,比以往更高效地连接附件板、传感器和自定义电子产品。EasyAVR v7 开发板的每个部分
都包含了使同一板块运行最高效的必要组件。一个集成的mikroProg,一个快速的USB 2.0程序员,带有mikroICD硬件在线电路调试器,提供许多有价值的编 程/调试选项和与Mikroe软件环境的无缝集成。除此之外,它还包括一个干净且调节过的开发板电源供应模块。它可以使用广泛的外部电源,包括外部12V电源供应,7-12V交流或9-15V直流通过DC连接器/螺丝端子,以及通过USB Type-B(USB-B)连接器的电源。通信选项如USB-UART和RS-232也包括在内,与
广受好评的mikroBUS™标准、三种显示选项(7段、图形和基于字符的LCD)和几种不同的DIP插座一起,覆盖了广泛的16位AVR MCU。EasyAVR v7 是Mikroe快速开发生态系统的一个组成部分。它由Mikroe软件工具原生支持,得益于大量不同的Click板™(超过一千块板),其数量每天都在增长,它涵盖了原型制作和开发的许多方面。
微控制器概述
MCU卡片 / MCU
建筑
AVR
MCU 内存 (KB)
128
硅供应商
Microchip
引脚数
40
RAM (字节)
16384
使用的MCU引脚
mikroBUS™映射器
“仔细看看!”
Click board™ 原理图
一步一步来
项目组装
实时跟踪您的结果
应用程序输出
此款Click板可通过两种方式进行接口连接和监控:
Application Output
- 在调试模式下,使用“Application Output”窗口进行实时数据监控。按照本教程正确设置它。
UART Terminal
- 通过UART终端使用USB to UART converter监控数据有关详细说明,请查看本教程。
软件支持
库描述
该库包含 RTC 16 Click 驱动程序的 API。
关键功能:
rtc16_set_time
- 该函数设置起始时间数值 - 秒、分钟和小时rtc16_read_time
- 该函数读取当前时间数值 - 秒、分钟和小时rtc16_read_date
- 该函数读取当前日期数值 - 星期几、日期、月份和年份
开源
代码示例
完整的应用程序代码和一个现成的项目可以通过NECTO Studio包管理器直接安装到NECTO Studio。 应用程序代码也可以在MIKROE的GitHub账户中找到。
/*!
* @file main.c
* @brief RTC16 Click example
*
* # Description
* This example demonstrates the use of RTC 16 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 "rtc16.h"
static rtc16_t rtc16;
static log_t logger;
static rtc16_time_t time;
static rtc16_date_t date;
/**
* @brief RTC 16 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 #rtc16_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 *rtc16_get_day_of_week_name ( uint8_t day_of_week );
void application_init ( void )
{
log_cfg_t log_cfg; /**< Logger config object. */
rtc16_cfg_t rtc16_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.
rtc16_cfg_setup( &rtc16_cfg );
RTC16_MAP_MIKROBUS( rtc16_cfg, MIKROBUS_1 );
if ( I2C_MASTER_ERROR == rtc16_init( &rtc16, &rtc16_cfg ) )
{
log_error( &logger, " Communication init." );
for ( ; ; );
}
if ( RTC16_ERROR == rtc16_default_cfg ( &rtc16 ) )
{
log_error( &logger, " Default configuration." );
for ( ; ; );
}
time.hour = 23;
time.minute = 59;
time.second = 50;
if ( RTC16_OK == rtc16_set_time ( &rtc16, &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 = RTC16_SUNDAY;
date.day = 31;
date.month = 12;
date.year = 22;
if ( RTC16_OK == rtc16_set_date ( &rtc16, &date ) )
{
log_printf( &logger, " Set date: %s, %.2u.%.2u.20%.2u.\r\n",
rtc16_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 ( rtc16_get_int_pin ( &rtc16 ) );
rtc16_clear_interrupts ( &rtc16 );
if ( RTC16_OK == rtc16_read_time ( &rtc16, &time ) )
{
log_printf( &logger, " Time: %.2u:%.2u:%.2u\r\n",
( uint16_t ) time.hour, ( uint16_t ) time.minute, ( uint16_t ) time.second );
}
if ( RTC16_OK == rtc16_read_date ( &rtc16, &date ) )
{
log_printf( &logger, " Date: %s, %.2u.%.2u.20%.2u.\r\n\n",
rtc16_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 *rtc16_get_day_of_week_name ( uint8_t day_of_week )
{
switch ( day_of_week )
{
case RTC16_MONDAY:
{
return "Monday";
}
case RTC16_TUESDAY:
{
return "Tuesday";
}
case RTC16_WEDNESDAY:
{
return "Wednesday";
}
case RTC16_THURSDAY:
{
return "Thursday";
}
case RTC16_FRIDAY:
{
return "Friday";
}
case RTC16_SATURDAY:
{
return "Saturday";
}
case RTC16_SUNDAY:
{
return "Sunday";
}
default:
{
return "Unknown";
}
}
}
// ------------------------------------------------------------------------ END