电子商务网站开发背景及意义,免费的app软件下载安装,建造师培训网校,软文推广模板目录硬知识概述特性功能描述报警功能模式定时器模式CLKOUT输出复位低电压检测器和时钟监视器低电压检测器和时钟监视器寄存器结构寄存器概述BCD编码格式寄存器概述Control/Status 1 寄存器#xff08;内存地址00H#xff09;Control/Status 2 寄存器#xff08;内存地址01H内存地址00HControl/Status 2 寄存器内存地址01HSecondsMinutesHours寄存器DaysWeekdaysMonths/CenturyYears寄存器Alarm寄存器LKOUT频率寄存器计数控制寄存器EXT_CLK测试模式上电复位PORoverride模式串行接口PCF8563 I2C协议驱动程序PCF8563.cPCF8563.h测试程序main.c实验现象STC实验箱4 IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 摘自《PCF8563实时时钟日历芯片选型指南》。
概述 PCF8563是低功耗的CMOS实时时钟日历芯片。它提供一个可编程时钟输出一个中断输出和掉电检测器所有的地址和数据通过12C总线接口串行传递最大总线速度为400Kbits/s每次读写数据后内嵌的字地址寄存器会自动产生增量。
特性
低工作电流典型值0.25 AVDD3.0V TambT_{amb}Tamb25 世纪标志; 大工作电压范围1.0V–5.5V; 低休眠电流典型值为0.25 AVDD3.0VTambT_{amb}Tamb25 400KHz 的I2C接口VDD1.8~5.5V 可编程时钟输出频率为32.768KHz1024Hz、32Hz1Hz; 报警和定时器; 内部集成的振荡器、电容、片内电源复位功能掉电检测器 I2C 从地址读0A3H; 写0A2H; 开漏中断引脚。
功能描述 PCF8563内有16个8位的地址递增寄存器一个32.768 kHz片上集成电容振荡器一个实时时钟源RTC的分频器可编程的时钟输出一个定时器报警器一个低压检测器和400KHz的I2C接口。 所有16个寄存器被设计成可寻址的8位并行寄存器虽然不是所有的位都有效。前两个寄存器内存地址00H和01H用于控制与或状态寄存器。内存地址02H至08H是时钟功能的计数器用于秒、分、时、日、月、年计数器内存地址09H至0CH包含定义报警的条件的报警寄存器。内存地址0DH控制CLKOUT的输出频率.0EH和0FH分别是定时控制器和定时器。 秒、分钟、小时、天、月、年、以及每分钟报警、小时报警、日报警寄存器都以BCD格式编码。平日和星期报警寄存器不以BCD格式编码。 当一个RTC寄存器被读取所有的寄存器的内容被冻结。因此可以避免在读指令跳转期间读取时钟/日历时发生错误。
报警功能模式 通过清除一个或多个报警寄存器最高有效位位AE-报警启用相应的报警条件将被激活。这种方式可以产生从每分钟至每周一次的报警。报警条件设置报警标志AF控制/状态寄存器2的第3位AF可用于产生一个中断INTAF只能通过软件清零。
定时器模式 8位减数计时器地址0FH由定时控制寄存器地址0EH参见表25控制。定时控制寄存器可以选择定时器的时钟源频率4096641或1/60Hz和启用/禁用计时器。从软件加载的8位二进制值的倒计时在每个倒计时结束时定时器设置的定时器标志TF见表7。定时器标志位TF只能由软件清零。根据定时器标志位TF可以产生一个中断INT。每个倒计时阶段都可能会产生中断脉冲信号作为一个永久的积极信号如TF条件下。TI/TP见表7用于控制这种模式的选择。当读取定时器当前的倒计时数值作为返回值。
CLKOUT输出 CLKOUT引脚有可编程方波。由CLKOUT频率寄存器地址0DH见表23控制操作。时钟频率32.768KHz默认102432和1Hz的频率可以作为系统时钟单片机的时钟输入到电荷泵或校准振荡器。CLKOUT开漏输出上电时启用。如果禁用它变为高阻抗。
复位低电压检测器和时钟监视器 PCF8563的包括内部复位电路振荡器停止时复位电路激活。在复位状态下I2C总线初始化所有寄存器和地址指针被清零VLTD1TD0TESTC和AE被设置为逻辑1.
低电压检测器和时钟监视器 PCF8563芯片的低电压探测器。当VDD低于VlowVL位秒寄存器第7位设置表明可靠的时钟/日历信息将不再保证.VL标志只能由软件清零。 位VL用于检测在电池供电情况下VDD慢慢降低到Vlow的情况。在VDD低于Vlow之前应该把VDD从新拉高。这种情况下时间可能被损坏。
寄存器结构
寄存器概述
表4 位标记-: 无效 0标记的应始终与写入逻辑0.
BCD编码格式寄存器概述
表5 位标记-: 无效; [1]不是BCD编码格式。
Control/Status 1 寄存器内存地址00H
表6
Control/Status 2 寄存器内存地址01H
表7
SecondsMinutesHours寄存器 DaysWeekdaysMonths/CenturyYears寄存器 Alarm寄存器 当一个或多个报警寄存器加载一个有效的分、时、日或平日信息其相应的AEAlarm Enable位为逻辑0然后将这些信息将与当前的分、时、日和平日进行比较。当所有启用的比较第一个匹配的位AFAlarm Flag置位。 AF保持置位直到通过软件清除。一旦AF被清0它只会被重新设置时间增量以符合再次报警条件。若报警寄存器AE置1则该报警寄存器被忽略。
LKOUT频率寄存器 计数控制寄存器 8位二进制减计数器有效与否是由计数控制寄存器的TE位控制计数器的时钟源也是由计数控制寄存器选择.计数器中断的产生与控制有状态控制寄存器2控制。为了准确读出计数器的值I2C总线的SCL时钟至少应为计数器时钟的2倍。
EXT_CLK测试模式 测试模式允许进行在线测试在测试环境下可以设置测试的条件并控制芯片的RTC. 通过设置控制状态寄存器1Control/Status 1的位TEST1进入测试环境CLKOUT管脚转换为输入管脚。测试模式下CLKOUT管脚的输入信号取代了芯片内部的64Hz的信号CLKOUT管脚信号每64个上升沿产生1S增量。 CLKOUT管脚提供的信号的最小脉冲带宽为300ns最小周期为1000ns。内部64Hz时钟或者外部信号源被内部预分频器分为1Hz使用STOP预分频器可设置成已知状态当位STOP置位预分频器复位为0。在预分频器再次工作前STOP位必须先清0.从STOP状态第一个1S的占用CLKOUT信号32个上升沿之后每1S的增量占用64个上升沿。 备注进入EXT_CLK测试模式内部64 Hz的时钟不同步进入测试模式时可以假设没有预分频器的状态。
进入EXT_CLK测试模式设置Control/Status 1寄存器的7位TEST11设置Control/Status 1寄存器的5位STOP1清除Control/Status 1寄存器的5位STOP0设置时间寄存器SecondsMinutesHoursDaysWeekdaysMonths/CenturyYears期望值向CLOCKOUT提供32个时钟脉冲读取时间寄存器看第一次变化向CLOCKOUT提供64个时钟脉冲读取时间寄存器看Second寄存器变化重复第78步骤看额外的变量
上电复位PORoverride模式 POR的持续时间和晶体振荡器的启动时间直接相关。由于长期启动这些类型的电路所需要的时间一个禁用POR和加强硬板设备测试机制已建成。这种模式的设置要求I2C总线引脚SDA和SCL如图5所示在一个特定的顺序切换。所有的时间值是最低要求。 一旦已进入override模式芯片立即停止复位和正常运行开始进入EXT_CLK测试模式即通过I2C总线访问。位TESTC写逻辑0停止override模式。只有位TESTC被设置为逻辑1才能再次进入override模式。正常运行期间位TESTC设置逻辑0无效只是为了防止进入POR override模式。
串行接口 PCF8563的串行接口是I2C总线。
PCF8563 I2C协议
寻址在12C总线上传输的任何数据之前首先处理设备应该响应。寻址总是进行传输启动程序后的第一个字节。 PCF8563是一个从接收器或从发送器。因此时钟信号SCL只是一个输入信号但数据信号SDA是双向线。 PCF8563的从地址 时钟/日历的读/写周期在图1112和13所示为不同的PCF8563的I2C总线配置读写周期。 WORD地址是一个4位的值定义下一步要访问寄存器。WORD地址的高4位未使用。
驱动程序 来源51单片机入门经验分享8-关于IIC通信详解及PCF8563芯片显示时间 —— dabing89 stdint.h见【51单片机快速入门指南】1基础知识和工程创建 软件I2C程序见【51单片机快速入门指南】4 软件 I2C
PCF8563.c
/*******************************************************************************
* 文件名PCF8563.c
* 描 述工程c模块文件
* 功 能底层模块文件
* 作者MADE BY DA HE TAO
* 版本号1.0.4(2015.03.02)
*******************************************************************************/
#include PCF8563.h
#include ./Soft_I2C/Soft_I2C.h/*******************************************************************************
* 文件名:变量定义
* 描 述:
* 功 能
* 作 者大核桃
* 版本号1.0.1(2017.05.23)
*******************************************************************************/
uint8_t buffer[7];//数据存储缓存
sTime CurTime;/*******************************************************************************
* 文件名static uint8_t RTC_BinToBcd2(uint8_t BINValue)
* 描 述: 将BIN转换为BCD
* 功 能
* 作 者大核桃
* 版本号1.0.1(2017.03.03)
*******************************************************************************/
static uint8_t RTC_BinToBcd2(uint8_t BINValue)
{uint8_t bcdhigh 0;while (BINValue 10){bcdhigh;BINValue - 10;}return ((uint8_t)(bcdhigh 4) | BINValue);
}/*******************************************************************************
* 文件名static uint8_t RTC_Bcd2ToBin(uint8_t BCDValue)
* 描 述: 将BCD转换为BIN
* 功 能
* 作 者大核桃
* 版本号1.0.1(2017.03.03)
*******************************************************************************/
static uint8_t RTC_Bcd2ToBin(uint8_t BCDValue)
{uint8_t tmp 0;tmp ((uint8_t)(BCDValue (uint8_t)0xF0) (uint8_t)0x04) * 10;return (tmp (BCDValue (uint8_t)0x0F));
}/*******************************************************************************
* 文件名void PCF8563_Write_Byte(uint8_t REG_ADD, uint8_t dat)
* 描 述: PCF8563某寄存器写入一个字节数据
* 功 能REG_ADD要操作寄存器地址 dat 要写入的数据
* 作 者大核桃
* 版本号1.0.1(2017.03.03)
*******************************************************************************/
void PCF8563_Write_Byte(uint8_t REG_ADD, uint8_t dat)
{i2c_mem_write(PCF8563_ADDR, REG_ADD, dat, 1);
}/*******************************************************************************
* 文件名uint8_t PCF8563_Read_Byte(uint8_t REG_ADD)
* 描 述: PCF8563某寄存器读取一个字节数据
* 功 能REG_ADD要操作寄存器地址 读取得到的寄存器的值
* 作 者大核桃
* 版本号1.0.1(2017.03.03)
*******************************************************************************/
uint8_t PCF8563_Read_Byte(uint8_t REG_ADD)
{uint8_t ReData;i2c_mem_read(PCF8563_ADDR, REG_ADD, ReData, 1);return ReData;
}/*******************************************************************************
* 文件名void PCF8563_Write_nByte(uint8_t REG_ADD, uint8_t num, uint8_t *pBuff)
* 描 述: PCF8563写入多组数据
* 功 能REG_ADD要操作寄存器起始地址 num 写入数据数量 *WBuff 写入数据缓存
* 作 者大核桃
* 版本号1.0.1(2017.03.03)
*******************************************************************************/
void PCF8563_Write_nByte(uint8_t REG_ADD, uint8_t num, uint8_t *pBuff)
{i2c_mem_write(PCF8563_ADDR, REG_ADD, pBuff, num);
}
/*******************************************************************************
* 文件名void PCF8563_Read_nByte(uint8_t REG_ADD, uint8_t num, uint8_t *pBuff)
* 描 述: PCF8563读取多组数据
* 功 能REG_ADD要操作寄存器起始地址 num 写入数据数量 *WBuff 读取数据缓存
* 作 者大核桃
* 版本号1.0.1(2017.03.03)
*******************************************************************************/
void PCF8563_Read_nByte(uint8_t REG_ADD, uint8_t num, uint8_t *pBuff)
{i2c_mem_read(PCF8563_ADDR, REG_ADD, pBuff, num);
}/*******************************************************************************
* 文件名void SetRealTime(sTime* time)
* 描 述: PCF8563设置时间信息
* 功 能
* 作 者大核桃
* 版本号1.0.1(2017.03.03)
*******************************************************************************/
void SetRealTime(sTime* time)
{////拷贝数据time-mon ~PCF_Century_SetBitC;buffer[0] time-sec;buffer[1] time-min;buffer[2] time-hour;buffer[3] time-day;buffer[4] time-week;buffer[5] time-mon;buffer[6] time-year;//写入数据到寄存器//PCF8563_Write_nByte(PCF8563_Address_Seconds, 7, buffer);
}/*******************************************************************************
* 文件名void GetRealTime(sTime* time)
* 描 述: PCF8563读取时间信息
* 功 能
* 作 者大核桃
* 版本号1.0.1(2017.03.03)
*******************************************************************************/
void GetRealTime(sTime* time)
{PCF8563_Read_nByte(PCF8563_Address_Seconds, 7, buffer); //读取寄存器数值buffer[0] PCF8563_Shield_Seconds; //屏蔽无效位buffer[1] PCF8563_Shield_Minutes;buffer[2] PCF8563_Shield_Hours;buffer[3] PCF8563_Shield_Days;buffer[4] PCF8563_Shield_WeekDays;buffer[5] PCF8563_Shield_Months_Century;buffer[6] PCF8563_Shield_Years;time-year buffer[6];time-mon buffer[5];time-week buffer[4];time-day buffer[3];time-hour buffer[2];time-min buffer[1];time-sec buffer[0];}/*******************************************************************************
* 文件名: void PCF8563Init(void)
* 描 述: PCF8563初始化时间
* 功 能
* 作 者大核桃
* 版本号1.0.1(2017.05.23)
*******************************************************************************/
void PCF8563Init(void)
{sTime InitTime {0x22, 0x01, 0x10, 0x12,0x00,0x00,0x01}; //22年1月10日12时00分00秒星期一SetRealTime(InitTime);PCF8563_Write_Byte(PCF8563_Address_Control_Status_1, 0x00); PCF8563_Write_Byte(PCF8563_Address_Control_Status_2, 0x00);
}PCF8563.h
/*******************************************************************************
* 文件名PCF8563.h
* 描 述工程模块头文件
* 作者MADE BY DA HE TAO
* 版本号1.0.1(2014.11.29)
*******************************************************************************/
#ifndef _PCF8563_H
#define _PCF8563_H#include stdint.h/*********************************************/
//数据类型定义部分
//定义结构体变量等
/********************************************/typedef struct {uint16_t year;uint8_t mon;uint8_t day;uint8_t hour;uint8_t min;uint8_t sec;uint8_t week;
}sTime;/*********************************************/
//预编译部分
/********************************************//*
此处定义全局变量及函数
*/
extern sTime CurTime;/*********************************************/
//子函数引用声明部分
/********************************************/#define PCF8563_Check_Data (uint8_t)0x55 //检测用可用其他数值#define PCF8563_ADDR (uint8_t)0x51 //7位地址
#define PCF8563_Write (uint8_t)0xa2 //写命令
#define PCF8563_Read (uint8_t)0xa3 //读命令或者用PCF8563_Write 1//
//电源复位功能
//
#define PCF8563_PowerResetEnable (uint8_t)0x08
#define PCF8563_PowerResetDisable (uint8_t)0x09//
//世纪位操作定义
//
#define PCF_Century_SetBitC (uint8_t)0x80#define PCF_Century_19xx (uint8_t)0x03
#define PCF_Century_20xx (uint8_t)0x04//
//数据格式
//
#define PCF_Format_BIN (uint8_t)0x01
#define PCF_Format_BCD (uint8_t)0x02//
//设置PCF8563模式用
//
#define PCF_Mode_Normal (uint8_t)0x05/******************************************************************************参数寄存器地址宏定义
******************************************************************************/#define PCF8563_Address_Control_Status_1 (uint8_t)0x00 //控制/状态寄存器1
#define PCF8563_Address_Control_Status_2 (uint8_t)0x01 //控制/状态寄存器2/******************************************************************************参数屏蔽宏定义
******************************************************************************/#define PCF8563_Shield_Control_Status_1 (uint8_t)0xa8
#define PCF8563_Shield_Control_Status_2 (uint8_t)0x1f#define PCF8563_Shield_Seconds (uint8_t)0x7f
#define PCF8563_Shield_Minutes (uint8_t)0x7f
#define PCF8563_Shield_Hours (uint8_t)0x3f#define PCF8563_Shield_Days (uint8_t)0x3f
#define PCF8563_Shield_WeekDays (uint8_t)0x07
#define PCF8563_Shield_Months_Century (uint8_t)0x1f
#define PCF8563_Shield_Years (uint8_t)0xff/******************************************************************************参数宏定义
******************************************************************************/
#define PCF8563_Address_Years (uint8_t)0x08 //年
#define PCF8563_Address_Months (uint8_t)0x07 //月
#define PCF8563_Address_Days (uint8_t)0x05 //日
#define PCF8563_Address_WeekDays (uint8_t)0x06 //星期
#define PCF8563_Address_Hours (uint8_t)0x04 //小时
#define PCF8563_Address_Minutes (uint8_t)0x03 //分钟
#define PCF8563_Address_Seconds (uint8_t)0x02 //秒
//控制/状态寄存器1 -- 0x00
//
#define PCF_Control_Status_NormalMode (uint8_t)(~(17)) //普通模式
#define PCF_Control_Status_EXT_CLKMode (uint8_t)(17) //EXT_CLK测试模式
#define PCF_Control_ChipRuns (uint8_t)(~(15)) //芯片运行
#define PCF_Control_ChipStop (uint8_t)(15) //芯片停止运行所有芯片分频器异步置逻辑0
#define PCF_Control_TestcClose (uint8_t)(~(13)) //电源复位功能失效普通模式时置逻辑0
#define PCF_Control_TestcOpen (uint8_t)(13) //电源复位功能有效
//秒寄存器 -- 0x02
//
#define PCF_Accuracy_ClockNo (uint8_t)(17) //不保证准确的时钟/日历数据
#define PCF_Accuracy_ClockYes (uint8_t)(~(17)) //保证准确的时钟/日历数据/******************************************************************************外部功能函数
******************************************************************************/void PCF8563_Write_Byte (uint8_t REG_ADD, uint8_t dat); //PCF8563某寄存器写入一个字节数据
uint8_t PCF8563_Read_Byte (uint8_t REG_ADD); //PCF8563某寄存器读取一个字节数据
void PCF8563_Write_nByte (uint8_t REG_ADD, uint8_t num, uint8_t *pBuff); //PCF8563写入多组数据
void PCF8563_Read_nByte (uint8_t REG_ADD, uint8_t num, uint8_t *pBuff); //PCF8563读取多组数据void SetRealTime(sTime *time); //PCF8563写入时间信息
void GetRealTime(sTime *time); //PCF8563读取时间信息
void PCF8563Init(void);#endif/******************* (C) COPYRIGHT 2016 青蓝电子科技 *****END OF FILE****/测试程序 main.c
#include ./Drivers/config.h
#include ./Drivers/delay.h#include ./Drivers/GPIO.h
#include ./Drivers/soft_uart.h
#include stdio.hchar putchar(char Char)
{TxSend(Char);return Char;
}#include PCF8563.hvoid GPIO_config(void)
{GPIO_InitTypeDef GPIO_InitStructure; //结构定义GPIO_InitStructure.Mode GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_InitStructure.Pin GPIO_Pin_0 | GPIO_Pin_1; //指定要初始化的IO, 或操作GPIO_Inilize(GPIO_P1,GPIO_InitStructure);
}void main(void)
{GPIO_config();PCF8563Init();while(1){GetRealTime(CurTime);//读取时间printf(%x %x %x %x %x %x %x\r\n, (int)CurTime.year, (int)CurTime.mon, (int)CurTime.day, (int)CurTime.hour, (int)CurTime.min, (int)CurTime.sec, (int)CurTime.week);delay_ms(500);}
}实验现象 打开串口调试助手可见能成功读取时钟值。