PCF8563驱动(STM32F103系列)
stm32f103教程
stm32f103教程STM32F103是STMicroelectronics(意法半导体)公司推出的一款32位ARM Cortex-M3系列微控制器。
它是专门针对嵌入式应用而设计的,具有高性能、低功耗和高集成度的特点。
本文将介绍STM32F103的基本特性、应用领域以及如何进行开发和使用。
首先,我们来了解一下STM32F103的基本特性。
它采用了ARM Cortex-M3内核,运行频率可达到72MHz。
它拥有多达多种外设,包括通用IO口、串口、SPI、I2C、定时器、ADC、DAC等等。
同时,它还具备多个模拟模块,可用于实现模拟信号的采集和处理。
此外,STM32F103还支持多种通讯协议,如CAN(控制器区域网络)和USB(通用串行总线)等。
总而言之,STM32F103提供了丰富且强大的功能,适用于各种不同的应用场景。
接下来,我们来谈谈STM32F103的应用领域。
由于其高性能和低功耗的特点,STM32F103广泛应用于工业自动化控制、仪器仪表、机器人、安防监控、嵌入式系统等领域。
无论是需要高速数据处理还是稳定可靠的控制任务,STM32F103都能够胜任。
同时,由于其强大的扩展性和丰富的外设接口,开发人员可根据自己的需求进行二次开发和定制,从而实现更多的功能。
那么,如何进行STM32F103的开发和使用呢?首先,我们需要准备开发工具和环境。
STMicroelectronics公司提供了官方的开发工具STM32CubeIDE,它是一款集成式开发环境,提供了图形化的配置界面和丰富的代码库,开发人员可以在其中进行程序开发、调试和下载等操作。
此外,还需要准备一块STM32F103开发板和相关的外设接口。
在开发过程中,我们可以通过编写C语言代码来操作STM32F103的外设。
首先,需要了解STM32F103的寄存器映射,即每个外设在芯片内部的地址和寄存器的配置方式。
然后,我们可以利用官方提供的代码库,通过配置寄存器的值来实现不同的功能。
PCF8563时钟芯片在PGMS中的应用_51单片机应用开发从入门到精通_[共3页]
PCF8563 的定时器是倒数定时器。当倒计时控制寄存器中的 TE 位被置位时有效,其计数值 为定时器倒计数数值寄存器中的数据,计数脉冲频率由 TD1、TD0 决定,每来一个计数脉冲则将 倒计时计数器减 1,当计数器到 0 的时候,置位 TF 位。当命令控制寄存器 2 中的 TIE 位被置位 之后,则将在 INT 引脚上给出一个中断信号。定时器中断信号有两种方式,当 TI/TP 位被置位时, 中断信号为脉冲信号;反之则为低电平信号。需要注意的是 TF 也需要软件清除,例 9.5 给出了定 时器的设置程序段。
#define ADD_CONTROLCOUNTER_REG
#define ADD_COUNTER_REG
0x01 x0e 0x0f
//命令控制寄存器 2 //倒计数控制寄存器 //倒计数寄存器
#define TRUE 1
#define FALSE 0
unsigned char Counter[2]; unsigned char Control_Reg2; bit Read_Flg; bit Write_Flg; void Int0_Deal(void);
{ //清除中断标志,读取相应的时间信息
}
注意:如果设置的是脉冲中断方式,则可以通过将 TIE、TE 或者是倒计数寄存器任一清零 的方法来将其清除。
9.3.2 PCF8563 时钟芯片在 PGMS 中的应用
在 PGMS 中,中心点的 MCS-51 单片机每秒从 PCF8563 接收一个秒信号中断,以该信号作为 控制现场点 MCS-51 单片机采样的同步时钟,同时采集当前的时钟信息,用于存储数据时使用, 中心点 MCS-51 的工作流程如图 9.13 所示。
PCF8563时钟芯片驱动程序
PCF8563时钟芯片驱动详解1概述PCF8563是PHILIPS公司推出的一款工业级含I2C总线接口功能的具有极低功耗的多功能时钟/日历芯片。
PCF8563的多种报警功能、定时器功能、时钟输出功能以及中断输出功能能完成各种复杂的定时服务,甚至可为单片机提供看门狗功能。
部时钟电路、部振荡电路、部低电压检测电路(1.0V)以及两线制I2C 总线通讯方式,不但使外围电路及其简洁,而且也增加了芯片的可靠性。
同时每次读写数据后,嵌的字地址寄存器会自动产生增量。
当然作为时钟芯片,PCF8563亦解决了2000年问题。
因而,PCF8563是一款性价比极高的时钟芯片,它已被广泛用于电表、水表、气表、、传真机、便携式仪器以及电池供电的仪器仪表等产品领域。
2原理图3 8563源代码//******************************************************//define//*****************************************************#define PCF8563_ADDR 0xa2 // PCF8563设备地址#define PCF8563_ENABLE 0x00 // 设置#define PCF8563_SUBADDR 0x02 // 时间地址#define PCF8563_NUMB 0x07 // 时间个数#define PCF8563_LOOPTIME 0x02 // 循环次数#define PCF8563_SECMASK 0x7f // second#define PCF8563_MINMASK 0x7f // minute#define PCF8563_HRMASK 0x3f // hour #define PCF8563_DAYMASK 0x3f // day #define PCF8563_WKMASK 0x07 // week #define PCF8563_MOMASK 0x1f // month #define PCF8563_YRMASK 0xff // year/*void DELAY_US(Uint16 i){ Uint16 m,n;for(m=0;m<i;m++){for(n=0;n<5;n++){_nop_();}}}*//********************************************************** 函数名称: void DELAY_MS(Uint16 i)** 功能描述: 延时函数** 输入:延时毫秒数** 输出:无********************************************************///延时函数单位msvoid DELAY_MS(Uint16 i){ Uint16 m,n;for(m=0;m<i;m++){for(n=0;n<1000;n++){_nop_();}}}/********************************************************** 函数名称: InitCrt()** 功能描述: SD2405的初始化** 输入:无** 输出:无********************************************************/void InitCrt(){//设备地址I2cDeviceAdd = PCF8563_ADDR;}/******************************************************** ** 函数名称: CrtGetDateTime(struct SYSTEM_TIME *Time)** 功能描述: 读取时间** 说明:将从PCF8563中读取的时间放入Time指向的结构中** 输入:无** 输出:无********************************************************/ void CrtGetDateTime(struct SYSTEM_TIME *Time){Uint8 buf[8];//设备地址I2cDeviceAdd = PCF8563_ADDR;SM_Receive (PCF8563_SUBADDR , buf, PCF8563_NUMB);Time->time.ucSecond = buf[0]; //秒Time->time.ucMinute = buf[1]; //分Time->time.ucHour = buf[2]; //时屏蔽最高位Time->date.ucDay = buf[3]; //日Time->Week = buf[4]; //星期Time->date.ucMonth = buf[5]; //月Time->date.ucYear = buf[6]; //年}/******************************************************** ** 函数名称: CrtSetDateTime(struct SYSTEM_TIME *Time)** 功能描述: 设置时间** 说明:将Time指向的结构中日期时间参数设置到sd24.5中** 输入:无** 输出:无********************************************************/ void CrtSetDateTime(struct SYSTEM_TIME *Time){Uint8 buf[8];//设备地址I2cDeviceAdd = PCF8563_ADDR;//写入设置(时钟工作、关闭复位、关闭测试模式)buf[0] = PCF8563_ENABLE;SM_Send (0, buf, 0);//写入日期时间buf[0] = Time->time.ucSecond; //秒buf[1] = Time->time.ucMinute; //分buf[2] = Time->time.ucHour|0x80; //时置为24小时格式buf[3] = Time->date.ucDay; //日buf[4] = Time->Week; //星期buf[5] = Time->date.ucMonth; //月buf[6] = Time->date.ucYear; //年SM_Send (PCF8563_SUBADDR, buf, PCF8563_NUMB);}4 新华龙C8051F022的IIC驱动程序//----------------------------------------------------------------------------- // Includes//-----------------------------------------------------------------------------#include <c8051f020.h> // SFR declarations#include <stdio.h>#include <king.h>#include <DYSJ.h>#include <I2C.H>#define SMB_FREQUENCY 10000L // Target SCL clock rate/****************************************************************************** ** 函数名称:void SPI0_Init()** 功能描述:I2C初始化程序** 说明:1. 置下降沿有效2. 置工作时钟2MHz3.** 输入:无** 输出:无******************************************************************************* /void I2C_Init(){SMB0CN = 0x44; // Enable SMBus with ACKs on acknowledge cycle SMB0CR = -80; //257 - (SYSCLK / (2 * SMB_FREQUENCY));EIE1 |= 2; // SMBus interrupt enable// EA = 1; // Global interrupt enableI2cSM_BUSY = 0; // Free SMBus for first transfer.}/****************************************************************************** ** 函数名称:void SM_Send (Uint8 byte_address,Uint8 *SendBuf,Uint8 count)** 功能描述:I2C写入程序** 说明:1. 等待空闲2. 写入数据3. 等待结束** 输入:地址byte_address、写入数据缓冲区*SendBuf、数量count** 输出:无******************************************************************************* /void SM_Send (Uint8 byte_address,Uint8 *SendBuf,Uint8 count){ET0 = 0; //禁止中断ET2 = 0; //禁止中断while (I2cSM_BUSY); // 等待空闲I2cSM_BUSY = 1; // 置忙SMB0CN = 0x44; // SMBus enabled, ACK on acknowledge cycle I2cSendCount = count; // 置写入数量I2cRecCount = 0; // 读出数量清零I2cSendDPTR = SendBuf; // SMBus enabled, ACK on acknowledge cycle I2CWRITE; // Chip select + WRITEI2cMemAdd = byte_address;STO = 0;STA = 1; // 启动传输FeedWatchdog();while (I2cSM_BUSY); // 等待空闲ET0 = 1; //允许中断ET2 = 1; //允许中断/****************************************************************************** ** 函数名称:void SM_Receive (Uint8 byte_address,Uint8 *ReadBuf,Uint8 count)** 功能描述:I2C读取程序** 说明:1. 等待空闲2. 置地址3. 读取数据3. 等待结束** 输入:地址byte_address、读取数据缓冲区*SendBuf、数量count** 输出:无******************************************************************************* /void SM_Receive (Uint8 byte_address,Uint8 *ReadBuf,Uint8 count){ET0 = 0; //禁止中断ET2 = 0; //禁止中断while (I2cSM_BUSY); // 等待空闲I2cSM_BUSY = 1; // 置忙SMB0CN = 0x44; // SMBus enabled, ACK on acknowledge cycle I2cSendCount = 0; // 置写入数量I2CWRITE; // Chip select + WRITEI2cMemAdd = byte_address; //值地址偏移I2cRecCount = count; //要接收的数据个数I2cRecDPTR = ReadBuf; //指向要接收的数据区STO = 0;STA = 1; // Start transferFeedWatchdog();while (I2cSM_BUSY); // 等待空闲ET0 = 1; //允许中断ET2 = 1; //允许中断}/****************************************************************************** ** 函数名称:void SMBUS_ISR (void) interrupt 7** 功能描述:I2C中断服务程序** 说明:1. 选择器件地址2. 置读写地址3. 读取或写入数据3. 置结束标志** 输入:无** 输出:无******************************************************************************* /void SMBUS_ISR (void) interrupt 7{switch (SMB0STA) // Status code for the SMBus (SMB0STA register){// 主发送器/接收器:起始条件已发送// 在该状态发送的COMMAND 字的R/W 位总是为0(W),// 因为对于读和写操作来说都必须先写存储器地址。
PCF8563源程序
pcf8563驱动C51源程序及应用默认分类2010-02-22 09:50:09 阅读78 评论0 字号:大中小订阅摘要:介绍基于PCF8563设计户外侄计时系统的硬件接口电路及PCF8563软件编程。
该系统在强日光下显示屏的字符清晰可见,能够长时间连续稳定地工作。
关键词:PCF8563 I2C 倒计时系统引言倒计时系统的任务,就是对某一设定日期进行倒数,在显示屏显示当前距离设定日期的时间;广泛应用于重大的节日或活动,以增强人们的关切程度和紧迫感。
户外型倒计时系统,首先要求在强日光下显示屏的字符依然清晰可见,而且要求系统能够长时间连续稳定地工作。
本文介绍的系统正是针对这样的要求而开发出来的。
1 总体设计方案整个系统由时钟芯片、中央处理单元、译码、驱动、显示、键盘几部分构成,系统框图如图1所示。
2 硬件电路设计2.1 时钟芯片PCF8563是Philips公司推出的一款带I2C总线具有极低功耗的多功能时钟/日历芯片,具有四种报警功能和定时功能;内部时钟电路、内部振荡电路、内部低电压检测以两线制I2C 总线通信方式,不但使用外围电路简洁,而且增加了芯片的可靠性。
PCF8563的SCL为时钟输入端,数据随时钟信号同步输入器件或从器件输出;SDA为双向引脚,用于串行数据的输入输出;INT是中断信号输出端,可通过设置报警寄存器按指定时间在该脚产生报警信号,低电平有效;SDA、SCL、INT均为漏极开路,必须上拉电阻;X1、X2分别为反相放大器的输入、输出端;可在X1端接入32.768kHz的石英晶振,配置成片内振荡器。
本系统PCF8563与89C51接口采用图2所示接口方案。
图2中,在X1、X2端接入32.768kHz 的石英晶振,将时钟源配置为片内振荡器。
VDD与地之间国入1个1μF的大电容供电维持时钟芯片,锂电池(3.6V)同时开始工作,给时钟芯片供电,使时钟芯片工作不受影响。
PCF8563与89C51接口采用3根口线,PCF8563的INT脚产生周期为1s的脉冲中断信号给89C51的INT0引脚,89C51产生中断后,通过I2C总线读取PCF8563的基准时间。
PCF8563芯片详细资料(中文版)
读/写
位 AF
值
描述
位 TF
值
描述
0
报警器标志位无效
0
定时器标志位无效
读
1
报警器标志位有效
1
定时器标志位无效
0
报警器标志位清零
0
定时器标志位清零
写
1
报警器标志位保持
1
定时器标志位保持
8.6.3 Seconds, Minutes, Hours 寄存器
8.6.4 Days, Weekdays, Months/Century, Years 寄存器
写。应用中定时器和报警器同时产生中断,通过读这些位决定中断源。为了防止在
2
TF
清除一个标志位时,覆盖到标志位,通过逻辑与运算进行写入。见表 9
1
AIE
当 AF 或 TF 被置位,AIE 和 TIE 有效或无效,产生中断。中断是两种情况的逻辑
0
TIE
或,因此 AIE 和 TIE 都要置位。
AIE = 0: 报警器中断无效; AIE = 1: 报警器中断有效.
所有 16 个寄存器被设计成可寻址的 8 位并行寄存器,虽然不是所有的位都有效。前两 个寄存器(内存地址 00H 和 01H),用于控制与/或状态寄存器。内存地址 02H 至 08H 是时 钟功能的计数器,用于(秒、分、时、日、月、年计数器)。内存地址 09H 至 0CH 包含定 义报警的条件的报警寄存器。内存地址 0DH 控制 CLKOUT 的输出频率。0EH 和 0FH 分别 是定时控制器和定时器。
8.7 EXT_CLK 测试模式
测试模式允许进行在线测试,在测试环境下可以设置测试的条件并控制芯片的 RTC。 通过设置控制状态寄存器 1(Control/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 个上升沿。
PCF8563
地址 寄存器名称 Bit7 Bit6
02h 秒
VL
03h 分钟
04h 小时
05h 日
06h 星期
07h 月/世纪
C
08h 年
09h 分钟报警
AE
0Ah 小时报警
AE
0BH 日报警
AE
0CH 星期报警
AE
注:标明
的位无效
Bit5 Bit4 Bit3
Bit2 Bit1 Bit0
00 59BCD 码格式数
当一个 RTC 寄存器被读时 所有计数器的内容被锁存 因此 在传送条件下 可以禁止对时钟 日 历芯片的错读
-1-
广州周立功单片机发展有限公司 Tel (020)38730976 38730977 Fax 38730925
1. 报警功能模式 一个或多个报警寄存器 MSB AE=Alarm Enable 报警使能位 清 时 相应的报警条件有效 这样 一个报警将在每分钟至每星期范围内产生一次 设置报警标志位 AF 控制 状态寄存器 的位 用于产 生中断 AF 只可以用软件清除
特性 z 宽电压范围 1.0 5.5V 复位电压标准值 Vlow=0.9V z 超低功耗 典型值为 0.25 A VDD=3.0V,Tamb=25 z 可编程时钟输出频率为 32.768KHz 1024Hz 32Hz 1Hz z 四种报警功能和定时器功能 z 内含复位电路 振荡器电容和掉电检测电路 z 开漏中断输出 z 400kHz I2C 总线(VDD=1.8 5.5V) 其从地址 读 0A3H;写 0A2H PCF8563 的管脚排列及描述如图 1 及表 1 所示
图 2 掉电检测
6. PCF8563 内部寄存器 PCF8563 共有 16 个寄存器 其中 00H 01H 为控制方式寄存器 09H 0CH 为报警功能寄存器 0DH 为时钟输出寄存器 0EH 和 0FH 为定时器功能寄存器 02H 08H 为秒 年时间寄存器 各寄存器的位描 述如表 2 及 3.14 所示
PCF8563时钟芯片驱动程序
PCF8563时钟芯片驱动详解1概述PCF8563是PHILIPS公司推出的一款工业级内含I2C总线接口功能的具有极低功耗的多功能时钟/日历芯片。
PCF8563的多种报警功能、定时器功能、时钟输出功能以及中断输出功能能完成各种复杂的定时服务,甚至可为单片机提供看门狗功能。
内部时钟电路、内部振荡电路、内部低电压检测电路(1.0V)以及两线制I2C总线通讯方式,不但使外围电路及其简洁,而且也增加了芯片的可靠性。
同时每次读写数据后,内嵌的字地址寄存器会自动产生增量。
当然作为时钟芯片,PCF8563亦解决了2000年问题。
因而,PCF8563是一款性价比极高的时钟芯片,它已被广泛用于电表、水表、气表、电话、传真机、便携式仪器以及电池供电的仪器仪表等产品领域。
2原理图3 8563源代码//******************************************************//define//*****************************************************#define PCF8563_ADDR0xa2// PCF8563设备地址#define PCF8563_ENABLE0x00// 设置#define PCF8563_SUBADDR0x02// 时间地址#define PCF8563_NUMB0x07// 时间个数#define PCF8563_LOOPTIME0x02// 循环次数#define PCF8563_SECMASK 0x7f// second#define PCF8563_MINMASK 0x7f// minute#define PCF8563_HRMASK 0x3f// hour#define PCF8563_DAYMASK 0x3f// day#define PCF8563_WKMASK 0x07// week#define PCF8563_MOMASK 0x1f// month#define PCF8563_YRMASK 0xff// year/*void DELAY_US(Uint16 i){Uint16 m,n;for(m=0;m<i;m++){for(n=0;n<5;n++){_nop_();}}}*//******************************************************** ** 函数名称: void DELAY_MS(Uint16 i)** 功能描述: 延时函数** 输入:延时毫秒数** 输出:无********************************************************///延时函数单位msvoid DELAY_MS(Uint16 i){Uint16 m,n;for(m=0;m<i;m++){for(n=0;n<1000;n++){_nop_();}}}/******************************************************** ** 函数名称: InitCrt()** 功能描述: SD2405的初始化** 输入:无** 输出:无********************************************************/ void InitCrt(){//设备地址I2cDeviceAdd = PCF8563_ADDR;}/******************************************************** ** 函数名称: CrtGetDateTime(struct SYSTEM_TIME *Time)** 功能描述: 读取时间** 说明:将从PCF8563中读取的时间放入Time指向的结构中** 输入:无** 输出:无********************************************************/ void CrtGetDateTime(struct SYSTEM_TIME *Time){Uint8 buf[8];//设备地址I2cDeviceAdd = PCF8563_ADDR;SM_Receive (PCF8563_SUBADDR , buf, PCF8563_NUMB);Time->time.ucSecond = buf[0];//秒Time->time.ucMinute = buf[1];//分Time->time.ucHour = buf[2];//时屏蔽最高位Time->date.ucDay = buf[3];//日Time->Week = buf[4];//星期Time->date.ucMonth = buf[5];//月Time->date.ucYear = buf[6];//年}/******************************************************** ** 函数名称: CrtSetDateTime(struct SYSTEM_TIME *Time)** 功能描述: 设置时间** 说明:将Time指向的结构中日期时间参数设置到sd24.5中** 输入:无** 输出:无********************************************************/ void CrtSetDateTime(struct SYSTEM_TIME *Time){Uint8 buf[8];//设备地址I2cDeviceAdd = PCF8563_ADDR;//写入设置(时钟工作、关闭复位、关闭测试模式)buf[0] = PCF8563_ENABLE;SM_Send (0, buf, 0);//写入日期时间buf[0] = Time->time.ucSecond;//秒buf[1] = Time->time.ucMinute;//分buf[2] = Time->time.ucHour|0x80;//时置为24小时格式buf[3] = Time->date.ucDay;//日buf[4] = Time->Week;//星期buf[5] = Time->date.ucMonth;//月buf[6] = Time->date.ucYear;//年SM_Send (PCF8563_SUBADDR, buf, PCF8563_NUMB);}4 新华龙C8051F022的IIC驱动程序//-----------------------------------------------------------------------------// Includes//-----------------------------------------------------------------------------#include <c8051f020.h> // SFR declarations#include <stdio.h>#include <king.h>#include <DYSJ.h>#include <I2C.H>#define SMB_FREQUENCY 10000L // Target SCL clock rate/****************************************************************************** ** 函数名称:void SPI0_Init()** 功能描述:I2C初始化程序** 说明:1. 置下降沿有效2. 置工作时钟2MHz3.** 输入:无** 输出:无******************************************************************************* /void I2C_Init(){SMB0CN = 0x44;// Enable SMBus with ACKs on acknowledge cycle SMB0CR = -80; //257 - (SYSCLK / (2 * SMB_FREQUENCY));EIE1 |= 2;// SMBus interrupt enable//EA = 1;// Global interrupt enableI2cSM_BUSY = 0;// Free SMBus for first transfer.}/****************************************************************************** ** 函数名称:void SM_Send (Uint8 byte_address,Uint8 *SendBuf,Uint8 count)** 功能描述:I2C写入程序** 说明:1. 等待空闲2. 写入数据3. 等待结束** 输入:地址byte_address、写入数据缓冲区*SendBuf、数量count** 输出:无******************************************************************************* /void SM_Send (Uint8 byte_address,Uint8 *SendBuf,Uint8 count){ET0 = 0;//禁止中断ET2 = 0;//禁止中断while (I2cSM_BUSY);// 等待空闲I2cSM_BUSY = 1;// 置忙SMB0CN = 0x44;// SMBus enabled, ACK on acknowledge cycleI2cSendCount = count;// 置写入数量I2cRecCount = 0;// 读出数量清零I2cSendDPTR = SendBuf;// SMBus enabled, ACK on acknowledge cycleI2CWRITE;// Chip select + WRITEI2cMemAdd = byte_address;STO = 0;STA = 1;// 启动传输FeedWatchdog();while (I2cSM_BUSY);// 等待空闲ET0 = 1;//允许中断ET2 = 1;//允许中断}/****************************************************************************** ** 函数名称:void SM_Receive (Uint8 byte_address,Uint8 *ReadBuf,Uint8 count)** 功能描述:I2C读取程序** 说明:1. 等待空闲2. 置地址3. 读取数据3. 等待结束** 输入:地址byte_address、读取数据缓冲区*SendBuf、数量count** 输出:无******************************************************************************* /void SM_Receive (Uint8 byte_address,Uint8 *ReadBuf,Uint8 count){ET0 = 0;//禁止中断ET2 = 0;//禁止中断while (I2cSM_BUSY);// 等待空闲I2cSM_BUSY = 1;// 置忙SMB0CN = 0x44;// SMBus enabled, ACK on acknowledge cycleI2cSendCount = 0;// 置写入数量I2CWRITE;// Chip select + WRITEI2cMemAdd = byte_address;//值地址偏移I2cRecCount = count;//要接收的数据个数I2cRecDPTR = ReadBuf;//指向要接收的数据区STO = 0;STA = 1;// Start transferFeedWatchdog();while (I2cSM_BUSY);// 等待空闲ET0 = 1;//允许中断ET2 = 1;//允许中断}/****************************************************************************** ** 函数名称:void SMBUS_ISR (void) interrupt 7** 功能描述:I2C中断服务程序** 说明:1. 选择器件地址2. 置读写地址3. 读取或写入数据3. 置结束标志** 输入:无** 输出:无*******************************************************************************/void SMBUS_ISR (void) interrupt 7{switch (SMB0STA) // Status code for the SMBus (SMB0STA register){// 主发送器/接收器:起始条件已发送// 在该状态发送的COMMAND 字的R/W 位总是为0(W),// 因为对于读和写操作来说都必须先写存储器地址。
基于8051实时时钟芯片PCF8563驱动程序设计方案
基于8051实时时钟芯片PCF8563驱动程序的实现基于8051实时时钟芯片PCF8563驱动程序设计方案第1章绪论1.1 研究背景前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。
更不用说自动控制领域的机器人、智能仪表、医疗器械了。
因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴:在智能仪器仪表上的应用单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。
采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。
例如精密的测量设备(功率计,示波器,各种分析仪)。
在工业控制中的应用用单片机可以构成形式多样的控制系统、数据采集系统。
例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。
在家用电器中的应用可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭褒、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在。
在计算机网络和通信领域中的应用现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。
pcf8563 例子
PCF8563简单使用示例介绍
以下是一个使用PCF8563的简单示例。
首先,需要了解PCF8563的管脚描述。
PCF8563有16个8位寄存器,包括一个可自动增量的地址寄存器,一个内置32.768KHz的振荡器(带有一个内部集成的电容),一个分频器(用于给实时时钟RTC提供源时钟),一个可编程时钟输出,一个定时器,一个报警器,一个掉电检测器和一个400KHz I2C 总线接口。
然后,还需要了解IIC协议子函数包的使用方法。
例如,可以定义IIC协议的SDA和SCL端口,并定义启动信号和停止信号的方法。
最后,可以使用这些管脚和IIC协议子函数包来与PCF8563进行交互。
例如,可以通过IIC协议向PCF8563写入数据,或者从PCF8563读取数据。
具体实现方法需要根据PCF8563的数据手册和IIC协议进行编程。
需要注意的是,以上示例仅为使用PCF8563的一个简单介绍,具体实现方法还需要根据实际需求和硬件平台进行调整和优化。
I2C总线LCD驱动器PCF8566的原理与应用
I2C总线LCD驱动器PCF8566的原理与应用I2C总线LCD驱动器PCF8566是一种通过I2C总线与微处理器或微控制器通信的设备,用于驱动晶体液晶显示屏(LCD)。
PCF8566采用了一种片内驱动器和控制电路,使其可以直接驱动并控制LCD的显示。
PCF8566的原理:PCF8566是一个具有I2C接口的LCD驱动器。
I2C总线是一种串行通信协议,常用于连接微处理器和外围设备。
PCF8566通过I2C总线接收传输的数据和命令,然后将其转换为电压信号,驱动LCD的显示。
PCF8566具有内部RAM,用于存储显示数据和用户定义的字符。
PCF8566的应用:1.工业控制:PCF8566可以用于驱动工业控制系统中的LCD显示器。
它可以显示传感器读数、报警信息、温度、湿度等参数,帮助操作员实时监控和控制工艺。
2.智能家居:PCF8566可以集成在智能家居控制器中,用于显示温度、湿度、倒计时、闹钟等信息。
用户可以通过触摸按钮或遥控器设置和控制各种功能。
3.电子仪器:PCF8566可以用于驱动电子仪器中的LCD显示屏,如示波器、频谱仪等。
它可以实时显示电压、频率、波形等参数,方便用户进行数据分析和判断。
4.汽车电子:PCF8566可以用于驱动汽车仪表盘中的LCD显示屏。
它可以显示车速、转速、油量、水温等参数,帮助驾驶员了解车辆的运行状况。
5.医疗设备:PCF8566可以用于驱动医疗设备中的LCD显示器,如血压计、心电图仪等。
它可以显示病人的生理参数,帮助医生诊断和监控病情。
总结:I2C总线LCD驱动器PCF8566具有广泛的应用领域,可以用于各种需要显示信息的场景。
它通过I2C总线与微处理器或微控制器通信,将传输的数据和命令转换为电压信号,驱动LCD显示。
PCF8566的应用包括工业控制、智能家居、电子仪器、汽车电子和医疗设备等领域。
通过使用PCF8566,用户可以方便地显示各种参数和信息,实现设备的智能化和人机交互。
STM32对时钟芯片PCF8563的编程
这是用STM32对PCF8563编程的程序、模拟IIC,经验证可用~移植用到的文件:IIC.h IIC.c PCF8563.h PCF8563.c ,我把它们全都复制到了这个Word文档里。
使用要初始化的函数:void PCF8563_Init(void). 就唯一这个。
全局变量: u8 PCF8563_Time[7]; 程序初始的值是给PCF8563设置的时间,程序中读取返回的值是PCF8563当时的时间。
我这里使用的IIC的SCL,SDA的引脚分别为PA.0 PA.1,具体看IIC.h和IIC.C。
只要修改好两个引脚的初始化配套你手上的板子这,就能成功移植~Delay_nus(20):这是一个延迟20us的函数。
IIC.h:#ifndef _IIC_H_#define _IIC_H_#include "stm32f10x.h"/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//*#define I2C_Speed 100000#define I2C1_SLAVE_ADDRESS7 0xA0#define I2C_PageSize 256 *///SCL PA0//SDA PA1#define SCL_H() GPIO_SetBits(GPIOA, GPIO_Pin_0)#define SCL_L() GPIO_ResetBits(GPIOA, GPIO_Pin_0)#define SDA_H() GPIO_SetBits(GPIOA, GPIO_Pin_1)#define SDA_L() GPIO_ResetBits(GPIOA, GPIO_Pin_1)//返回0,和1#define Read_SDA() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)u8 IIC_ReadByte(void);void IIC_WriteByte(u8 byte);void IIC_WaitAck(void);void IIC_Stop(void);void IIC_Start(void);void IIC_Init(void);void I2C_Ack(void);void I2C_NoAck(void);//取回八个字节的数据:秒,分,时,天,星期,月份,年份。
pcf8563驱动程序
#include "pcf8563.h"#include <intrins.h>UCHAR Ack;/*************************************************************************** *FUNCTION NAME: GetDate*CREATE DATE: 2012/6/9*CREATED BY: xs*FUNCTION: 获得时间*INPUT: ?*OUTPUT: 无*RETURN: 无***************************************************************************/ void GetDate(void){UCHAR d[7];UCHAR i;for(i=0;i<7;i++){ReadPCF8563(ADDR_SECOND+i,&d[i],1);}g_Date.second = ((d[0] & 0x7F)>>4)*10 + (d[0] & 0x0F);g_Date.minute = ((d[1] & 0x7F)>>4)*10 + (d[1] & 0x0F);g_Date.hour = ((d[2] & 0x3F)>>4)*10 + (d[2] & 0x0F);g_Date.day = ((d[3] & 0x3F)>>4)*10 + (d[3] & 0x0F);g_Date.week = d[4] & 0x07;g_Date.month = ((d[5] & 0x1F)>>4)*10 + (d[5] & 0x0F);g_Date.year = 2000 + (d[6] >>4)*10 + (d[6] & 0x0F); //2012年#if 0SendStr("second:");print(g_Date.second);SendStr("minute:");print(g_Date.minute);SendStr("hour:");print(g_Date.hour);SendStr("day:");print(g_Date.day);SendStr("week:");print(g_Date.week);SendStr("month:");print(g_Date.month);SendStr("year:");print(g_Date.year);#endif}/*************************************************************************** *FUNCTION NAME: WriteDate*CREATE DATE: 2012/6/9*CREATED BY: xs*FUNCTION: 修改时钟芯片时间*INPUT: ?*OUTPUT: 无*RETURN: 无***************************************************************************/ void WriteDate(void){UCHAR d[7];UCHAR i;UCHAR *p;i = 0;WritePCF8563(0x00,&i,1); //启动时钟p = &g_Date.second;for(i=0;i<6;i++){d[i] = ConvertBCD(*p++);WritePCF8563(ADDR_SECOND+i,&d[i],1);}d[6] = ConvertBCD((UCHAR)(g_Date.year - 2000));WritePCF8563(ADDR_YEAR,&d[6],1);}/****************************************************************************FUNCTION NAME: ConvertBCD*CREATE DATE: 2012/6/9*CREATED BY: xs*FUNCTION: 将数据转换为BCD码*INPUT: ?*OUTPUT: 无*RETURN: 无***************************************************************************/ UCHAR ConvertBCD(UCHAR dat){UCHAR temp;UCHAR s[2];if(dat<10) t emp = dat;else{sprintf(s,dat);temp = (s[0]<<4) + s[1];}return temp;}/****************************************************************************FUNCTION NAME: ReadPCF8563*CREATE DATE: 2012/6/9*CREATED BY: xs*FUNCTION: 读取时钟芯片PCF8563的时间: 0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年*INPUT: 子地址,缓存,字节数*OUTPUT: 无*RETURN: 无***************************************************************************/ void ReadPCF8563(UCHAR saddr,UCHAR *buf,UCHAR count){while(1){if(IRcvStr(PCF8563_ADDR,saddr,buf,count)!=0) break;}}/*************************************************************************** *FUNCTION NAME: WritePCF8563*CREATE DATE: 2012/6/9*CREATED BY: xs*FUNCTION: 设置时钟芯片PCF8563的时间: 0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年*INPUT: 子地址,缓存,字节数*OUTPUT: 无*RETURN: 无***************************************************************************/ void WritePCF8563(UCHAR saddr,UCHAR *buf,UCHAR count){while(1){if(ISendStr(PCF8563_ADDR,saddr,buf,count)!=0) break;}}/*************************************************************************** *FUNCTION NAME: StartI2c*CREATE DATE: 2012.3.8*CREATED BY: xs*FUNCTION: 启动I2C总线*MODIFY DATE: 2012.3.8*INPUT: 无**OUTPUT: 无* *RETURN: 无* ***************************************************************************/ void StartI2c(void){SDA = 1;_NOP_();_NOP_();_NOP_();SCL = 1;;_NOP_();_NOP_();_NOP_();SDA = 0;_NOP_();_NOP_();_NOP_();SCL = 0;_NOP_();_NOP_();}/*************************************************************************** *FUNCTION NAME: StopI2c*CREATE DATE:2012.3.8*CREATED BY: xs*FUNCTION: 结束I2C总线* *MODIFY DATE:2012.3.8*INPUT: 无**OUTPUT: 无* *RETURN: 无* ***************************************************************************/ void StopI2c(void){SDA = 0;_NOP_();_NOP_();_NOP_();SCL = 1;_NOP_();_NOP_();_NOP_();SDA = 1;_NOP_();_NOP_();_NOP_();SDA = 0;SCL = 0;}/*************************************************************************** *FUNCTION NAME: SendI2cByte*CREATE DATE:2012.3.8*CREATED BY: xs*FUNCTION: 数据发送* *MODIFY DATE: 2012.3.8*INPUT: 待发送数据**OUTPUT: 无* *RETURN: 无* ***************************************************************************/ void SendI2cByte(UCHAR dat){UCHAR i;for(i=0;i<8;i++){if((dat<<i)&0x80)SDA = 1;elseSDA = 0;_NOP_();_NOP_();_NOP_();SCL = 1;_NOP_();_NOP_();_NOP_();SCL = 0;}_NOP_();_NOP_();_NOP_();SDA = 1;_NOP_();_NOP_();_NOP_();SCL = 1;_NOP_();_NOP_();_NOP_();if(SDA!=0)Ack = 0;elseAck = 1;SCL = 0;_NOP_();_NOP_();}/*************************************************************************** *FUNCTION NAME: RevI2cByte * *CREATE DATE: 2012.3.8*CREATED BY: S.L*FUNCTION: 数据接收* *MODIFY DATE: 2012.3.8*INPUT: 无**OUTPUT: 无* *RETURN: 接收的一个字节数据****************************************************************************/ UCHAR RevI2cByte(void){UCHAR dat = 0,i;for(i=0;i<8;i++){SCL = 0;_NOP_();_NOP_();_NOP_();SCL = 1;_NOP_();_NOP_();_NOP_();dat = dat << 1;if(SDA!=0)dat += 1;_NOP_();_NOP_();}SCL = 0;_NOP_();_NOP_();return dat;}/*************************************************************************** *FUNCTION NAME: AckI2c*CREATE DATE: 2012.3.8*CREATED BY: xs*FUNCTION: 主控器应答信号* *MODIFY DATE: 2012.3.8*INPUT: 应答位* *OUTPUT: 无* *RETURN: 无* ***************************************************************************/ void AckI2c(UCHAR isAck){if(isAck==0)SDA = 0;elseSDA = 1;_NOP_();_NOP_();_NOP_();SCL = 1;_NOP_();_NOP_();_NOP_();SCL = 0;_NOP_();_NOP_();}/*************************************************************************** *FUNCTION NAME: ISendStr*CREATE DATE: 2012.3.8*CREATED BY: xs*FUNCTION: 向有子地址器件发送多字节数据*MODIFY DATE: 2012.3.8*INPUT: 器件地址,子地址,数据指针及个数*OUTPUT: 无*RETURN: 成功或失败***************************************************************************/ UCHAR ISendStr(UCHAR addr,UCHAR saddr,UCHAR *s,UCHAR num){UCHAR i;StartI2c();SendI2cByte(addr); //器件地址if(!Ack)return(0);SendI2cByte(saddr); //子地址if(!Ack)return(0);for(i=0;i<num;i++){SendI2cByte(s[i]);if(!Ack)return(0);}StopI2c();return(1);}/*************************************************************************** *FUNCTION NAME: IRcvStr*CREATE DATE: 2012/6/9*CREATED BY:xs*FUNCTION: 向有子地址器件读取多字节数据*MODIFY DATE: 2012/6/9*INPUT: 器件地址,子地址,存入缓存,字节数*OUTPUT: 成功返回1*RETURN: 无***************************************************************************/ UCHAR IRcvStr(UCHAR addr,UCHAR saddr,UCHAR *s,UCHAR num){UCHAR i=0;StartI2c();SendI2cByte(addr);if(!Ack)return(0);SendI2cByte(saddr);if(!Ack)return(0);StartI2c();SendI2cByte(addr+1);if(!Ack)return(0);for(i=0;i<num-1;i++){s[i] = RevI2cByte();AckI2c(0);}s[i] = RevI2cByte();AckI2c(1);StopI2c();return(1);}。
PCF8563 实时时钟 日历芯片选型指南
管脚号 1 2 3 4 5 6 7 8
描述 振荡器输入 振荡器输出 中断输出 开漏 低电平有效 地 串行数据 I/O 串行时钟输入 时钟输出 (开漏) 正电源
-3-
5 订单信息
型号
PCF8563P PCF8563T PCF8563TS
名称 DIP8 SO8 TSSOP8
包
装
描述
塑料双列直插式封装;8 脚(300mil)
小塑料封装 8 脚 宽 3.9mm
ห้องสมุดไป่ตู้
小塑料薄型封装 8 脚 宽 3.0mm
版本 SOT97-1 SOT96-1 SOT505-1
6 方框图
7 管脚配置
图 1 方框图 图 2 管脚配置
图 3 二极管保护图 -2-
广州周立功单片机发展有限公司 Tel (020)38730976 38730977 Fax 38730925
管脚描述 符号 OSCI OSCO /INT VSS SDA SCL CLKOUT VDD
广州周立功单片机发展有限公司 Tel (020)38730976 38730977 Fax 38730925
PCF8563 实时时钟 日历芯片选型指南
1. 概述
PCF8563 是低功耗的 CMOS 实时时钟 日历芯片 它提供一个可编程时钟输出 一个中断输出和掉 电检测器 所有的地址和数据通过 I2C 总线接口串行传递 最大总线速度为 400Kbits/s 每次读写数据后 内嵌的字地址寄存器会自动产生增量
I
=0Hz
器和 CLKOUT 失
效
Tamb =25
VDD=
VDD=
Tamb 工作温度范围
Tstg
储存温度
stm32f103 usb驱动电脑无法识别的解决办法
就会识别不出usb设备,所以两个功能都要用到的话,还是换成f105或
f107,这两种型号是可以同时使用的。
串行单线调试(SWD)和JTAG接口-
多达8个定时器--3个16位定时器,每个定时器有多达4个用于输入
捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入
1个16位带死区控制和紧急刹车,用于电机控制的PWM高级控制
定时器
2个看门狗定时器(独立的和窗口型的)
系统时间定时器:24位自减型计数器
多达9个通信接口
2个I2C接口(支持SMBus/PMBus)
3个USART接口(支持ISO7816接口,LIN,IrDA接口和调制解调
控制)
2个SPI接口(18M位/秒)
CAN接口(2.0B主动)
USB 2.0全速接口
stm32f103 usb驱动电脑无法识别解决办法:
1、usb所使用的IO口在设置为usb后自动分配功能,不需要再设
STM32F103电源管理:
2.0-3.6V供电和I/O引脚
上电/断电复位(POR/PDR)、可编程电压监测器(PVD)
-4-16MHZ晶振振荡器-
内嵌经出Байду номын сангаас调教的8MHz的RC振荡器-
内嵌带校准的40KHz的RC振荡器-
产生CPU时钟的PLL-
带校准的32KHz的RC振荡器
STM32F103调试模式:
置,一定要设置的话会被忽略,所以也没什幺影响。
2、usb时钟配置只有两种可用:主频72M,usb时钟1.5分频;主频
48M,usb时钟1分频。
3、PA12(USBP/D+)一定要接1.5k的上拉电阻,用于电脑识别设
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*********************************************************************************************************/
* 函数名称: PCF8563_I2C_Start(void)
* 功能描述: PCF8563_I2C启动信号
*********************************************************************************************************/
* 函数名称: PCF8563_I2C_Stop(void)
* 功能描述: PCF8563_I2C停止信号
*********************************************************************************************************/
/*********************************************************************************************
* File:PCF8563.c
* Author:
* Desc:
* History:
*********************************************************************************************/
void Delay_us(int Time)
{
while(Time--);
}
/********************************************************************************************************
PCF8563_Write_SCL(0);
data<<=1;
}
PCF8563_Write_SDA(1); //写完一个字节后释放总线
Delay_us(PCF8563_I2C_DELAY); //I2C延时
PCF8563_Write_SCL(1); //加上脉冲, 相当于应答信号
Delay_us(PCF8563_I2C_DELAY); //I2C延时
PCF8563_Write_SCL(0); //钳住总线
Delay_us(PCF8563_I2C_DELAY); //I2C延时
}
/********************************************************************************************************
PCF8563_Write_SDA(1);
else
PCF8563_Write_SDA(0);
Delay_us(PCF8563_I2C_DELAY); //I2C延时
PCF8563_Write_SCL(1);
Delay_us(PCF8563_I2C_DELAY); //I2C延时
static void PCF8563_I2C_Stop(void)
{
PCF8563_Write_SDA(0);
PCF8563_Write_SCL(1);
Delay_us(PCF8563_I2C_DELAY); //I2C延时
PCF8563_Write_SDA(1);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //最高输出频率50MHZ
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/*--------------------PCF8563_SDA输出--------------------*/
void PCF8563_Write_SDA(uchar bit)
{
if (bit) GPIO_SetBits(GPIOB,PCF8563_SDA);
else GPIO_ResetBits(GPIOB,PCF8563_SDA);
Delay_us(PCF8563_I2C_DELAY); //I2C延时
PCF8563_Write_SCL(0); //钳住总线
Delay_us(PCF8563_I2C_DELAY); //I2C延时
}
/********************************************************************************************************
PCF8563_Write_SCL(1);
data<<=1;
data_bit =PCF8563_Read_SDA();
data |= data_bit;
PCF8563_Write_SCL(0);
Delay_us(PCF8563_I2C_DELAY); //I2C延时
static void PCF8563_I2C_Start(void)
{
PCF8563_Write_SCL(1);
PCF8563_Write_SDA(1);
Delay_us(PCF8563_I2C_DELAY); //I2C延时
PCF8563_Write_SDA(0);
#include "stm32f10x_conf.h"
#define PCF8563_SCLK GPIO_Pin_6 /*PB.6*/
#define PCF8563_SDA GPIO_Pin_7 /*PB.7*/
}
/*--------------------PCF8563_SDA输入--------------------*/
uchar PCF8563_Read_SDA(void)
{
if(TWI_SDA_STATE){return(1);}
else{return(0);}
}
/********************************************************************************************************
}
PCF8563_Write_SDA(1); //SDA=1写完一个字节后释放总线
PCF8563_Write_SCL(0); //加上脉冲, 相当于应答信号
return(data);
}
/********************************************************************************************************
}
/*--------------------PCF8563_SCL输出--------------------*/
void PCF8563_Write_SCL(uchar bit)
{
if (bit) GPIO_SetBits(GPIOB,PCF8563_SCLK);
else GPIO_ResetBits(GPIOB,PCF8563_SCLK);
static void PCF8563_Wrbyte(uchar data)
{
uchar i;
PCF8563_Write_SCL(0); //SCL=0;
for(i=0;i<8;i++) //共8位
{
if(data&0x80)
Delay_us(PCF8563_I2C_DELAY); //I2C延时
PCF8563_Write_SCL(0);
}
/********************************************************************************************************
* 函数名称: void Delay_us(int Time)
* 功能描述: 微秒延时
*********************************************************************************************************
static uchar PCF8563_Rebyte(void)
{
uchar i;
uchar data=0;
uint32 data_bit;
PCF8563_Write_SDA(1);
for(i=0;i<8;i++)
{
void PCF8563_Pin_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = PCF8563_SCLK|PCF8563_SDA;
#define TWI_SDA_STATE (GPIOB->IDR&GPIO_Pin_7)
#define PCF8563_I2C_DELAY 10 //43约100K