RTC.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*
  2. * RTC.c
  3. *
  4. * Created on: 15 janv. 2019
  5. * Author: e_rcluze
  6. */
  7. #include "RTC.h"
  8. /** Private Fonction*/
  9. void readRTC(uint8_t reg, uint8_t *tab, int len) {
  10. HAL_StatusTypeDef res = HAL_I2C_Master_Transmit(I2C_RTC, RTC_ADD, &reg, 1, 10000);
  11. res = HAL_I2C_Master_Receive(I2C_RTC, RTC_ADD, tab, len, 1000);
  12. }
  13. void writeRTC(uint8_t reg, uint8_t *tab, int len) {
  14. uint8_t t[len + 1];
  15. t[0] = reg;
  16. for (int i = 0; i < len; i++)
  17. t[i + 1] = tab[i];
  18. HAL_I2C_Master_Transmit(I2C_RTC, RTC_ADD, t, len + 1, 1000);
  19. }
  20. /** Public Fonction*/
  21. void initRTC(I2C_HandleTypeDef *typ) {
  22. I2C_RTC = typ;
  23. }
  24. void readHeure(Heure *heure) {
  25. uint8_t tab[2];
  26. readRTC(MINUTES, tab, 2);
  27. heure->minute = (((tab[0] & 0x70) >> 4) * 10) + (tab[0] & 0X0F);
  28. heure->heure = (((tab[1] & 0X30) >> 4) * 10) + (tab[1] & 0X0F);
  29. }
  30. /** Public Fonction*/
  31. void readDate(Date *date) {
  32. uint8_t tab[7];
  33. readRTC(SECOND, tab, 7);
  34. date->second = (((tab[0] & 0X70) >> 4) * 10) + (tab[0] & 0X0F);
  35. date->minute = (((tab[1] & 0x70) >> 4) * 10) + (tab[1] & 0X0F);
  36. date->heure = (((tab[2] & 0X30) >> 4) * 10) + (tab[2] & 0X0F);
  37. date->jour = (((tab[4] & 0X30) >> 4) * 10) + (tab[4] & 0X0F);
  38. date->mois = (((tab[5] & 0X10) >> 4) * 10) + (tab[5] & 0X0F);
  39. date->annee = ((tab[6] >> 4) * 10) + (tab[6] & 0X0F);
  40. }
  41. void writeDate(Date *date) {
  42. uint8_t tab[7];
  43. tab[0] = ((date->second / 10) << 4) + (date->second % 10);
  44. tab[1] = ((date->minute / 10) << 4) + (date->minute % 10);
  45. tab[2] = ((date->heure / 10) << 4) + (date->heure % 10);
  46. tab[3] = date->joursemaine;
  47. tab[4] = ((date->jour / 10) << 4) + (date->jour % 10);
  48. tab[5] = ((date->mois / 10) << 4) + (date->mois % 10);
  49. tab[6] = ((date->annee / 10) << 4) + (date->annee % 10);
  50. writeRTC(SECOND, tab, 7);
  51. }
  52. void redemareRTC() {
  53. uint8_t pt[1];
  54. readRTC(ALARM_HOURS, pt, 1);
  55. pt[0] = pt[0] & !0x40;
  56. writeRTC(ALARM_HOURS, pt, 1);
  57. }
  58. void testRTC() {
  59. Date d;
  60. d.annee = 2020;
  61. d.mois = 1;
  62. d.jour = 20;
  63. d.joursemaine = 1;
  64. d.heure = 14;
  65. d.minute = 0;
  66. d.second = 0;
  67. writeDate(&d);
  68. redemareRTC();
  69. HAL_Delay(2000);
  70. readDate(&d);
  71. HAL_Delay(1);
  72. }
  73. uint16_t HeureEnMinute() {
  74. Heure h;
  75. readHeure(&h);
  76. return h.minute+h.heure*60;
  77. }
  78. void testBatteryRTC() {
  79. redemareRTC();
  80. Date d;
  81. readDate(&d);
  82. HAL_Delay(1);
  83. }