Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
MinimouseSrc/ApiRtc.h@1:eda561b01daf, 2017-12-18 (annotated)
- Committer:
- fholin
- Date:
- Mon Dec 18 16:31:11 2017 +0000
- Revision:
- 1:eda561b01daf
- Parent:
- 0:2325d1d28df3
inline with github repository : ; https://github.com/LoRaWanMiniMouse/Mini-Mouse.git
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fholin | 0:2325d1d28df3 | 1 | /* |
fholin | 0:2325d1d28df3 | 2 | |
fholin | 0:2325d1d28df3 | 3 | __ __ _ _ |
fholin | 0:2325d1d28df3 | 4 | | \/ (_) (_) |
fholin | 0:2325d1d28df3 | 5 | | \ / |_ _ __ _ _ __ ___ ___ _ _ ___ ___ |
fholin | 0:2325d1d28df3 | 6 | | |\/| | | '_ \| | '_ ` _ \ / _ \| | | / __|/ _ \ |
fholin | 0:2325d1d28df3 | 7 | | | | | | | | | | | | | | | (_) | |_| \__ \ __/ |
fholin | 0:2325d1d28df3 | 8 | |_| |_|_|_| |_|_|_| |_| |_|\___/ \__,_|___/\___| |
fholin | 0:2325d1d28df3 | 9 | |
fholin | 0:2325d1d28df3 | 10 | |
fholin | 0:2325d1d28df3 | 11 | Description : Flash Api. |
fholin | 0:2325d1d28df3 | 12 | |
fholin | 0:2325d1d28df3 | 13 | |
fholin | 0:2325d1d28df3 | 14 | License : Revised BSD License, see LICENSE.TXT file include in the project |
fholin | 0:2325d1d28df3 | 15 | |
fholin | 0:2325d1d28df3 | 16 | Maintainer : Fabien Holin (SEMTECH) |
fholin | 0:2325d1d28df3 | 17 | */ |
fholin | 0:2325d1d28df3 | 18 | #ifndef APIRTC_H |
fholin | 0:2325d1d28df3 | 19 | #define APIRTC_H |
fholin | 0:2325d1d28df3 | 20 | #include "mbed.h" |
fholin | 1:eda561b01daf | 21 | void my_rtc_init ( void ) ; |
fholin | 1:eda561b01daf | 22 | uint32_t RtcGetTimeMs ( void ) ;//uint32_t *Seconds, uint16_t * SubSeconds); |
fholin | 0:2325d1d28df3 | 23 | uint32_t RtcGetTimeSecond( void ) ;//uint32_t *Seconds, uint16_t * SubSeconds); |
fholin | 0:2325d1d28df3 | 24 | void myrtc_write( time_t t ); |
fholin | 0:2325d1d28df3 | 25 | void mysleep (int time); |
fholin | 0:2325d1d28df3 | 26 | extern RTC_HandleTypeDef RtcHandle; |
fholin | 0:2325d1d28df3 | 27 | extern Timer timerglobal ; |
fholin | 0:2325d1d28df3 | 28 | void TimerLoraInit(void); |
fholin | 0:2325d1d28df3 | 29 | int GetTime(void); |
fholin | 0:2325d1d28df3 | 30 | void RtcSetAlarm( void ); |
fholin | 0:2325d1d28df3 | 31 | void RtcGetAlarm( void ); |
fholin | 0:2325d1d28df3 | 32 | void wait_s ( int t ); |
fholin | 1:eda561b01daf | 33 | |
fholin | 1:eda561b01daf | 34 | |
fholin | 1:eda561b01daf | 35 | |
fholin | 1:eda561b01daf | 36 | /* Specific implementation for STM32 . The following implementation is just to put in place |
fholin | 1:eda561b01daf | 37 | a setalarm function as described on the architecture specification of minimouse */ |
fholin | 1:eda561b01daf | 38 | |
fholin | 1:eda561b01daf | 39 | #define RTC_INIT_DATE 1 |
fholin | 1:eda561b01daf | 40 | #define RTC_INIT_MONTH RTC_MONTH_JANUARY |
fholin | 1:eda561b01daf | 41 | #define RTC_INIT_YEAR 0 |
fholin | 1:eda561b01daf | 42 | #define RTC_INIT_WEEKDAY RTC_WEEKDAY_SATURDAY |
fholin | 1:eda561b01daf | 43 | #define RTC_INIT_SUBSEC_SECONDS_MINUTES_HOURS 0 /*time at 0:0:0*/ |
fholin | 1:eda561b01daf | 44 | |
fholin | 1:eda561b01daf | 45 | #define END_OF_FEBRUARY_LEAP 60 //31+29 |
fholin | 1:eda561b01daf | 46 | #define END_OF_JULY_LEAP 213 //31+29+... |
fholin | 1:eda561b01daf | 47 | |
fholin | 1:eda561b01daf | 48 | #define END_OF_FEBRUARY_NORM 59 //31+28 |
fholin | 1:eda561b01daf | 49 | #define END_OF_JULY_NORM 212 //31+28+... |
fholin | 1:eda561b01daf | 50 | |
fholin | 1:eda561b01daf | 51 | #define DIV_1461(X) (( (X)*91867+22750)>>25) |
fholin | 1:eda561b01daf | 52 | |
fholin | 1:eda561b01daf | 53 | #define DIV_APPROX_86400(X) ( ((X)>>18) +( (X)>>17)) |
fholin | 1:eda561b01daf | 54 | |
fholin | 1:eda561b01daf | 55 | #define DIV_1461(X) (( (X)*91867+22750)>>25) |
fholin | 1:eda561b01daf | 56 | |
fholin | 1:eda561b01daf | 57 | #define DIV_APPROX_1000(X) ( ((X)>>10) +( (X)>>16) + ( (X)>>17)) |
fholin | 1:eda561b01daf | 58 | |
fholin | 1:eda561b01daf | 59 | #define DIV_APPROX_60(X) ( ( (X) *17476 )>>20 ) |
fholin | 1:eda561b01daf | 60 | |
fholin | 1:eda561b01daf | 61 | #define DIV_APPROX_61(X) (((X) *68759)>>22) |
fholin | 1:eda561b01daf | 62 | |
fholin | 1:eda561b01daf | 63 | #define MODULO_7(X) ( (X) -(( ( ((X)+1) *299593)>>21)*7)) |
fholin | 1:eda561b01daf | 64 | |
fholin | 1:eda561b01daf | 65 | #define DAYS_IN_MONTH_CORRECTION_NORM ((uint32_t) 0x99AAA0 ) |
fholin | 1:eda561b01daf | 66 | #define DAYS_IN_MONTH_CORRECTION_LEAP ((uint32_t) 0x445550 ) |
fholin | 1:eda561b01daf | 67 | |
fholin | 1:eda561b01daf | 68 | #define DAYS_IN_LEAP_YEAR (uint32_t) 366 |
fholin | 1:eda561b01daf | 69 | |
fholin | 1:eda561b01daf | 70 | #define DAYS_IN_YEAR (uint32_t) 365 |
fholin | 1:eda561b01daf | 71 | |
fholin | 1:eda561b01daf | 72 | #define SECONDS_IN_1DAY (uint32_t) 86400 |
fholin | 1:eda561b01daf | 73 | |
fholin | 1:eda561b01daf | 74 | #define SECONDS_IN_1HOUR (uint32_t) 3600 |
fholin | 1:eda561b01daf | 75 | |
fholin | 1:eda561b01daf | 76 | #define SECONDS_IN_1MINUTE (uint32_t) 60 |
fholin | 1:eda561b01daf | 77 | |
fholin | 1:eda561b01daf | 78 | #define MINUTES_IN_1HOUR (uint32_t) 60 |
fholin | 1:eda561b01daf | 79 | |
fholin | 1:eda561b01daf | 80 | #define HOURS_IN_1DAY (uint32_t) 24 |
fholin | 1:eda561b01daf | 81 | |
fholin | 1:eda561b01daf | 82 | /* Calculates ceiling(X/N) */ |
fholin | 1:eda561b01daf | 83 | #define DIVC(X,N) ( ( (X) + (N) -1 ) / (N) ) |
fholin | 1:eda561b01daf | 84 | |
fholin | 1:eda561b01daf | 85 | #define DIVC_BY_4(X) ( ( (X) + 3 ) >>2 ) |
fholin | 1:eda561b01daf | 86 | |
fholin | 1:eda561b01daf | 87 | #define DIVC_BY_2(X) ( ( (X) + 1 ) >>1 ) |
fholin | 1:eda561b01daf | 88 | |
fholin | 1:eda561b01daf | 89 | |
fholin | 1:eda561b01daf | 90 | |
fholin | 1:eda561b01daf | 91 | /* subsecond number of bits */ |
fholin | 1:eda561b01daf | 92 | #define N_PREDIV_S 10 |
fholin | 1:eda561b01daf | 93 | |
fholin | 1:eda561b01daf | 94 | /* Synchonuous prediv */ |
fholin | 1:eda561b01daf | 95 | #define PREDIV_S ((1<<N_PREDIV_S)-1) |
fholin | 1:eda561b01daf | 96 | |
fholin | 1:eda561b01daf | 97 | /* Asynchonuous prediv */ |
fholin | 1:eda561b01daf | 98 | #define PREDIV_A (1<<(15-N_PREDIV_S))-1 |
fholin | 1:eda561b01daf | 99 | |
fholin | 1:eda561b01daf | 100 | |
fholin | 1:eda561b01daf | 101 | |
fholin | 1:eda561b01daf | 102 | /* Sub-second mask definition */ |
fholin | 1:eda561b01daf | 103 | #define HW_RTC_ALARMSUBSECONDMASK N_PREDIV_S<<RTC_ALRMASSR_MASKSS_Pos |
fholin | 1:eda561b01daf | 104 | |
fholin | 1:eda561b01daf | 105 | /* RTC Time base in us */ |
fholin | 1:eda561b01daf | 106 | #define USEC_NUMBER 1000000 |
fholin | 1:eda561b01daf | 107 | #define MSEC_NUMBER (USEC_NUMBER/1000) |
fholin | 1:eda561b01daf | 108 | #define RTC_ALARM_TIME_BASE (USEC_NUMBER>>N_PREDIV_S) |
fholin | 1:eda561b01daf | 109 | |
fholin | 1:eda561b01daf | 110 | #define COMMON_FACTOR 3 |
fholin | 1:eda561b01daf | 111 | #define CONV_NUMER (MSEC_NUMBER>>COMMON_FACTOR) |
fholin | 1:eda561b01daf | 112 | #define CONV_DENOM (1<<(N_PREDIV_S-COMMON_FACTOR)) |
fholin | 1:eda561b01daf | 113 | |
fholin | 1:eda561b01daf | 114 | |
fholin | 1:eda561b01daf | 115 | __STATIC_INLINE uint32_t cal_div_61( uint32_t in ) |
fholin | 1:eda561b01daf | 116 | { |
fholin | 1:eda561b01daf | 117 | #if 0 |
fholin | 1:eda561b01daf | 118 | return (in / 61 ); |
fholin | 1:eda561b01daf | 119 | #else |
fholin | 1:eda561b01daf | 120 | |
fholin | 1:eda561b01daf | 121 | uint32_t out_temp=0; |
fholin | 1:eda561b01daf | 122 | uint32_t div_result=DIV_APPROX_61(in); |
fholin | 1:eda561b01daf | 123 | while (div_result >=1 ) |
fholin | 1:eda561b01daf | 124 | { |
fholin | 1:eda561b01daf | 125 | out_temp+=div_result; |
fholin | 1:eda561b01daf | 126 | in -= div_result*61; |
fholin | 1:eda561b01daf | 127 | div_result=DIV_APPROX_61(in); |
fholin | 1:eda561b01daf | 128 | } |
fholin | 1:eda561b01daf | 129 | if( in>= 61 ) |
fholin | 1:eda561b01daf | 130 | { |
fholin | 1:eda561b01daf | 131 | out_temp+=1; |
fholin | 1:eda561b01daf | 132 | in -= 61; |
fholin | 1:eda561b01daf | 133 | } |
fholin | 1:eda561b01daf | 134 | return out_temp; |
fholin | 1:eda561b01daf | 135 | #endif |
fholin | 1:eda561b01daf | 136 | } |
fholin | 1:eda561b01daf | 137 | |
fholin | 1:eda561b01daf | 138 | __STATIC_INLINE uint32_t cal_get_month(uint32_t Days, uint32_t year) |
fholin | 1:eda561b01daf | 139 | { |
fholin | 1:eda561b01daf | 140 | uint32_t month; |
fholin | 1:eda561b01daf | 141 | if ( (year%4) ==0 ) |
fholin | 1:eda561b01daf | 142 | { /*leap year*/ |
fholin | 1:eda561b01daf | 143 | if ( Days<END_OF_FEBRUARY_LEAP ) |
fholin | 1:eda561b01daf | 144 | { /*January or february*/ |
fholin | 1:eda561b01daf | 145 | // month = Days*2/(30+31); |
fholin | 1:eda561b01daf | 146 | month = cal_div_61(Days*2); |
fholin | 1:eda561b01daf | 147 | } |
fholin | 1:eda561b01daf | 148 | else if ( Days<END_OF_JULY_LEAP ) |
fholin | 1:eda561b01daf | 149 | { |
fholin | 1:eda561b01daf | 150 | month = cal_div_61((Days-END_OF_FEBRUARY_LEAP)*2)+2; |
fholin | 1:eda561b01daf | 151 | } |
fholin | 1:eda561b01daf | 152 | else |
fholin | 1:eda561b01daf | 153 | { |
fholin | 1:eda561b01daf | 154 | month = cal_div_61((Days-END_OF_JULY_LEAP)*2)+7; |
fholin | 1:eda561b01daf | 155 | } |
fholin | 1:eda561b01daf | 156 | } |
fholin | 1:eda561b01daf | 157 | else |
fholin | 1:eda561b01daf | 158 | { |
fholin | 1:eda561b01daf | 159 | if ( Days<END_OF_FEBRUARY_NORM ) |
fholin | 1:eda561b01daf | 160 | { /*January of february*/ |
fholin | 1:eda561b01daf | 161 | month = cal_div_61(Days*2); |
fholin | 1:eda561b01daf | 162 | } |
fholin | 1:eda561b01daf | 163 | else if ( Days<END_OF_JULY_NORM ) |
fholin | 1:eda561b01daf | 164 | { |
fholin | 1:eda561b01daf | 165 | month = cal_div_61((Days-END_OF_FEBRUARY_NORM)*2)+2; |
fholin | 1:eda561b01daf | 166 | } |
fholin | 1:eda561b01daf | 167 | else |
fholin | 1:eda561b01daf | 168 | { |
fholin | 1:eda561b01daf | 169 | month = cal_div_61((Days-END_OF_JULY_NORM)*2)+7; |
fholin | 1:eda561b01daf | 170 | } |
fholin | 1:eda561b01daf | 171 | } |
fholin | 1:eda561b01daf | 172 | return month; |
fholin | 1:eda561b01daf | 173 | } |
fholin | 1:eda561b01daf | 174 | |
fholin | 1:eda561b01daf | 175 | __STATIC_INLINE void cal_div_86400( uint32_t in, uint32_t* out, uint32_t* remainder ) |
fholin | 1:eda561b01daf | 176 | { |
fholin | 1:eda561b01daf | 177 | #if 0 |
fholin | 1:eda561b01daf | 178 | *remainder= total_nb_seconds % SECONDS_IN_1DAY; |
fholin | 1:eda561b01daf | 179 | * nbDays = total_nb_seconds / SECONDS_IN_1DAY; |
fholin | 1:eda561b01daf | 180 | #else |
fholin | 1:eda561b01daf | 181 | |
fholin | 1:eda561b01daf | 182 | uint32_t out_temp=0; |
fholin | 1:eda561b01daf | 183 | uint32_t div_result=DIV_APPROX_86400(in); |
fholin | 1:eda561b01daf | 184 | while (div_result >=1 ) |
fholin | 1:eda561b01daf | 185 | { |
fholin | 1:eda561b01daf | 186 | out_temp+=div_result; |
fholin | 1:eda561b01daf | 187 | in -= div_result*86400; |
fholin | 1:eda561b01daf | 188 | div_result=DIV_APPROX_86400(in); |
fholin | 1:eda561b01daf | 189 | } |
fholin | 1:eda561b01daf | 190 | if( in>=86400 ) |
fholin | 1:eda561b01daf | 191 | { |
fholin | 1:eda561b01daf | 192 | out_temp+=1; |
fholin | 1:eda561b01daf | 193 | in -= 86400; |
fholin | 1:eda561b01daf | 194 | } |
fholin | 1:eda561b01daf | 195 | |
fholin | 1:eda561b01daf | 196 | *remainder = in; |
fholin | 1:eda561b01daf | 197 | *out = out_temp; |
fholin | 1:eda561b01daf | 198 | #endif |
fholin | 1:eda561b01daf | 199 | } |
fholin | 1:eda561b01daf | 200 | |
fholin | 1:eda561b01daf | 201 | |
fholin | 1:eda561b01daf | 202 | |
fholin | 1:eda561b01daf | 203 | __STATIC_INLINE void cal_div_1000( uint32_t in, uint32_t* out, uint32_t* remainder ) |
fholin | 1:eda561b01daf | 204 | { |
fholin | 1:eda561b01daf | 205 | #if 0 |
fholin | 1:eda561b01daf | 206 | *remainder= total_nb_seconds % 1000; |
fholin | 1:eda561b01daf | 207 | *out = total_nb_seconds / 1000; |
fholin | 1:eda561b01daf | 208 | #else |
fholin | 1:eda561b01daf | 209 | |
fholin | 1:eda561b01daf | 210 | uint32_t out_temp=0; |
fholin | 1:eda561b01daf | 211 | uint32_t div_result=DIV_APPROX_1000(in); |
fholin | 1:eda561b01daf | 212 | while (div_result >=1 ) |
fholin | 1:eda561b01daf | 213 | { |
fholin | 1:eda561b01daf | 214 | out_temp+=div_result; |
fholin | 1:eda561b01daf | 215 | in -= div_result*1000; |
fholin | 1:eda561b01daf | 216 | div_result=DIV_APPROX_1000(in); |
fholin | 1:eda561b01daf | 217 | } |
fholin | 1:eda561b01daf | 218 | if( in>= 1000 ) |
fholin | 1:eda561b01daf | 219 | { |
fholin | 1:eda561b01daf | 220 | out_temp+=1; |
fholin | 1:eda561b01daf | 221 | in -= 1000; |
fholin | 1:eda561b01daf | 222 | } |
fholin | 1:eda561b01daf | 223 | *remainder = in; |
fholin | 1:eda561b01daf | 224 | *out = out_temp; |
fholin | 1:eda561b01daf | 225 | #endif |
fholin | 1:eda561b01daf | 226 | } |
fholin | 1:eda561b01daf | 227 | |
fholin | 1:eda561b01daf | 228 | __STATIC_INLINE void cal_div_60( uint32_t in, uint32_t* out, uint32_t* remainder ) |
fholin | 1:eda561b01daf | 229 | { |
fholin | 1:eda561b01daf | 230 | #if 0 |
fholin | 1:eda561b01daf | 231 | *remainder= total_nb_seconds % 60; |
fholin | 1:eda561b01daf | 232 | *out = total_nb_seconds / 60; |
fholin | 1:eda561b01daf | 233 | #else |
fholin | 1:eda561b01daf | 234 | |
fholin | 1:eda561b01daf | 235 | uint32_t out_temp=0; |
fholin | 1:eda561b01daf | 236 | uint32_t div_result=DIV_APPROX_60(in); |
fholin | 1:eda561b01daf | 237 | while (div_result >=1 ) |
fholin | 1:eda561b01daf | 238 | { |
fholin | 1:eda561b01daf | 239 | out_temp+=div_result; |
fholin | 1:eda561b01daf | 240 | in -= div_result*60; |
fholin | 1:eda561b01daf | 241 | div_result=DIV_APPROX_60(in); |
fholin | 1:eda561b01daf | 242 | } |
fholin | 1:eda561b01daf | 243 | if( in>= 60 ) |
fholin | 1:eda561b01daf | 244 | { |
fholin | 1:eda561b01daf | 245 | out_temp+=1; |
fholin | 1:eda561b01daf | 246 | in -= 60; |
fholin | 1:eda561b01daf | 247 | } |
fholin | 1:eda561b01daf | 248 | *remainder = in; |
fholin | 1:eda561b01daf | 249 | *out = out_temp; |
fholin | 1:eda561b01daf | 250 | #endif |
fholin | 1:eda561b01daf | 251 | } |
fholin | 1:eda561b01daf | 252 | |
fholin | 1:eda561b01daf | 253 | __STATIC_INLINE uint64_t cal_convertBCD_2_Cnt64( RTC_DateTypeDef* RTC_DateStruct, RTC_TimeTypeDef* RTC_TimeStruct ) |
fholin | 1:eda561b01daf | 254 | { |
fholin | 1:eda561b01daf | 255 | uint64_t cnt64 = 0; |
fholin | 1:eda561b01daf | 256 | |
fholin | 1:eda561b01daf | 257 | uint32_t nbdays ; |
fholin | 1:eda561b01daf | 258 | |
fholin | 1:eda561b01daf | 259 | uint32_t nbsecs; |
fholin | 1:eda561b01daf | 260 | |
fholin | 1:eda561b01daf | 261 | uint32_t correction_month[4]={DAYS_IN_MONTH_CORRECTION_LEAP, |
fholin | 1:eda561b01daf | 262 | DAYS_IN_MONTH_CORRECTION_NORM, |
fholin | 1:eda561b01daf | 263 | DAYS_IN_MONTH_CORRECTION_NORM, |
fholin | 1:eda561b01daf | 264 | DAYS_IN_MONTH_CORRECTION_NORM}; |
fholin | 1:eda561b01daf | 265 | |
fholin | 1:eda561b01daf | 266 | nbdays= DIVC( (DAYS_IN_YEAR*3 + DAYS_IN_LEAP_YEAR)* RTC_DateStruct->Year , 4); |
fholin | 1:eda561b01daf | 267 | |
fholin | 1:eda561b01daf | 268 | nbdays +=( DIVC_BY_2( (RTC_DateStruct->Month-1)*(30+31) ) - (((correction_month[RTC_DateStruct->Year % 4]>> ((RTC_DateStruct->Month-1)*2) )&0x3))); |
fholin | 1:eda561b01daf | 269 | |
fholin | 1:eda561b01daf | 270 | nbdays += (RTC_DateStruct->Date -1); |
fholin | 1:eda561b01daf | 271 | |
fholin | 1:eda561b01daf | 272 | /* convert from days to seconds */ |
fholin | 1:eda561b01daf | 273 | cnt64 = nbdays* SECONDS_IN_1DAY; |
fholin | 1:eda561b01daf | 274 | |
fholin | 1:eda561b01daf | 275 | nbsecs = ( ( uint32_t )RTC_TimeStruct->Seconds + |
fholin | 1:eda561b01daf | 276 | ( ( uint32_t )RTC_TimeStruct->Minutes * SECONDS_IN_1MINUTE ) + |
fholin | 1:eda561b01daf | 277 | ( ( uint32_t )RTC_TimeStruct->Hours * SECONDS_IN_1HOUR ) ) ; |
fholin | 1:eda561b01daf | 278 | |
fholin | 1:eda561b01daf | 279 | cnt64 = nbdays * SECONDS_IN_1DAY + nbsecs ; |
fholin | 1:eda561b01daf | 280 | |
fholin | 1:eda561b01daf | 281 | cnt64 = (cnt64<<N_PREDIV_S) + ( RTC_TimeStruct->SubSeconds); |
fholin | 1:eda561b01daf | 282 | |
fholin | 1:eda561b01daf | 283 | return cnt64; |
fholin | 1:eda561b01daf | 284 | } |
fholin | 1:eda561b01daf | 285 | |
fholin | 1:eda561b01daf | 286 | |
fholin | 1:eda561b01daf | 287 | |
fholin | 1:eda561b01daf | 288 | __STATIC_INLINE void cal_convert_Cnt64_2_Bcd( RTC_DateTypeDef* Date, RTC_TimeTypeDef* Time, uint64_t cnt64 ) |
fholin | 1:eda561b01daf | 289 | { |
fholin | 1:eda561b01daf | 290 | uint32_t correction_month[4]={DAYS_IN_MONTH_CORRECTION_LEAP, |
fholin | 1:eda561b01daf | 291 | DAYS_IN_MONTH_CORRECTION_NORM, |
fholin | 1:eda561b01daf | 292 | DAYS_IN_MONTH_CORRECTION_NORM, |
fholin | 1:eda561b01daf | 293 | DAYS_IN_MONTH_CORRECTION_NORM}; |
fholin | 1:eda561b01daf | 294 | uint32_t weekDays = (RTC_INIT_WEEKDAY-1); |
fholin | 1:eda561b01daf | 295 | uint32_t cnt32 = cnt64>> N_PREDIV_S; /*total in seconds (136 year)*/ |
fholin | 1:eda561b01daf | 296 | uint32_t seconds; |
fholin | 1:eda561b01daf | 297 | uint32_t minutes; |
fholin | 1:eda561b01daf | 298 | uint32_t Days; |
fholin | 1:eda561b01daf | 299 | uint32_t div_out; |
fholin | 1:eda561b01daf | 300 | uint32_t div_rem; |
fholin | 1:eda561b01daf | 301 | |
fholin | 1:eda561b01daf | 302 | cal_div_86400(cnt32, &Days, &seconds); |
fholin | 1:eda561b01daf | 303 | |
fholin | 1:eda561b01daf | 304 | Time->SubSeconds = ( cnt64 & PREDIV_S); |
fholin | 1:eda561b01daf | 305 | |
fholin | 1:eda561b01daf | 306 | /* calculates seconds */ |
fholin | 1:eda561b01daf | 307 | cal_div_60(seconds, &minutes, &div_rem); |
fholin | 1:eda561b01daf | 308 | Time->Seconds=(uint8_t) div_rem; |
fholin | 1:eda561b01daf | 309 | |
fholin | 1:eda561b01daf | 310 | /* calculates minutes and hours*/ |
fholin | 1:eda561b01daf | 311 | cal_div_60(minutes, &div_out, &div_rem); |
fholin | 1:eda561b01daf | 312 | Time->Minutes = (uint8_t) div_rem; |
fholin | 1:eda561b01daf | 313 | Time->Hours = (uint8_t) div_out; |
fholin | 1:eda561b01daf | 314 | /* calculates Year */ |
fholin | 1:eda561b01daf | 315 | Date->Year = DIV_1461(Days); |
fholin | 1:eda561b01daf | 316 | Days-= DIVC_BY_4( (DAYS_IN_YEAR*3 + DAYS_IN_LEAP_YEAR)* Date->Year ); |
fholin | 1:eda561b01daf | 317 | |
fholin | 1:eda561b01daf | 318 | /*calculates month*/ |
fholin | 1:eda561b01daf | 319 | Date->Month = cal_get_month( Days, Date->Year) ; |
fholin | 1:eda561b01daf | 320 | |
fholin | 1:eda561b01daf | 321 | /*calculates weekdays*/ |
fholin | 1:eda561b01daf | 322 | weekDays += DIVC_BY_4((Date->Year*5)); |
fholin | 1:eda561b01daf | 323 | weekDays += Days; |
fholin | 1:eda561b01daf | 324 | Date->WeekDay = MODULO_7( weekDays ); |
fholin | 1:eda561b01daf | 325 | |
fholin | 1:eda561b01daf | 326 | Days -=( DIVC_BY_2( (Date->Month)*(30+31) ) - (((correction_month[Date->Year % 4]>> ((Date->Month)*2) )&0x3))); |
fholin | 1:eda561b01daf | 327 | |
fholin | 1:eda561b01daf | 328 | /* convert 0 to 1 indexed. */ |
fholin | 1:eda561b01daf | 329 | Date->WeekDay ++ ;/* 0 to 1 indexed. month={0..6} to {1..7}*/ |
fholin | 1:eda561b01daf | 330 | Date->Month++; /* 0 to 1 indexed. month={0..11} to {1..12}*/ |
fholin | 1:eda561b01daf | 331 | Date->Date = (Days+1);/* 0 to 1 indexed */ |
fholin | 1:eda561b01daf | 332 | } |
fholin | 1:eda561b01daf | 333 | |
fholin | 1:eda561b01daf | 334 | |
fholin | 1:eda561b01daf | 335 | |
fholin | 1:eda561b01daf | 336 | |
fholin | 1:eda561b01daf | 337 | |
fholin | 1:eda561b01daf | 338 | |
fholin | 0:2325d1d28df3 | 339 | #endif |