added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
119:3921aeca8633
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

Who changed what in which revision?

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