added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
bogdanm
Date:
Thu Oct 01 15:25:22 2015 +0300
Revision:
0:9b334a45a8ff
Child:
144:ef7eb2e8f9f7
Initial commit on mbed-dev

Replaces mbed-src (now inactive)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /* mbed Microcontroller Library
bogdanm 0:9b334a45a8ff 2 * Copyright (c) 2006-2015 ARM Limited
bogdanm 0:9b334a45a8ff 3 *
bogdanm 0:9b334a45a8ff 4 * Licensed under the Apache License, Version 2.0 (the "License");
bogdanm 0:9b334a45a8ff 5 * you may not use this file except in compliance with the License.
bogdanm 0:9b334a45a8ff 6 * You may obtain a copy of the License at
bogdanm 0:9b334a45a8ff 7 *
bogdanm 0:9b334a45a8ff 8 * http://www.apache.org/licenses/LICENSE-2.0
bogdanm 0:9b334a45a8ff 9 *
bogdanm 0:9b334a45a8ff 10 * Unless required by applicable law or agreed to in writing, software
bogdanm 0:9b334a45a8ff 11 * distributed under the License is distributed on an "AS IS" BASIS,
bogdanm 0:9b334a45a8ff 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
bogdanm 0:9b334a45a8ff 13 * See the License for the specific language governing permissions and
bogdanm 0:9b334a45a8ff 14 * limitations under the License.
bogdanm 0:9b334a45a8ff 15 */
bogdanm 0:9b334a45a8ff 16
bogdanm 0:9b334a45a8ff 17 #include "mbed_assert.h"
bogdanm 0:9b334a45a8ff 18 #include "device.h"
bogdanm 0:9b334a45a8ff 19
bogdanm 0:9b334a45a8ff 20 #if DEVICE_RTC
bogdanm 0:9b334a45a8ff 21
bogdanm 0:9b334a45a8ff 22 #include "rtc_api.h"
bogdanm 0:9b334a45a8ff 23 #include "rtc_iodefine.h"
bogdanm 0:9b334a45a8ff 24
bogdanm 0:9b334a45a8ff 25
bogdanm 0:9b334a45a8ff 26 #define RCR1_VAL_ON (0x08u) // AIE = 1
bogdanm 0:9b334a45a8ff 27 #define RCR1_VAL_OFF (0x00u)
bogdanm 0:9b334a45a8ff 28 #define RCR2_VAL_ALLSTOP (0x00u)
bogdanm 0:9b334a45a8ff 29 #define RCR2_VAL_START (0x01u) // START = 1
bogdanm 0:9b334a45a8ff 30 #define RCR2_VAL_RESET (0x02u) // RESET = 1
bogdanm 0:9b334a45a8ff 31 #define RCR3_VAL (0x00u)
bogdanm 0:9b334a45a8ff 32 #define RCR5_VAL_EXTAL (0x01u) // RCKSEL = connect EXTAL
bogdanm 0:9b334a45a8ff 33 #define RCR5_VAL_RTCX1 (0x00u) // RCKSEL = disconnect EXTAL
bogdanm 0:9b334a45a8ff 34 #define RFRH_VAL_13333 (0x8003u) // 13.3333MHz (= 64Hz * 0x32DCD)
bogdanm 0:9b334a45a8ff 35 #define RFRL_VAL_13333 (0x2DCDu) //
bogdanm 0:9b334a45a8ff 36 #define RFRH_VAL_MAX (0x0007u) // MAX value (= 128Hz * 0x7FFFF)
bogdanm 0:9b334a45a8ff 37 #define RFRL_VAL_MAX (0xFFFFu) //
bogdanm 0:9b334a45a8ff 38
bogdanm 0:9b334a45a8ff 39 #define MASK_00_03_POS (0x000Fu)
bogdanm 0:9b334a45a8ff 40 #define MASK_04_07_POS (0x00F0u)
bogdanm 0:9b334a45a8ff 41 #define MASK_08_11_POS (0x0F00u)
bogdanm 0:9b334a45a8ff 42 #define MASK_12_15_POS (0xF000u)
bogdanm 0:9b334a45a8ff 43 #define MASK_16_20_POS (0x000F0000u)
bogdanm 0:9b334a45a8ff 44 #define SHIFT_1_HBYTE (4u)
bogdanm 0:9b334a45a8ff 45 #define SHIFT_2_HBYTE (8u)
bogdanm 0:9b334a45a8ff 46 #define SHIFT_3_HBYTE (12u)
bogdanm 0:9b334a45a8ff 47 #define SHIFT_1BYTE (8u)
bogdanm 0:9b334a45a8ff 48 #define SHIFT_2BYTE (16u)
bogdanm 0:9b334a45a8ff 49
bogdanm 0:9b334a45a8ff 50 #define TIME_ERROR_VAL (0xFFFFFFFFu)
bogdanm 0:9b334a45a8ff 51
bogdanm 0:9b334a45a8ff 52 static int rtc_dec8_to_hex(uint8_t dec_val, uint8_t offset, int *hex_val);
bogdanm 0:9b334a45a8ff 53 static int rtc_dec16_to_hex(uint16_t dec_val, uint16_t offset, int *hex_val);
bogdanm 0:9b334a45a8ff 54 static uint8_t rtc_hex8_to_dec(uint8_t hex_val);
bogdanm 0:9b334a45a8ff 55 static uint16_t rtc_hex16_to_dec(uint16_t hex_val);
bogdanm 0:9b334a45a8ff 56
bogdanm 0:9b334a45a8ff 57
bogdanm 0:9b334a45a8ff 58 /*
bogdanm 0:9b334a45a8ff 59 * Setup the RTC based on a time structure.
bogdanm 0:9b334a45a8ff 60 * The rtc_init function should be executed first.
bogdanm 0:9b334a45a8ff 61 * [in]
bogdanm 0:9b334a45a8ff 62 * None.
bogdanm 0:9b334a45a8ff 63 * [out]
bogdanm 0:9b334a45a8ff 64 * None.
bogdanm 0:9b334a45a8ff 65 */
bogdanm 0:9b334a45a8ff 66 void rtc_init(void) {
bogdanm 0:9b334a45a8ff 67 volatile uint8_t dummy_read;
bogdanm 0:9b334a45a8ff 68
bogdanm 0:9b334a45a8ff 69 // Set control register
bogdanm 0:9b334a45a8ff 70 RTC.RCR2 = RCR2_VAL_ALLSTOP;
bogdanm 0:9b334a45a8ff 71 RTC.RCR1 = RCR1_VAL_ON;
bogdanm 0:9b334a45a8ff 72 RTC.RCR3 = RCR3_VAL;
bogdanm 0:9b334a45a8ff 73 RTC.RCR5 = RCR5_VAL_EXTAL;
bogdanm 0:9b334a45a8ff 74 RTC.RFRH = RFRH_VAL_13333;
bogdanm 0:9b334a45a8ff 75 RTC.RFRL = RFRL_VAL_13333;
bogdanm 0:9b334a45a8ff 76
bogdanm 0:9b334a45a8ff 77 // Dummy read
bogdanm 0:9b334a45a8ff 78 dummy_read = RTC.RCR2;
bogdanm 0:9b334a45a8ff 79 dummy_read = RTC.RCR2;
bogdanm 0:9b334a45a8ff 80
bogdanm 0:9b334a45a8ff 81 RTC.RCR2 = RCR2_VAL_RESET; // RESET = 1
bogdanm 0:9b334a45a8ff 82
bogdanm 0:9b334a45a8ff 83 // Dummy read
bogdanm 0:9b334a45a8ff 84 dummy_read = RTC.RCR2;
bogdanm 0:9b334a45a8ff 85 dummy_read = RTC.RCR2;
bogdanm 0:9b334a45a8ff 86
bogdanm 0:9b334a45a8ff 87 // Set timer and alarm. Default value :01-01-1970 00:00:00
bogdanm 0:9b334a45a8ff 88 RTC.RSECCNT = 0;
bogdanm 0:9b334a45a8ff 89 RTC.RMINCNT = 0;
bogdanm 0:9b334a45a8ff 90 RTC.RHRCNT = 0;
bogdanm 0:9b334a45a8ff 91 RTC.RWKCNT = 0;
bogdanm 0:9b334a45a8ff 92 RTC.RDAYCNT = 1;
bogdanm 0:9b334a45a8ff 93 RTC.RMONCNT = 1;
bogdanm 0:9b334a45a8ff 94 RTC.RYRCNT = 0x1970;
bogdanm 0:9b334a45a8ff 95 RTC.RSECAR = 0;
bogdanm 0:9b334a45a8ff 96 RTC.RMINAR = 0;
bogdanm 0:9b334a45a8ff 97 RTC.RHRAR = 0;
bogdanm 0:9b334a45a8ff 98 RTC.RWKAR = 0;
bogdanm 0:9b334a45a8ff 99 RTC.RDAYAR = 1;
bogdanm 0:9b334a45a8ff 100 RTC.RMONAR = 1;
bogdanm 0:9b334a45a8ff 101 RTC.RYRAR = 0x1970;
bogdanm 0:9b334a45a8ff 102
bogdanm 0:9b334a45a8ff 103 // Dummy read
bogdanm 0:9b334a45a8ff 104 dummy_read = RTC.RYRCNT;
bogdanm 0:9b334a45a8ff 105 dummy_read = RTC.RYRCNT;
bogdanm 0:9b334a45a8ff 106
bogdanm 0:9b334a45a8ff 107 }
bogdanm 0:9b334a45a8ff 108
bogdanm 0:9b334a45a8ff 109
bogdanm 0:9b334a45a8ff 110 /*
bogdanm 0:9b334a45a8ff 111 * Release the RTC based on a time structure.
bogdanm 0:9b334a45a8ff 112 * [in]
bogdanm 0:9b334a45a8ff 113 * None.
bogdanm 0:9b334a45a8ff 114 * [out]
bogdanm 0:9b334a45a8ff 115 * None.
bogdanm 0:9b334a45a8ff 116 */
bogdanm 0:9b334a45a8ff 117 void rtc_free(void) {
bogdanm 0:9b334a45a8ff 118 volatile uint8_t dummy_read;
bogdanm 0:9b334a45a8ff 119
bogdanm 0:9b334a45a8ff 120 // Set control register
bogdanm 0:9b334a45a8ff 121 RTC.RCR2 = RCR2_VAL_ALLSTOP;
bogdanm 0:9b334a45a8ff 122 RTC.RCR1 = RCR1_VAL_OFF;
bogdanm 0:9b334a45a8ff 123 RTC.RCR3 = RCR3_VAL;
bogdanm 0:9b334a45a8ff 124 RTC.RCR5 = RCR5_VAL_RTCX1;
bogdanm 0:9b334a45a8ff 125 RTC.RFRH = RFRH_VAL_MAX;
bogdanm 0:9b334a45a8ff 126 RTC.RFRL = RFRL_VAL_MAX;
bogdanm 0:9b334a45a8ff 127
bogdanm 0:9b334a45a8ff 128 // Dummy read
bogdanm 0:9b334a45a8ff 129 dummy_read = RTC.RCR2;
bogdanm 0:9b334a45a8ff 130 dummy_read = RTC.RCR2;
bogdanm 0:9b334a45a8ff 131 RTC.RCR2 = RCR2_VAL_RESET; // RESET = 1
bogdanm 0:9b334a45a8ff 132
bogdanm 0:9b334a45a8ff 133 // Dummy read
bogdanm 0:9b334a45a8ff 134 dummy_read = RTC.RCR2;
bogdanm 0:9b334a45a8ff 135 dummy_read = RTC.RCR2;
bogdanm 0:9b334a45a8ff 136
bogdanm 0:9b334a45a8ff 137 // Set timer and alarm. Default value :01-01-1970 00:00:00
bogdanm 0:9b334a45a8ff 138 RTC.RSECCNT = 0;
bogdanm 0:9b334a45a8ff 139 RTC.RMINCNT = 0;
bogdanm 0:9b334a45a8ff 140 RTC.RHRCNT = 0;
bogdanm 0:9b334a45a8ff 141 RTC.RWKCNT = 0;
bogdanm 0:9b334a45a8ff 142 RTC.RDAYCNT = 1;
bogdanm 0:9b334a45a8ff 143 RTC.RMONCNT = 1;
bogdanm 0:9b334a45a8ff 144 RTC.RYRCNT = 0x1970;
bogdanm 0:9b334a45a8ff 145 RTC.RSECAR = 0;
bogdanm 0:9b334a45a8ff 146 RTC.RMINAR = 0;
bogdanm 0:9b334a45a8ff 147 RTC.RHRAR = 0;
bogdanm 0:9b334a45a8ff 148 RTC.RWKAR = 0;
bogdanm 0:9b334a45a8ff 149 RTC.RDAYAR = 1;
bogdanm 0:9b334a45a8ff 150 RTC.RMONAR = 1;
bogdanm 0:9b334a45a8ff 151 RTC.RYRAR = 0x1970;
bogdanm 0:9b334a45a8ff 152
bogdanm 0:9b334a45a8ff 153 // Dummy read
bogdanm 0:9b334a45a8ff 154 dummy_read = RTC.RYRCNT;
bogdanm 0:9b334a45a8ff 155 dummy_read = RTC.RYRCNT;
bogdanm 0:9b334a45a8ff 156
bogdanm 0:9b334a45a8ff 157 }
bogdanm 0:9b334a45a8ff 158
bogdanm 0:9b334a45a8ff 159
bogdanm 0:9b334a45a8ff 160 /*
bogdanm 0:9b334a45a8ff 161 * Check the RTC has been enabled.
bogdanm 0:9b334a45a8ff 162 * Clock Control Register RTC.RCR1(bit3): 0 = Disabled, 1 = Enabled.
bogdanm 0:9b334a45a8ff 163 * [in]
bogdanm 0:9b334a45a8ff 164 * None.
bogdanm 0:9b334a45a8ff 165 * [out]
bogdanm 0:9b334a45a8ff 166 * 0:Disabled, 1:Enabled.
bogdanm 0:9b334a45a8ff 167 */
bogdanm 0:9b334a45a8ff 168 int rtc_isenabled(void) {
bogdanm 0:9b334a45a8ff 169 int ret_val = 0;
bogdanm 0:9b334a45a8ff 170
bogdanm 0:9b334a45a8ff 171 if ((RTC.RCR1 & RCR1_VAL_ON) != 0) { // RTC ON ?
bogdanm 0:9b334a45a8ff 172 ret_val = 1;
bogdanm 0:9b334a45a8ff 173 }
bogdanm 0:9b334a45a8ff 174
bogdanm 0:9b334a45a8ff 175 return ret_val;
bogdanm 0:9b334a45a8ff 176 }
bogdanm 0:9b334a45a8ff 177
bogdanm 0:9b334a45a8ff 178
bogdanm 0:9b334a45a8ff 179 /*
bogdanm 0:9b334a45a8ff 180 * RTC read function.
bogdanm 0:9b334a45a8ff 181 * [in]
bogdanm 0:9b334a45a8ff 182 * None.
bogdanm 0:9b334a45a8ff 183 * [out]
bogdanm 0:9b334a45a8ff 184 * UNIX timestamp value.
bogdanm 0:9b334a45a8ff 185 */
bogdanm 0:9b334a45a8ff 186 time_t rtc_read(void) {
bogdanm 0:9b334a45a8ff 187
bogdanm 0:9b334a45a8ff 188 struct tm timeinfo;
bogdanm 0:9b334a45a8ff 189 int err = 0;
bogdanm 0:9b334a45a8ff 190 uint8_t tmp_regdata;
bogdanm 0:9b334a45a8ff 191 time_t t;
bogdanm 0:9b334a45a8ff 192
bogdanm 0:9b334a45a8ff 193 if (rtc_isenabled() != 0) {
bogdanm 0:9b334a45a8ff 194 RTC.RCR1 &= ~0x10u; // CIE = 0
bogdanm 0:9b334a45a8ff 195 do {
bogdanm 0:9b334a45a8ff 196 // before reading process
bogdanm 0:9b334a45a8ff 197 tmp_regdata = RTC.RCR1;
bogdanm 0:9b334a45a8ff 198 tmp_regdata &= ~0x80u; // CF = 0
bogdanm 0:9b334a45a8ff 199 tmp_regdata |= 0x01u; // AF = 1
bogdanm 0:9b334a45a8ff 200 RTC.RCR1 = tmp_regdata;
bogdanm 0:9b334a45a8ff 201
bogdanm 0:9b334a45a8ff 202 // Read RTC register
bogdanm 0:9b334a45a8ff 203 err = rtc_dec8_to_hex(RTC.RSECCNT , 0 , &timeinfo.tm_sec);
bogdanm 0:9b334a45a8ff 204 err += rtc_dec8_to_hex(RTC.RMINCNT , 0 , &timeinfo.tm_min);
bogdanm 0:9b334a45a8ff 205 err += rtc_dec8_to_hex(RTC.RHRCNT , 0 , &timeinfo.tm_hour);
bogdanm 0:9b334a45a8ff 206 err += rtc_dec8_to_hex(RTC.RDAYCNT , 0 , &timeinfo.tm_mday);
bogdanm 0:9b334a45a8ff 207 err += rtc_dec8_to_hex(RTC.RMONCNT , 1 , &timeinfo.tm_mon);
bogdanm 0:9b334a45a8ff 208 err += rtc_dec16_to_hex(RTC.RYRCNT , 1900 , &timeinfo.tm_year);
bogdanm 0:9b334a45a8ff 209 } while ((RTC.RCR1 & 0x80u) != 0);
bogdanm 0:9b334a45a8ff 210 } else {
bogdanm 0:9b334a45a8ff 211 err = 1;
bogdanm 0:9b334a45a8ff 212 }
bogdanm 0:9b334a45a8ff 213
bogdanm 0:9b334a45a8ff 214 if (err == 0) {
bogdanm 0:9b334a45a8ff 215 // Convert to timestamp
bogdanm 0:9b334a45a8ff 216 t = mktime(&timeinfo);
bogdanm 0:9b334a45a8ff 217 } else {
bogdanm 0:9b334a45a8ff 218 // Error
bogdanm 0:9b334a45a8ff 219 t = TIME_ERROR_VAL;
bogdanm 0:9b334a45a8ff 220 }
bogdanm 0:9b334a45a8ff 221
bogdanm 0:9b334a45a8ff 222 return t;
bogdanm 0:9b334a45a8ff 223 }
bogdanm 0:9b334a45a8ff 224
bogdanm 0:9b334a45a8ff 225 /*
bogdanm 0:9b334a45a8ff 226 * Dec(8bit) to Hex function for RTC.
bogdanm 0:9b334a45a8ff 227 * [in]
bogdanm 0:9b334a45a8ff 228 * dec_val:Decimal value (from 0x00 to 0x99).
bogdanm 0:9b334a45a8ff 229 * offset:Subtract offset from dec_val.
bogdanm 0:9b334a45a8ff 230 * hex_val:Pointer of output hexadecimal value.
bogdanm 0:9b334a45a8ff 231 * [out]
bogdanm 0:9b334a45a8ff 232 * 0:Success
bogdanm 0:9b334a45a8ff 233 * 1:Error
bogdanm 0:9b334a45a8ff 234 */
bogdanm 0:9b334a45a8ff 235 static int rtc_dec8_to_hex(uint8_t dec_val, uint8_t offset, int *hex_val) {
bogdanm 0:9b334a45a8ff 236 int err = 0;
bogdanm 0:9b334a45a8ff 237 uint8_t ret_val;
bogdanm 0:9b334a45a8ff 238
bogdanm 0:9b334a45a8ff 239 if (hex_val != NULL) {
bogdanm 0:9b334a45a8ff 240 if (((dec_val & MASK_04_07_POS) >= (0x0A << SHIFT_1_HBYTE)) ||
bogdanm 0:9b334a45a8ff 241 ((dec_val & MASK_00_03_POS) >= 0x0A)) {
bogdanm 0:9b334a45a8ff 242 err = 1;
bogdanm 0:9b334a45a8ff 243 } else {
bogdanm 0:9b334a45a8ff 244 ret_val = ((dec_val & MASK_04_07_POS) >> SHIFT_1_HBYTE) * 10 +
bogdanm 0:9b334a45a8ff 245 (dec_val & MASK_00_03_POS);
bogdanm 0:9b334a45a8ff 246 if (ret_val < offset) {
bogdanm 0:9b334a45a8ff 247 err = 1;
bogdanm 0:9b334a45a8ff 248 } else {
bogdanm 0:9b334a45a8ff 249 *hex_val = ret_val - offset;
bogdanm 0:9b334a45a8ff 250 }
bogdanm 0:9b334a45a8ff 251 }
bogdanm 0:9b334a45a8ff 252 } else {
bogdanm 0:9b334a45a8ff 253 err = 1;
bogdanm 0:9b334a45a8ff 254 }
bogdanm 0:9b334a45a8ff 255
bogdanm 0:9b334a45a8ff 256 return err;
bogdanm 0:9b334a45a8ff 257 }
bogdanm 0:9b334a45a8ff 258
bogdanm 0:9b334a45a8ff 259 /*
bogdanm 0:9b334a45a8ff 260 * Dec(16bit) to Hex function for RTC
bogdanm 0:9b334a45a8ff 261 * [in]
bogdanm 0:9b334a45a8ff 262 * dec_val:Decimal value (from 0x0000 to 0x9999).
bogdanm 0:9b334a45a8ff 263 * offset:Subtract offset from dec_val.
bogdanm 0:9b334a45a8ff 264 * hex_val:Pointer of output hexadecimal value.
bogdanm 0:9b334a45a8ff 265 * [out]
bogdanm 0:9b334a45a8ff 266 * 0:Success
bogdanm 0:9b334a45a8ff 267 * 1:Error
bogdanm 0:9b334a45a8ff 268 */
bogdanm 0:9b334a45a8ff 269 static int rtc_dec16_to_hex(uint16_t dec_val, uint16_t offset, int *hex_val) {
bogdanm 0:9b334a45a8ff 270 int err = 0;
bogdanm 0:9b334a45a8ff 271 uint16_t ret_val;
bogdanm 0:9b334a45a8ff 272
bogdanm 0:9b334a45a8ff 273 if (hex_val != NULL) {
bogdanm 0:9b334a45a8ff 274 if (((dec_val & MASK_12_15_POS) >= (0x0A << SHIFT_3_HBYTE)) ||
bogdanm 0:9b334a45a8ff 275 ((dec_val & MASK_08_11_POS) >= (0x0A << SHIFT_2_HBYTE)) ||
bogdanm 0:9b334a45a8ff 276 ((dec_val & MASK_04_07_POS) >= (0x0A << SHIFT_1_HBYTE)) ||
bogdanm 0:9b334a45a8ff 277 ((dec_val & MASK_00_03_POS) >= 0x0A)) {
bogdanm 0:9b334a45a8ff 278 err = 1;
bogdanm 0:9b334a45a8ff 279 *hex_val = 0;
bogdanm 0:9b334a45a8ff 280 } else {
bogdanm 0:9b334a45a8ff 281 ret_val = (((dec_val & MASK_12_15_POS)) >> SHIFT_3_HBYTE) * 1000 +
bogdanm 0:9b334a45a8ff 282 (((dec_val & MASK_08_11_POS)) >> SHIFT_2_HBYTE) * 100 +
bogdanm 0:9b334a45a8ff 283 (((dec_val & MASK_04_07_POS)) >> SHIFT_1_HBYTE) * 10 +
bogdanm 0:9b334a45a8ff 284 (dec_val & MASK_00_03_POS);
bogdanm 0:9b334a45a8ff 285 if (ret_val < offset) {
bogdanm 0:9b334a45a8ff 286 err = 1;
bogdanm 0:9b334a45a8ff 287 } else {
bogdanm 0:9b334a45a8ff 288 *hex_val = ret_val - offset;
bogdanm 0:9b334a45a8ff 289 }
bogdanm 0:9b334a45a8ff 290 }
bogdanm 0:9b334a45a8ff 291 } else {
bogdanm 0:9b334a45a8ff 292 err = 1;
bogdanm 0:9b334a45a8ff 293 }
bogdanm 0:9b334a45a8ff 294 return err;
bogdanm 0:9b334a45a8ff 295 }
bogdanm 0:9b334a45a8ff 296
bogdanm 0:9b334a45a8ff 297 /*
bogdanm 0:9b334a45a8ff 298 * RTC write function
bogdanm 0:9b334a45a8ff 299 * [in]
bogdanm 0:9b334a45a8ff 300 * t:UNIX timestamp value
bogdanm 0:9b334a45a8ff 301 * [out]
bogdanm 0:9b334a45a8ff 302 * None.
bogdanm 0:9b334a45a8ff 303 */
bogdanm 0:9b334a45a8ff 304 void rtc_write(time_t t) {
bogdanm 0:9b334a45a8ff 305
bogdanm 0:9b334a45a8ff 306 struct tm *timeinfo = localtime(&t);
bogdanm 0:9b334a45a8ff 307 volatile uint16_t dummy_read;
bogdanm 0:9b334a45a8ff 308
bogdanm 0:9b334a45a8ff 309 if (rtc_isenabled() != 0) {
bogdanm 0:9b334a45a8ff 310 RTC.RCR2 = RCR2_VAL_ALLSTOP;
bogdanm 0:9b334a45a8ff 311 dummy_read = (uint16_t)RTC.RCR2;
bogdanm 0:9b334a45a8ff 312 dummy_read = (uint16_t)RTC.RCR2;
bogdanm 0:9b334a45a8ff 313 RTC.RCR2 = RCR2_VAL_RESET; // RESET = 1
bogdanm 0:9b334a45a8ff 314 dummy_read = (uint16_t)RTC.RCR2;
bogdanm 0:9b334a45a8ff 315 dummy_read = (uint16_t)RTC.RCR2;
bogdanm 0:9b334a45a8ff 316
bogdanm 0:9b334a45a8ff 317 RTC.RSECCNT = rtc_hex8_to_dec(timeinfo->tm_sec);
bogdanm 0:9b334a45a8ff 318 RTC.RMINCNT = rtc_hex8_to_dec(timeinfo->tm_min);
bogdanm 0:9b334a45a8ff 319 RTC.RHRCNT = rtc_hex8_to_dec(timeinfo->tm_hour);
bogdanm 0:9b334a45a8ff 320 RTC.RDAYCNT = rtc_hex8_to_dec(timeinfo->tm_mday);
bogdanm 0:9b334a45a8ff 321 RTC.RMONCNT = rtc_hex8_to_dec(timeinfo->tm_mon + 1);
bogdanm 0:9b334a45a8ff 322 RTC.RYRCNT = rtc_hex16_to_dec(timeinfo->tm_year + 1900);
bogdanm 0:9b334a45a8ff 323 dummy_read = (uint16_t)RTC.RYRCNT;
bogdanm 0:9b334a45a8ff 324 dummy_read = (uint16_t)RTC.RYRCNT;
bogdanm 0:9b334a45a8ff 325
bogdanm 0:9b334a45a8ff 326 RTC.RCR2 = RCR2_VAL_START; // START = 1
bogdanm 0:9b334a45a8ff 327
bogdanm 0:9b334a45a8ff 328 dummy_read = (uint16_t)RTC.RCR2;
bogdanm 0:9b334a45a8ff 329 dummy_read = (uint16_t)RTC.RCR2;
bogdanm 0:9b334a45a8ff 330 }
bogdanm 0:9b334a45a8ff 331 }
bogdanm 0:9b334a45a8ff 332
bogdanm 0:9b334a45a8ff 333 /*
bogdanm 0:9b334a45a8ff 334 * HEX to Dec(8bit) function for RTC.
bogdanm 0:9b334a45a8ff 335 * [in]
bogdanm 0:9b334a45a8ff 336 * hex_val:Hexadecimal value.
bogdanm 0:9b334a45a8ff 337 * [out]
bogdanm 0:9b334a45a8ff 338 * decimal value:From 0x00 to 0x99.
bogdanm 0:9b334a45a8ff 339 */
bogdanm 0:9b334a45a8ff 340 static uint8_t rtc_hex8_to_dec(uint8_t hex_val) {
bogdanm 0:9b334a45a8ff 341 uint32_t calc_data;
bogdanm 0:9b334a45a8ff 342
bogdanm 0:9b334a45a8ff 343 calc_data = hex_val / 10 * 0x10;
bogdanm 0:9b334a45a8ff 344 calc_data += hex_val % 10;
bogdanm 0:9b334a45a8ff 345
bogdanm 0:9b334a45a8ff 346 if (calc_data > 0x99) {
bogdanm 0:9b334a45a8ff 347 calc_data = 0;
bogdanm 0:9b334a45a8ff 348 }
bogdanm 0:9b334a45a8ff 349
bogdanm 0:9b334a45a8ff 350 return (uint8_t)calc_data;
bogdanm 0:9b334a45a8ff 351 }
bogdanm 0:9b334a45a8ff 352
bogdanm 0:9b334a45a8ff 353 /*
bogdanm 0:9b334a45a8ff 354 * HEX to Dec(16bit) function for RTC.
bogdanm 0:9b334a45a8ff 355 * [in]
bogdanm 0:9b334a45a8ff 356 * hex_val:Hexadecimal value.
bogdanm 0:9b334a45a8ff 357 * [out]
bogdanm 0:9b334a45a8ff 358 * decimal value:From 0x0000 to 0x9999.
bogdanm 0:9b334a45a8ff 359 */
bogdanm 0:9b334a45a8ff 360 static uint16_t rtc_hex16_to_dec(uint16_t hex_val) {
bogdanm 0:9b334a45a8ff 361 uint32_t calc_data;
bogdanm 0:9b334a45a8ff 362 calc_data = hex_val / 1000 * 0x1000;
bogdanm 0:9b334a45a8ff 363 calc_data += ((hex_val / 100) % 10) * 0x100;
bogdanm 0:9b334a45a8ff 364 calc_data += ((hex_val / 10) % 10) * 0x10;
bogdanm 0:9b334a45a8ff 365 calc_data += hex_val % 10;
bogdanm 0:9b334a45a8ff 366
bogdanm 0:9b334a45a8ff 367 if (calc_data > 0x9999) {
bogdanm 0:9b334a45a8ff 368 calc_data = 0;
bogdanm 0:9b334a45a8ff 369 }
bogdanm 0:9b334a45a8ff 370 return (uint16_t)calc_data;
bogdanm 0:9b334a45a8ff 371
bogdanm 0:9b334a45a8ff 372 }
bogdanm 0:9b334a45a8ff 373
bogdanm 0:9b334a45a8ff 374 #endif /* DEVICE_RTC */