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