hal_pca8565.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. #include "hal_pca8565.h"
  2. #include "hc32_ll_gpio.h"
  3. #include "FreeRTOS.h"
  4. #include "task.h"
  5. #define IIC_ERR 0
  6. #define IIC_OK 1
  7. #define READ_SDA2 GPIO_ReadInputPins(GPIO_PORT_B,GPIO_PIN_12)
  8. #define IIC_SDA2(n) (n?GPIO_SetPins(GPIO_PORT_B, GPIO_PIN_12):GPIO_ResetPins(GPIO_PORT_B, GPIO_PIN_12))
  9. #define IIC_SCL2(n) (n?GPIO_SetPins(GPIO_PORT_B, GPIO_PIN_13):GPIO_ResetPins(GPIO_PORT_B, GPIO_PIN_13))
  10. #define pca8565_speed 5
  11. //需要示波器调1us的时间
  12. static void delay_us(uint16_t time)
  13. {
  14. uint16_t i;
  15. for(i=time;i>0;i--)
  16. {
  17. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  18. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  19. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  20. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  21. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  22. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  23. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  24. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  25. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  26. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  27. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  28. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  29. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  30. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  31. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  32. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  33. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  34. __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  35. }
  36. }
  37. void iicx_init(void)
  38. {
  39. stc_gpio_init_t pstcGpioInit1;
  40. GPIO_StructInit(&pstcGpioInit1);
  41. pstcGpioInit1.u16PinDir = PIN_DIR_OUT;
  42. pstcGpioInit1.u16PinState = PIN_STAT_RST;
  43. GPIO_Init(GPIO_PORT_B, GPIO_PIN_12,&pstcGpioInit1);
  44. GPIO_Init(GPIO_PORT_B, GPIO_PIN_13,&pstcGpioInit1);
  45. GPIO_SetPins(GPIO_PORT_B, GPIO_PIN_12);
  46. GPIO_SetPins(GPIO_PORT_B, GPIO_PIN_13);
  47. }
  48. static void SDA_IN2(void)
  49. {
  50. stc_gpio_init_t pstcGpioInit3;//iic的引脚
  51. pstcGpioInit3.u16PinDir = PIN_DIR_IN;
  52. GPIO_Init(GPIO_PORT_B, GPIO_PIN_12,&pstcGpioInit3);
  53. }
  54. static void SDA_OUT2(void)
  55. {
  56. stc_gpio_init_t pstcGpioInit3;
  57. pstcGpioInit3.u16PinDir = PIN_DIR_OUT;
  58. pstcGpioInit3.u16PinOutputType=PIN_OUT_TYPE_NMOS;
  59. GPIO_Init(GPIO_PORT_B, GPIO_PIN_12,&pstcGpioInit3);
  60. }
  61. static void iic_start(void)
  62. {
  63. SDA_OUT2();
  64. IIC_SDA2(1);
  65. IIC_SCL2(1);
  66. delay_us(pca8565_speed);
  67. IIC_SDA2(0);
  68. delay_us(pca8565_speed);
  69. IIC_SCL2(0);
  70. }
  71. static void iic_stop(void)
  72. {
  73. SDA_OUT2();
  74. IIC_SCL2(0);
  75. IIC_SDA2(0);
  76. delay_us(pca8565_speed);
  77. IIC_SCL2(1);
  78. IIC_SDA2(1);
  79. delay_us(pca8565_speed);
  80. }
  81. static void iic_ack(void)
  82. {
  83. SDA_OUT2();
  84. IIC_SCL2(0);
  85. IIC_SDA2(0);
  86. delay_us(pca8565_speed);
  87. IIC_SCL2(1);
  88. delay_us(pca8565_speed);
  89. IIC_SCL2(0);
  90. }
  91. static void iic_nack(void)
  92. {
  93. SDA_OUT2();
  94. IIC_SCL2(0);
  95. IIC_SDA2(1);
  96. delay_us(pca8565_speed);
  97. IIC_SCL2(1);
  98. delay_us(pca8565_speed);
  99. IIC_SCL2(0);
  100. }
  101. static uint8_t iic_wait_ack(void)
  102. {
  103. uint16_t t =200;
  104. SDA_OUT2();
  105. IIC_SDA2(1);delay_us(1);
  106. IIC_SCL2(1);delay_us(1);
  107. SDA_IN2();
  108. while(READ_SDA2)
  109. {
  110. t--;
  111. if(t==0)
  112. {
  113. iic_stop();
  114. return 1;
  115. }
  116. delay_us(1);
  117. }
  118. IIC_SCL2(0);
  119. return 0;
  120. }
  121. static void iic_send_byte(uint8_t byte)
  122. {
  123. uint8_t bit_cnt;
  124. SDA_OUT2();
  125. IIC_SCL2(0);
  126. for(bit_cnt=0;bit_cnt<8;bit_cnt++)
  127. {
  128. if(byte&0x80)
  129. IIC_SDA2(1);
  130. else
  131. IIC_SDA2(0);
  132. byte<<=1;
  133. delay_us(pca8565_speed);
  134. IIC_SCL2(1);
  135. delay_us(pca8565_speed);
  136. IIC_SCL2(0);
  137. }
  138. }
  139. static uint8_t iic_recive_byte(unsigned char ack)
  140. {
  141. uint8_t retc = 0;
  142. uint8_t bit_cnt;
  143. SDA_IN2();
  144. for(bit_cnt=0;bit_cnt<8;bit_cnt++)
  145. {
  146. IIC_SCL2(0);
  147. delay_us(pca8565_speed);
  148. IIC_SCL2(1);
  149. retc=retc<<1;
  150. if(READ_SDA2)
  151. retc++;
  152. delay_us(pca8565_speed);
  153. }
  154. return(retc);
  155. }
  156. /*
  157. ************************************************************
  158. * 函数名称: Pcf8563_IIC_WriteByte
  159. *
  160. * 函数功能: 软件IIC读取一个字节
  161. *
  162. * 入口参数: slaveAddr:从机地址
  163. * regAddr:寄存器地址
  164. * val:需要读取的数据缓存
  165. *
  166. * 返回参数: 1-成功 0-失败
  167. *
  168. * 说明:
  169. ************************************************************
  170. */
  171. void Pcf8563_IIC_ReadByte ( unsigned char SlaveAddr, unsigned char RegAddr, unsigned char *Val )
  172. {
  173. // //起始信号
  174. // iic_start();
  175. // //发送设备地址(写)
  176. // if(!iic_send_byte ( SlaveAddr )) //等待应答
  177. // return IIC_ERR;
  178. // //发送寄存器地址
  179. // if(!iic_send_byte ( RegAddr )) //等待应答
  180. // return IIC_ERR;
  181. // iic_start(); //重启信号
  182. // //发送设备地址(读)
  183. // if(!iic_send_byte ( SlaveAddr + 1 )) //等待应答
  184. // return IIC_ERR;
  185. // *Val = iic_recive_byte (0); //产生一个非应答信号,代表读取接收
  186. // iic_stop(); //停止信号
  187. // return IIC_OK;
  188. iic_start();
  189. iic_send_byte(SlaveAddr);
  190. iic_wait_ack();
  191. iic_send_byte(RegAddr);
  192. iic_wait_ack();
  193. iic_start();
  194. iic_send_byte(SlaveAddr|0x01);
  195. iic_wait_ack();
  196. *Val = iic_recive_byte(0);
  197. iic_stop();
  198. }
  199. /*
  200. ************************************************************
  201. * 函数名称: Pcf8563_IIC_WriteByte
  202. *
  203. * 函数功能: 软件IIC写一个字节
  204. *
  205. * 入口参数: slaveAddr:从机地址
  206. * regAddr:寄存器地址
  207. * val:需要读取的数据缓存
  208. *
  209. * 返回参数: 1-成功 0-失败
  210. *
  211. * 说明:
  212. ************************************************************
  213. */
  214. void Pcf8563_IIC_WriteByte ( unsigned char SlaveAddr, unsigned char RegAddr, unsigned char *Val )
  215. {
  216. // iic_start(); //起始信号
  217. // //发送设备地址(写)
  218. // if (!iic_send_byte ( SlaveAddr )) //等待应答
  219. // return IIC_ERR;
  220. // //发送寄存器地址
  221. // if (!iic_send_byte ( RegAddr ) ) //等待应答
  222. // return IIC_ERR;
  223. // if (!iic_send_byte ( *Val ) )
  224. // return IIC_ERR;
  225. //
  226. // iic_stop(); //停止信号
  227. // return IIC_OK;
  228. iic_start();
  229. iic_send_byte(SlaveAddr);
  230. iic_wait_ack();
  231. iic_send_byte(RegAddr);
  232. iic_wait_ack();
  233. iic_send_byte(*Val);
  234. iic_wait_ack();
  235. iic_stop();
  236. }
  237. /*
  238. ************************************************************
  239. * 函数名称: Pcf8563_IIC_WriteBytes
  240. *
  241. * 函数功能: 软件IIC写多个数据
  242. *
  243. * 入口参数: slaveAddr:从机地址
  244. * regAddr:寄存器地址
  245. * buf:需要写入的数据缓存
  246. * num:数据长度
  247. *
  248. * 返回参数: 1-成功 0-失败
  249. *
  250. * 说明:
  251. ************************************************************
  252. */
  253. _Bool Pcf8563_IIC_WriteBytes ( unsigned char SlaveAddr, unsigned char RegAddr, unsigned char *Buf, unsigned char Num )
  254. {
  255. iic_start(); //起始信号
  256. //发送设备地址(写)
  257. iic_send_byte ( SlaveAddr ); //等待应答
  258. iic_wait_ack();
  259. //发送寄存器地址
  260. iic_send_byte ( RegAddr ) ; //等待应答
  261. iic_wait_ack();
  262. while ( Num-- ) //循环写入数据
  263. {
  264. //发送数据
  265. iic_send_byte ( *Buf ); //等待应答
  266. iic_wait_ack();
  267. Buf++; //数据指针偏移到下一个
  268. delay_us(10);
  269. }
  270. iic_stop(); //停止信号
  271. return IIC_OK;
  272. }
  273. /*
  274. ************************************************************
  275. * 函数名称: Pcf8563_IIC_ReadBytes
  276. *
  277. * 函数功能: 软件IIC读多个数据
  278. *
  279. * 入口参数: slaveAddr:从机地址
  280. * regAddr:寄存器地址
  281. * buf:需要写入的数据缓存
  282. * num:数据长度
  283. *
  284. * 返回参数: 1-成功 0-失败
  285. *
  286. * 说明:
  287. ************************************************************
  288. */
  289. _Bool Pcf8563_IIC_ReadBytes ( unsigned char SlaveAddr, unsigned char RegAddr, unsigned char *Buf, unsigned char Num )
  290. {
  291. iic_start(); //起始信号
  292. //发送设备地址(写)
  293. iic_send_byte ( SlaveAddr ); //等待应答
  294. iic_wait_ack();
  295. //发送寄存器地址
  296. iic_send_byte ( RegAddr ); //等待应答
  297. iic_wait_ack();
  298. iic_start(); //重启信号
  299. //发送设备地址(读)
  300. iic_send_byte ( SlaveAddr + 1 ); //等待应答
  301. iic_wait_ack();
  302. while ( Num-- )
  303. {
  304. //偏移到下一个数据存储地址
  305. if ( Num == 0 )
  306. {
  307. *Buf = iic_recive_byte ( 0 ); //最后一个数据需要回NOACK
  308. }
  309. else
  310. {
  311. *Buf = iic_recive_byte ( 1 ); //回应ACK
  312. }
  313. Buf++;
  314. }
  315. iic_stop();
  316. return IIC_OK;
  317. }
  318. //常量定义
  319. const char week_day[7][10]={"SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY"};
  320. const int8_t months[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
  321. //变量定义
  322. rtc_time_st rtc_time;
  323. /*
  324. ************************************************************
  325. * 函数名称: Pcf8563_Rtc_Init
  326. *
  327. * 函数功能: 外置RTC初始化
  328. *
  329. * 入口参数: 无
  330. *
  331. * 返回参数: 无
  332. *
  333. * 说明: STATUS1:正常模式、POR disabled
  334. * STATUS2:INT is active when TF is active
  335. * read: alarm flag inactive
  336. * write: alarm flag is cleared
  337. * read: timer flag inactive
  338. * write: timer flag is cleared
  339. * alarm interrupt disabled
  340. * timer interrupt disabled
  341. * CLKOUT:CLKOUT output is activated
  342. * frequency output at pin CLKOUT is 1.024 kHz(为何设置为该值)
  343. ************************************************************
  344. */
  345. void rtc_init(void)
  346. {
  347. iicx_init();
  348. }
  349. void Pcf8563_Rtc_Init(void)
  350. {
  351. DDL_DelayMS(20);
  352. Pcf8563_IIC_WriteByte(PCF8563_SLAVE_ADDRESS,PCF8563_ADDR_CONTROL_STATUS1,0x00); //默认
  353. Pcf8563_IIC_WriteByte(PCF8563_SLAVE_ADDRESS,PCF8563_ADDR_CONTROL_STATUS2,0x00); //默认
  354. Pcf8563_IIC_WriteByte(PCF8563_SLAVE_ADDRESS,PCF8563_ADDR_CLKOUT,0x80); //使能CLK输出,1024Hz
  355. }
  356. /*
  357. ************************************************************
  358. * 函数名称: Get_Pcf8563_Rtc_Time
  359. *
  360. * 函数功能: 获取外置RTC时间
  361. *
  362. * 入口参数: rtc_time
  363. *
  364. * 返回参数: 无
  365. *
  366. * 说明: 读时间 年、月、日、时、分、日期 week为指针指向week_day数组
  367. ************************************************************
  368. */
  369. void Get_Pcf8563_Rtc_Time(rtc_time_st *rtc_time)
  370. {
  371. uint8_t time_buf[7]={0};
  372. Pcf8563_IIC_ReadByte(PCF8563_SLAVE_ADDRESS,0x02,&time_buf[0]);//秒
  373. Pcf8563_IIC_ReadByte(PCF8563_SLAVE_ADDRESS,0x03,&time_buf[1]);//分
  374. Pcf8563_IIC_ReadByte(PCF8563_SLAVE_ADDRESS,0x04,&time_buf[2]);//时
  375. Pcf8563_IIC_ReadByte(PCF8563_SLAVE_ADDRESS,0x05,&time_buf[3]);//日
  376. Pcf8563_IIC_ReadByte(PCF8563_SLAVE_ADDRESS,0x06,&time_buf[4]);//星期
  377. Pcf8563_IIC_ReadByte(PCF8563_SLAVE_ADDRESS,0x07,&time_buf[5]);//月
  378. Pcf8563_IIC_ReadByte(PCF8563_SLAVE_ADDRESS,0x08,&time_buf[6]);//年
  379. //将时间从BCD编码变成十进制
  380. rtc_time->sec=BCDToDec(time_buf[0] & 0X7F); //秒
  381. rtc_time->min=BCDToDec(time_buf[1] & 0X7F); //分
  382. rtc_time->hour=BCDToDec(time_buf[2] & 0X3F); //时
  383. rtc_time->date=BCDToDec(time_buf[3] & 0X3F); //日
  384. // rtc_time->week=(time_buf[4] & 0X07); //星期(值0为星期7 1为星期1)
  385. rtc_time->week=week_day[(time_buf[4] & 0X07)]; //星期(字符串指针)
  386. rtc_time->mon=BCDToDec(time_buf[5] & 0X1F); //月
  387. rtc_time->year=2000 + (uint16_t)BCDToDec(time_buf[6]); //年
  388. // for(int i = 0;i < 7; i++)
  389. // printf("%x ",time_buf[i]);
  390. }
  391. /*
  392. ************************************************************
  393. * 函数名称: LogRtcTime
  394. *
  395. * 函数功能: LogRtcTime
  396. *
  397. * 入口参数: rtc_time
  398. *
  399. * 返回参数: 无
  400. *
  401. * 说明: 读时间 年、月、日、时、分、日期 week为指针指向week_day数组
  402. ************************************************************
  403. */
  404. void LogRtcTime(rtc_time_st *rtc_time)
  405. {
  406. printf("data:%4d-%02d-%02d %02d:%02d:%02d week:%s\r\n",rtc_time->year,rtc_time->mon,rtc_time->date,rtc_time->hour,rtc_time->min,rtc_time->sec,rtc_time->week);
  407. }
  408. /*
  409. ************************************************************
  410. * 函数名称: Set_Pcf8563_Rtc_Time
  411. *
  412. * 函数功能: 获取外置RTC时间
  413. *
  414. * 入口参数: year mon date hour min sec
  415. *
  416. * 返回参数: 无
  417. *
  418. * 说明: 设置RTC时间 week为0-7 0为星期7 1为星期1
  419. ************************************************************
  420. */
  421. void Set_Pcf8563_Rtc_Time(uint16_t year,uint8_t mon,uint8_t date,uint8_t hour,uint8_t min,uint8_t sec,uint8_t week)
  422. {
  423. //将时间从十进制变成BCD编码
  424. uint8_t time_buf[7]={0};
  425. time_buf[6] = DecToBCD((uint8_t)(year-2000));
  426. time_buf[5] = DecToBCD(mon);
  427. time_buf[4] = week;
  428. time_buf[3] = DecToBCD(date);
  429. time_buf[2] = DecToBCD(hour);
  430. time_buf[1] = DecToBCD(min);
  431. time_buf[0] = DecToBCD(sec);
  432. // for(int i = 0;i < 7; i++)
  433. // printf("%x ",time_buf[i]);
  434. // printf("\n");
  435. Pcf8563_IIC_WriteBytes(PCF8563_SLAVE_ADDRESS,PCF8563_ADDR_SEC,time_buf,7);
  436. }
  437. /*
  438. ************************************************************
  439. * 函数名称: DecToBCD
  440. *
  441. * 函数功能: DecToBCD
  442. *
  443. * 入口参数: unsigned char
  444. *
  445. * 返回参数: unsigned char
  446. *
  447. * 说明: 十进制转BCD编码
  448. ************************************************************
  449. */
  450. unsigned char DecToBCD(unsigned char _dec)
  451. {
  452. unsigned char temp = 0;
  453. while (_dec >= 10)
  454. {
  455. temp++;
  456. _dec -= 10;
  457. }
  458. return ((unsigned char)(temp << 4) | _dec);
  459. }
  460. /*
  461. ************************************************************
  462. * 函数名称: BCDToDec
  463. *
  464. * 函数功能: BCDToDec
  465. *
  466. * 入口参数: unsigned char
  467. *
  468. * 返回参数: unsigned char
  469. *
  470. * 说明: BCD编码转十进制
  471. ************************************************************
  472. */
  473. unsigned char BCDToDec(unsigned char _BCD)
  474. {
  475. unsigned char temp = 0;
  476. temp = ((unsigned char)(_BCD & (unsigned char)0xF0) >> (unsigned char)0x04) * 10;
  477. return (temp + (_BCD & (unsigned char)0x0F));
  478. }
  479. /*
  480. ************************************************************
  481. * 函数名称: Days_Count
  482. *
  483. * 函数功能: 计算日期之间的天数
  484. *
  485. * 入口参数: rtc_time_st 起始和结束日期
  486. *
  487. * 返回参数: 天数
  488. *
  489. * 说明:
  490. ************************************************************
  491. */
  492. int Days_Count(rtc_time_st *start,rtc_time_st *stop)
  493. {
  494. int day_start=0;
  495. int day_stop=0;
  496. uint8_t i=0;
  497. if(start->year==stop->year) //同一年
  498. {
  499. if(ISLOOP(start->year)) //闰年
  500. {
  501. if(start->mon<=2) //计算开始的天数
  502. {
  503. if(start->mon==1)
  504. day_start=0;
  505. else
  506. {
  507. day_start=day_start+months[0];
  508. }
  509. }
  510. else
  511. {
  512. for(i=1;i<start->mon;i++)
  513. day_start=day_start+months[i-1]+1;
  514. }
  515. if(stop->mon<=2) //计算结束的的天数
  516. {
  517. if(stop->mon==1)
  518. day_stop=0;
  519. else
  520. {
  521. day_stop=day_stop+months[0];
  522. }
  523. }
  524. else
  525. {
  526. for(i=1;i<stop->mon;i++)
  527. day_stop=day_stop+months[i-1]+1;
  528. }
  529. }
  530. else //平年
  531. {
  532. if(start->mon==1) //计算开始的天数
  533. day_start=0;
  534. else
  535. {
  536. for(i=1;i<start->mon;i++)
  537. day_start=day_start+months[i-1];
  538. }
  539. if(stop->mon==1) //计算结束的的天数
  540. day_stop=0;
  541. else
  542. {
  543. for(i=1;i<stop->mon;i++)
  544. day_stop=day_stop+months[i-1];
  545. }
  546. }
  547. return day_stop-day_start;
  548. }
  549. else //不同年(此时一定12月和1月)
  550. {
  551. return 31-start->date+stop->date;
  552. }
  553. }
  554. /*************************************RTC定时唤醒**********************************************/
  555. void P8563_alarm(unsigned char min)
  556. {
  557. min = DecToBCD(min);
  558. Pcf8563_IIC_WriteByte(PCF8563_SLAVE_ADDRESS,0x9,min); /*分钟报警*/
  559. Pcf8563_IIC_WriteByte(PCF8563_SLAVE_ADDRESS,0x01,0x12); /*报警有效*/ //使能报警器和定时器发出中断请求
  560. }
  561. void clear_alarm(void)
  562. {
  563. Pcf8563_IIC_WriteByte(PCF8563_SLAVE_ADDRESS,0x01,0x02);//清中断标志
  564. }
  565. /******************关闭闹钟中断***************************/
  566. void close_alarm(void)
  567. {
  568. Pcf8563_IIC_WriteByte(PCF8563_SLAVE_ADDRESS,0x01,0x00);//禁止中断
  569. }
  570. #include "string.h"
  571. #include "FreeRTOS.h"
  572. #include "FreeRTOSConfig.h"
  573. #include "task.h"
  574. void pca8565_task(void *argv)
  575. {
  576. Pcf8563_Rtc_Init();
  577. Set_Pcf8563_Rtc_Time(2023,5,19,15,11,33,5);//33 22 16 17 3 5 23
  578. while(1)
  579. {
  580. Get_Pcf8563_Rtc_Time(&rtc_time);
  581. LogRtcTime(&rtc_time);
  582. vTaskDelay(1000);
  583. }
  584. }