t

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Oct 28 11:17:30 2016 +0100
Revision:
149:156823d33999
Parent:
targets/hal/TARGET_Atmel/TARGET_SAM_CortexM4/drivers/rtc/rtc.c@107:414e9c822e99
This updates the lib to the mbed lib v128

NOTE: This release includes a restructuring of the file and directory locations and thus some
include paths in your code may need updating accordingly.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 107:414e9c822e99 1 /**
mbed_official 107:414e9c822e99 2 * \file
mbed_official 107:414e9c822e99 3 *
mbed_official 107:414e9c822e99 4 * \brief Real-Time Clock (RTC) driver for SAM.
mbed_official 107:414e9c822e99 5 *
mbed_official 107:414e9c822e99 6 * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved.
mbed_official 107:414e9c822e99 7 *
mbed_official 107:414e9c822e99 8 * \asf_license_start
mbed_official 107:414e9c822e99 9 *
mbed_official 107:414e9c822e99 10 * \page License
mbed_official 107:414e9c822e99 11 *
mbed_official 107:414e9c822e99 12 * Redistribution and use in source and binary forms, with or without
mbed_official 107:414e9c822e99 13 * modification, are permitted provided that the following conditions are met:
mbed_official 107:414e9c822e99 14 *
mbed_official 107:414e9c822e99 15 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 107:414e9c822e99 16 * this list of conditions and the following disclaimer.
mbed_official 107:414e9c822e99 17 *
mbed_official 107:414e9c822e99 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 107:414e9c822e99 19 * this list of conditions and the following disclaimer in the documentation
mbed_official 107:414e9c822e99 20 * and/or other materials provided with the distribution.
mbed_official 107:414e9c822e99 21 *
mbed_official 107:414e9c822e99 22 * 3. The name of Atmel may not be used to endorse or promote products derived
mbed_official 107:414e9c822e99 23 * from this software without specific prior written permission.
mbed_official 107:414e9c822e99 24 *
mbed_official 107:414e9c822e99 25 * 4. This software may only be redistributed and used in connection with an
mbed_official 107:414e9c822e99 26 * Atmel microcontroller product.
mbed_official 107:414e9c822e99 27 *
mbed_official 107:414e9c822e99 28 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
mbed_official 107:414e9c822e99 29 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
mbed_official 107:414e9c822e99 30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
mbed_official 107:414e9c822e99 31 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
mbed_official 107:414e9c822e99 32 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 107:414e9c822e99 33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
mbed_official 107:414e9c822e99 34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
mbed_official 107:414e9c822e99 35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
mbed_official 107:414e9c822e99 36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
mbed_official 107:414e9c822e99 37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
mbed_official 107:414e9c822e99 38 * POSSIBILITY OF SUCH DAMAGE.
mbed_official 107:414e9c822e99 39 *
mbed_official 107:414e9c822e99 40 * \asf_license_stop
mbed_official 107:414e9c822e99 41 *
mbed_official 107:414e9c822e99 42 */
mbed_official 107:414e9c822e99 43 /*
mbed_official 107:414e9c822e99 44 * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
mbed_official 107:414e9c822e99 45 */
mbed_official 107:414e9c822e99 46
mbed_official 107:414e9c822e99 47 #include "rtc.h"
mbed_official 107:414e9c822e99 48
mbed_official 107:414e9c822e99 49 /// @cond 0
mbed_official 107:414e9c822e99 50 /**INDENT-OFF**/
mbed_official 107:414e9c822e99 51 #ifdef __cplusplus
mbed_official 107:414e9c822e99 52 extern "C" {
mbed_official 107:414e9c822e99 53 #endif
mbed_official 107:414e9c822e99 54 /**INDENT-ON**/
mbed_official 107:414e9c822e99 55 /// @endcond
mbed_official 107:414e9c822e99 56
mbed_official 107:414e9c822e99 57 /**
mbed_official 107:414e9c822e99 58 * \defgroup sam_drivers_rtc_group Real-Time Clock (RTC)
mbed_official 107:414e9c822e99 59 *
mbed_official 107:414e9c822e99 60 * See \ref sam_rtc_quickstart.
mbed_official 107:414e9c822e99 61 *
mbed_official 107:414e9c822e99 62 * The RTC provides a full binary-coded decimal (BCD) clock that includes
mbed_official 107:414e9c822e99 63 * century (19/20), year (with leap years), month, date, day, hour, minute
mbed_official 107:414e9c822e99 64 * and second.
mbed_official 107:414e9c822e99 65 *
mbed_official 107:414e9c822e99 66 * @{
mbed_official 107:414e9c822e99 67 */
mbed_official 107:414e9c822e99 68
mbed_official 107:414e9c822e99 69 /* RTC Write Protect Key "RTC" in ASCII */
mbed_official 107:414e9c822e99 70 #define RTC_WP_KEY (0x525443)
mbed_official 107:414e9c822e99 71
mbed_official 107:414e9c822e99 72 /* The BCD code shift value */
mbed_official 107:414e9c822e99 73 #define BCD_SHIFT 4
mbed_official 107:414e9c822e99 74
mbed_official 107:414e9c822e99 75 /* The BCD code mask value */
mbed_official 107:414e9c822e99 76 #define BCD_MASK 0xfu
mbed_official 107:414e9c822e99 77
mbed_official 107:414e9c822e99 78 /* The BCD mul/div factor value */
mbed_official 107:414e9c822e99 79 #define BCD_FACTOR 10
mbed_official 107:414e9c822e99 80
mbed_official 107:414e9c822e99 81 /**
mbed_official 107:414e9c822e99 82 * \brief Set the RTC hour mode.
mbed_official 107:414e9c822e99 83 *
mbed_official 107:414e9c822e99 84 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 85 * \param ul_mode 1 for 12-hour mode, 0 for 24-hour mode.
mbed_official 107:414e9c822e99 86 */
mbed_official 107:414e9c822e99 87 void rtc_set_hour_mode(Rtc *p_rtc, uint32_t ul_mode)
mbed_official 107:414e9c822e99 88 {
mbed_official 107:414e9c822e99 89 if (ul_mode) {
mbed_official 107:414e9c822e99 90 p_rtc->RTC_MR |= RTC_MR_HRMOD;
mbed_official 107:414e9c822e99 91 } else {
mbed_official 107:414e9c822e99 92 p_rtc->RTC_MR &= (~RTC_MR_HRMOD);
mbed_official 107:414e9c822e99 93 }
mbed_official 107:414e9c822e99 94 }
mbed_official 107:414e9c822e99 95
mbed_official 107:414e9c822e99 96 /**
mbed_official 107:414e9c822e99 97 * \brief Get the RTC hour mode.
mbed_official 107:414e9c822e99 98 *
mbed_official 107:414e9c822e99 99 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 100 *
mbed_official 107:414e9c822e99 101 * \return 1 for 12-hour mode, 0 for 24-hour mode.
mbed_official 107:414e9c822e99 102 */
mbed_official 107:414e9c822e99 103 uint32_t rtc_get_hour_mode(Rtc *p_rtc)
mbed_official 107:414e9c822e99 104 {
mbed_official 107:414e9c822e99 105 uint32_t ul_temp = p_rtc->RTC_MR;
mbed_official 107:414e9c822e99 106
mbed_official 107:414e9c822e99 107 if (ul_temp & RTC_MR_HRMOD) {
mbed_official 107:414e9c822e99 108 return 1;
mbed_official 107:414e9c822e99 109 } else {
mbed_official 107:414e9c822e99 110 return 0;
mbed_official 107:414e9c822e99 111 }
mbed_official 107:414e9c822e99 112 }
mbed_official 107:414e9c822e99 113
mbed_official 107:414e9c822e99 114 /**
mbed_official 107:414e9c822e99 115 * \brief Enable RTC interrupts.
mbed_official 107:414e9c822e99 116 *
mbed_official 107:414e9c822e99 117 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 118 * \param ul_sources Interrupts to be enabled.
mbed_official 107:414e9c822e99 119 */
mbed_official 107:414e9c822e99 120 void rtc_enable_interrupt(Rtc *p_rtc, uint32_t ul_sources)
mbed_official 107:414e9c822e99 121 {
mbed_official 107:414e9c822e99 122 p_rtc->RTC_IER = ul_sources;
mbed_official 107:414e9c822e99 123 }
mbed_official 107:414e9c822e99 124
mbed_official 107:414e9c822e99 125 /**
mbed_official 107:414e9c822e99 126 * \brief Disable RTC interrupts.
mbed_official 107:414e9c822e99 127 *
mbed_official 107:414e9c822e99 128 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 129 * \param ul_sources Interrupts to be disabled.
mbed_official 107:414e9c822e99 130 */
mbed_official 107:414e9c822e99 131 void rtc_disable_interrupt(Rtc *p_rtc, uint32_t ul_sources)
mbed_official 107:414e9c822e99 132 {
mbed_official 107:414e9c822e99 133 p_rtc->RTC_IDR = ul_sources;
mbed_official 107:414e9c822e99 134 }
mbed_official 107:414e9c822e99 135
mbed_official 107:414e9c822e99 136 /**
mbed_official 107:414e9c822e99 137 * \brief Read RTC interrupt mask.
mbed_official 107:414e9c822e99 138 *
mbed_official 107:414e9c822e99 139 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 140 *
mbed_official 107:414e9c822e99 141 * \return The interrupt mask value.
mbed_official 107:414e9c822e99 142 */
mbed_official 107:414e9c822e99 143 uint32_t rtc_get_interrupt_mask(Rtc *p_rtc)
mbed_official 107:414e9c822e99 144 {
mbed_official 107:414e9c822e99 145 return p_rtc->RTC_IMR;
mbed_official 107:414e9c822e99 146 }
mbed_official 107:414e9c822e99 147
mbed_official 107:414e9c822e99 148 /**
mbed_official 107:414e9c822e99 149 * \brief Get the RTC time value.
mbed_official 107:414e9c822e99 150 *
mbed_official 107:414e9c822e99 151 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 152 * \param pul_hour Current hour, 24-hour mode.
mbed_official 107:414e9c822e99 153 * \param pul_minute Current minute.
mbed_official 107:414e9c822e99 154 * \param pul_second Current second.
mbed_official 107:414e9c822e99 155 */
mbed_official 107:414e9c822e99 156 void rtc_get_time(Rtc *p_rtc, uint32_t *pul_hour, uint32_t *pul_minute,
mbed_official 107:414e9c822e99 157 uint32_t *pul_second)
mbed_official 107:414e9c822e99 158 {
mbed_official 107:414e9c822e99 159 uint32_t ul_time;
mbed_official 107:414e9c822e99 160 uint32_t ul_temp;
mbed_official 107:414e9c822e99 161
mbed_official 107:414e9c822e99 162 /* Get the current RTC time (multiple reads are necessary to insure a stable value). */
mbed_official 107:414e9c822e99 163 ul_time = p_rtc->RTC_TIMR;
mbed_official 107:414e9c822e99 164 while (ul_time != p_rtc->RTC_TIMR) {
mbed_official 107:414e9c822e99 165 ul_time = p_rtc->RTC_TIMR;
mbed_official 107:414e9c822e99 166 }
mbed_official 107:414e9c822e99 167
mbed_official 107:414e9c822e99 168 /* Hour */
mbed_official 107:414e9c822e99 169 if (pul_hour) {
mbed_official 107:414e9c822e99 170 ul_temp = (ul_time & RTC_TIMR_HOUR_Msk) >> RTC_TIMR_HOUR_Pos;
mbed_official 107:414e9c822e99 171 *pul_hour = (ul_temp >> BCD_SHIFT) * BCD_FACTOR + (ul_temp & BCD_MASK);
mbed_official 107:414e9c822e99 172
mbed_official 107:414e9c822e99 173 if ((ul_time & RTC_TIMR_AMPM) == RTC_TIMR_AMPM) {
mbed_official 107:414e9c822e99 174 *pul_hour += 12;
mbed_official 107:414e9c822e99 175 }
mbed_official 107:414e9c822e99 176 }
mbed_official 107:414e9c822e99 177
mbed_official 107:414e9c822e99 178 /* Minute */
mbed_official 107:414e9c822e99 179 if (pul_minute) {
mbed_official 107:414e9c822e99 180 ul_temp = (ul_time & RTC_TIMR_MIN_Msk) >> RTC_TIMR_MIN_Pos;
mbed_official 107:414e9c822e99 181 *pul_minute = (ul_temp >> BCD_SHIFT) * BCD_FACTOR + (ul_temp & BCD_MASK);
mbed_official 107:414e9c822e99 182 }
mbed_official 107:414e9c822e99 183
mbed_official 107:414e9c822e99 184 /* Second */
mbed_official 107:414e9c822e99 185 if (pul_second) {
mbed_official 107:414e9c822e99 186 ul_temp = (ul_time & RTC_TIMR_SEC_Msk) >> RTC_TIMR_SEC_Pos;
mbed_official 107:414e9c822e99 187 *pul_second = (ul_temp >> BCD_SHIFT) * BCD_FACTOR + (ul_temp & BCD_MASK);
mbed_official 107:414e9c822e99 188 }
mbed_official 107:414e9c822e99 189 }
mbed_official 107:414e9c822e99 190
mbed_official 107:414e9c822e99 191 /**
mbed_official 107:414e9c822e99 192 * \brief Set the RTC time value.
mbed_official 107:414e9c822e99 193 *
mbed_official 107:414e9c822e99 194 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 195 * \param ul_hour Current hour, 24-hour mode.
mbed_official 107:414e9c822e99 196 * \param ul_minute Current minute.
mbed_official 107:414e9c822e99 197 * \param ul_second Current second.
mbed_official 107:414e9c822e99 198 *
mbed_official 107:414e9c822e99 199 * \return 0 for OK, else invalid setting.
mbed_official 107:414e9c822e99 200 */
mbed_official 107:414e9c822e99 201 uint32_t rtc_set_time(Rtc *p_rtc, uint32_t ul_hour, uint32_t ul_minute,
mbed_official 107:414e9c822e99 202 uint32_t ul_second)
mbed_official 107:414e9c822e99 203 {
mbed_official 107:414e9c822e99 204 uint32_t ul_time = 0;
mbed_official 107:414e9c822e99 205
mbed_official 107:414e9c822e99 206 /* If 12-hour mode, set AMPM bit */
mbed_official 107:414e9c822e99 207 if ((p_rtc->RTC_MR & RTC_MR_HRMOD) == RTC_MR_HRMOD) {
mbed_official 107:414e9c822e99 208 if (ul_hour > 12) {
mbed_official 107:414e9c822e99 209 ul_hour -= 12;
mbed_official 107:414e9c822e99 210 ul_time |= RTC_TIMR_AMPM;
mbed_official 107:414e9c822e99 211 }
mbed_official 107:414e9c822e99 212 }
mbed_official 107:414e9c822e99 213
mbed_official 107:414e9c822e99 214 /* Hour */
mbed_official 107:414e9c822e99 215 ul_time |= ((ul_hour / BCD_FACTOR) << (RTC_TIMR_HOUR_Pos + BCD_SHIFT)) |
mbed_official 107:414e9c822e99 216 ((ul_hour % BCD_FACTOR) << RTC_TIMR_HOUR_Pos);
mbed_official 107:414e9c822e99 217
mbed_official 107:414e9c822e99 218 /* Minute */
mbed_official 107:414e9c822e99 219 ul_time |= ((ul_minute / BCD_FACTOR) << (RTC_TIMR_MIN_Pos + BCD_SHIFT)) |
mbed_official 107:414e9c822e99 220 ((ul_minute % BCD_FACTOR) << RTC_TIMR_MIN_Pos);
mbed_official 107:414e9c822e99 221
mbed_official 107:414e9c822e99 222 /* Second */
mbed_official 107:414e9c822e99 223 ul_time |= ((ul_second / BCD_FACTOR) << (RTC_TIMR_SEC_Pos + BCD_SHIFT)) |
mbed_official 107:414e9c822e99 224 ((ul_second % BCD_FACTOR) << RTC_TIMR_SEC_Pos);
mbed_official 107:414e9c822e99 225
mbed_official 107:414e9c822e99 226 /* Update time register. Check the spec for the flow. */
mbed_official 107:414e9c822e99 227 p_rtc->RTC_CR |= RTC_CR_UPDTIM;
mbed_official 107:414e9c822e99 228 while ((p_rtc->RTC_SR & RTC_SR_ACKUPD) != RTC_SR_ACKUPD);
mbed_official 107:414e9c822e99 229 p_rtc->RTC_SCCR = RTC_SCCR_ACKCLR;
mbed_official 107:414e9c822e99 230 p_rtc->RTC_TIMR = ul_time;
mbed_official 107:414e9c822e99 231 p_rtc->RTC_CR &= (~RTC_CR_UPDTIM);
mbed_official 107:414e9c822e99 232 p_rtc->RTC_SCCR |= RTC_SCCR_SECCLR;
mbed_official 107:414e9c822e99 233
mbed_official 107:414e9c822e99 234 return (p_rtc->RTC_VER & RTC_VER_NVTIM);
mbed_official 107:414e9c822e99 235 }
mbed_official 107:414e9c822e99 236
mbed_official 107:414e9c822e99 237 /**
mbed_official 107:414e9c822e99 238 * \brief Set the RTC alarm time value.
mbed_official 107:414e9c822e99 239 *
mbed_official 107:414e9c822e99 240 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 241 * \param ul_hour_flag 1 for setting, 0 for not setting.
mbed_official 107:414e9c822e99 242 * \param ul_hour Alarm hour value, 24-hour mode.
mbed_official 107:414e9c822e99 243 * \param ul_minute_flag 1 for setting, 0 for not setting.
mbed_official 107:414e9c822e99 244 * \param ul_minute Alarm minute value.
mbed_official 107:414e9c822e99 245 * \param ul_second_flag 1 for setting, 0 for not setting.
mbed_official 107:414e9c822e99 246 * \param ul_second Alarm second value.
mbed_official 107:414e9c822e99 247 *
mbed_official 107:414e9c822e99 248 * \return 0 for OK, else invalid setting.
mbed_official 107:414e9c822e99 249 */
mbed_official 107:414e9c822e99 250 uint32_t rtc_set_time_alarm(Rtc *p_rtc,
mbed_official 107:414e9c822e99 251 uint32_t ul_hour_flag, uint32_t ul_hour,
mbed_official 107:414e9c822e99 252 uint32_t ul_minute_flag, uint32_t ul_minute,
mbed_official 107:414e9c822e99 253 uint32_t ul_second_flag, uint32_t ul_second)
mbed_official 107:414e9c822e99 254 {
mbed_official 107:414e9c822e99 255 uint32_t ul_alarm = 0;
mbed_official 107:414e9c822e99 256
mbed_official 107:414e9c822e99 257 /* Hour alarm setting */
mbed_official 107:414e9c822e99 258 if (ul_hour_flag) {
mbed_official 107:414e9c822e99 259 /* If 12-hour mode, set AMPM bit */
mbed_official 107:414e9c822e99 260 if ((p_rtc->RTC_MR & RTC_MR_HRMOD) == RTC_MR_HRMOD) {
mbed_official 107:414e9c822e99 261 if (ul_hour > 12) {
mbed_official 107:414e9c822e99 262 ul_hour -= 12;
mbed_official 107:414e9c822e99 263 ul_alarm |= RTC_TIMR_AMPM;
mbed_official 107:414e9c822e99 264 }
mbed_official 107:414e9c822e99 265 }
mbed_official 107:414e9c822e99 266
mbed_official 107:414e9c822e99 267 ul_alarm |= ((ul_hour / BCD_FACTOR) << (RTC_TIMR_HOUR_Pos + BCD_SHIFT)) |
mbed_official 107:414e9c822e99 268 ((ul_hour % BCD_FACTOR) << RTC_TIMR_HOUR_Pos);
mbed_official 107:414e9c822e99 269 }
mbed_official 107:414e9c822e99 270
mbed_official 107:414e9c822e99 271 /* Minute alarm setting */
mbed_official 107:414e9c822e99 272 if (ul_minute_flag) {
mbed_official 107:414e9c822e99 273 ul_alarm |= ((ul_minute / BCD_FACTOR) << (RTC_TIMR_MIN_Pos + BCD_SHIFT)) |
mbed_official 107:414e9c822e99 274 ((ul_minute % BCD_FACTOR) << RTC_TIMR_MIN_Pos);
mbed_official 107:414e9c822e99 275 }
mbed_official 107:414e9c822e99 276
mbed_official 107:414e9c822e99 277 /* Second alarm setting */
mbed_official 107:414e9c822e99 278 if (ul_second_flag) {
mbed_official 107:414e9c822e99 279 ul_alarm |= ((ul_second / BCD_FACTOR) << (RTC_TIMR_SEC_Pos + BCD_SHIFT)) |
mbed_official 107:414e9c822e99 280 ((ul_second % BCD_FACTOR) << RTC_TIMR_SEC_Pos);
mbed_official 107:414e9c822e99 281 }
mbed_official 107:414e9c822e99 282
mbed_official 107:414e9c822e99 283 p_rtc->RTC_TIMALR &= ~(RTC_TIMALR_SECEN | RTC_TIMALR_MINEN | RTC_TIMALR_HOUREN);
mbed_official 107:414e9c822e99 284 p_rtc->RTC_TIMALR = ul_alarm;
mbed_official 107:414e9c822e99 285 p_rtc->RTC_TIMALR |= (RTC_TIMALR_SECEN | RTC_TIMALR_MINEN | RTC_TIMALR_HOUREN);
mbed_official 107:414e9c822e99 286
mbed_official 107:414e9c822e99 287 return (p_rtc->RTC_VER & RTC_VER_NVTIMALR);
mbed_official 107:414e9c822e99 288 }
mbed_official 107:414e9c822e99 289
mbed_official 107:414e9c822e99 290 /**
mbed_official 107:414e9c822e99 291 * \brief Get the RTC date value.
mbed_official 107:414e9c822e99 292 *
mbed_official 107:414e9c822e99 293 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 294 * \param pul_year Current year.
mbed_official 107:414e9c822e99 295 * \param pul_month Current month.
mbed_official 107:414e9c822e99 296 * \param pul_day Current day.
mbed_official 107:414e9c822e99 297 * \param pul_week Current day in current week.
mbed_official 107:414e9c822e99 298 */
mbed_official 107:414e9c822e99 299 void rtc_get_date(Rtc *p_rtc, uint32_t *pul_year, uint32_t *pul_month,
mbed_official 107:414e9c822e99 300 uint32_t *pul_day, uint32_t *pul_week)
mbed_official 107:414e9c822e99 301 {
mbed_official 107:414e9c822e99 302 uint32_t ul_date;
mbed_official 107:414e9c822e99 303 uint32_t ul_cent;
mbed_official 107:414e9c822e99 304 uint32_t ul_temp;
mbed_official 107:414e9c822e99 305
mbed_official 107:414e9c822e99 306 /* Get the current date (multiple reads are necessary to insure a stable value). */
mbed_official 107:414e9c822e99 307 ul_date = p_rtc->RTC_CALR;
mbed_official 107:414e9c822e99 308 while (ul_date != p_rtc->RTC_CALR) {
mbed_official 107:414e9c822e99 309 ul_date = p_rtc->RTC_CALR;
mbed_official 107:414e9c822e99 310 }
mbed_official 107:414e9c822e99 311
mbed_official 107:414e9c822e99 312 /* Retrieve year */
mbed_official 107:414e9c822e99 313 if (pul_year) {
mbed_official 107:414e9c822e99 314 ul_temp = (ul_date & RTC_CALR_CENT_Msk) >> RTC_CALR_CENT_Pos;
mbed_official 107:414e9c822e99 315 ul_cent = (ul_temp >> BCD_SHIFT) * BCD_FACTOR + (ul_temp & BCD_MASK);
mbed_official 107:414e9c822e99 316 ul_temp = (ul_date & RTC_CALR_YEAR_Msk) >> RTC_CALR_YEAR_Pos;
mbed_official 107:414e9c822e99 317 *pul_year = (ul_cent * BCD_FACTOR * BCD_FACTOR) +
mbed_official 107:414e9c822e99 318 (ul_temp >> BCD_SHIFT) * BCD_FACTOR + (ul_temp & BCD_MASK);
mbed_official 107:414e9c822e99 319 }
mbed_official 107:414e9c822e99 320
mbed_official 107:414e9c822e99 321 /* Retrieve month */
mbed_official 107:414e9c822e99 322 if (pul_month) {
mbed_official 107:414e9c822e99 323 ul_temp = (ul_date & RTC_CALR_MONTH_Msk) >> RTC_CALR_MONTH_Pos;
mbed_official 107:414e9c822e99 324 *pul_month = (ul_temp >> BCD_SHIFT) * BCD_FACTOR + (ul_temp & BCD_MASK);
mbed_official 107:414e9c822e99 325 }
mbed_official 107:414e9c822e99 326
mbed_official 107:414e9c822e99 327 /* Retrieve day */
mbed_official 107:414e9c822e99 328 if (pul_day) {
mbed_official 107:414e9c822e99 329 ul_temp = (ul_date & RTC_CALR_DATE_Msk) >> RTC_CALR_DATE_Pos;
mbed_official 107:414e9c822e99 330 *pul_day = (ul_temp >> BCD_SHIFT) * BCD_FACTOR + (ul_temp & BCD_MASK);
mbed_official 107:414e9c822e99 331 }
mbed_official 107:414e9c822e99 332
mbed_official 107:414e9c822e99 333 /* Retrieve week */
mbed_official 107:414e9c822e99 334 if (pul_week) {
mbed_official 107:414e9c822e99 335 *pul_week = ((ul_date & RTC_CALR_DAY_Msk) >> RTC_CALR_DAY_Pos);
mbed_official 107:414e9c822e99 336 }
mbed_official 107:414e9c822e99 337 }
mbed_official 107:414e9c822e99 338
mbed_official 107:414e9c822e99 339 /**
mbed_official 107:414e9c822e99 340 * \brief Set the RTC date.
mbed_official 107:414e9c822e99 341 *
mbed_official 107:414e9c822e99 342 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 343 * \param ul_year Current year.
mbed_official 107:414e9c822e99 344 * \param ul_month Current month.
mbed_official 107:414e9c822e99 345 * \param ul_day Current day.
mbed_official 107:414e9c822e99 346 * \param ul_week Current day in current week.
mbed_official 107:414e9c822e99 347 *
mbed_official 107:414e9c822e99 348 * \return 0 for OK, else invalid setting.
mbed_official 107:414e9c822e99 349 */
mbed_official 107:414e9c822e99 350 uint32_t rtc_set_date(Rtc *p_rtc, uint32_t ul_year, uint32_t ul_month,
mbed_official 107:414e9c822e99 351 uint32_t ul_day, uint32_t ul_week)
mbed_official 107:414e9c822e99 352 {
mbed_official 107:414e9c822e99 353 uint32_t ul_date = 0;
mbed_official 107:414e9c822e99 354
mbed_official 107:414e9c822e99 355 /* Cent */
mbed_official 107:414e9c822e99 356 ul_date |= ((ul_year / BCD_FACTOR / BCD_FACTOR / BCD_FACTOR) <<
mbed_official 107:414e9c822e99 357 (RTC_CALR_CENT_Pos + BCD_SHIFT) |
mbed_official 107:414e9c822e99 358 ((ul_year / BCD_FACTOR / BCD_FACTOR) % BCD_FACTOR) << RTC_CALR_CENT_Pos);
mbed_official 107:414e9c822e99 359
mbed_official 107:414e9c822e99 360 /* Year */
mbed_official 107:414e9c822e99 361 ul_date |= (((ul_year / BCD_FACTOR) % BCD_FACTOR) <<
mbed_official 107:414e9c822e99 362 (RTC_CALR_YEAR_Pos + BCD_SHIFT)) |
mbed_official 107:414e9c822e99 363 ((ul_year % BCD_FACTOR) << RTC_CALR_YEAR_Pos);
mbed_official 107:414e9c822e99 364
mbed_official 107:414e9c822e99 365 /* Month */
mbed_official 107:414e9c822e99 366 ul_date |= ((ul_month / BCD_FACTOR) << (RTC_CALR_MONTH_Pos + BCD_SHIFT)) |
mbed_official 107:414e9c822e99 367 ((ul_month % BCD_FACTOR) << RTC_CALR_MONTH_Pos);
mbed_official 107:414e9c822e99 368
mbed_official 107:414e9c822e99 369 /* Week */
mbed_official 107:414e9c822e99 370 ul_date |= (ul_week << RTC_CALR_DAY_Pos);
mbed_official 107:414e9c822e99 371
mbed_official 107:414e9c822e99 372 /* Day */
mbed_official 107:414e9c822e99 373 ul_date |= ((ul_day / BCD_FACTOR) << (RTC_CALR_DATE_Pos + BCD_SHIFT)) |
mbed_official 107:414e9c822e99 374 ((ul_day % BCD_FACTOR) << RTC_CALR_DATE_Pos);
mbed_official 107:414e9c822e99 375
mbed_official 107:414e9c822e99 376 /* Update calendar register. Check the spec for the flow. */
mbed_official 107:414e9c822e99 377 p_rtc->RTC_CR |= RTC_CR_UPDCAL;
mbed_official 107:414e9c822e99 378 while ((p_rtc->RTC_SR & RTC_SR_ACKUPD) != RTC_SR_ACKUPD);
mbed_official 107:414e9c822e99 379
mbed_official 107:414e9c822e99 380 p_rtc->RTC_SCCR = RTC_SCCR_ACKCLR;
mbed_official 107:414e9c822e99 381 p_rtc->RTC_CALR = ul_date;
mbed_official 107:414e9c822e99 382 p_rtc->RTC_CR &= (~RTC_CR_UPDCAL);
mbed_official 107:414e9c822e99 383 /* Clear SECENV in SCCR */
mbed_official 107:414e9c822e99 384 p_rtc->RTC_SCCR |= RTC_SCCR_SECCLR;
mbed_official 107:414e9c822e99 385
mbed_official 107:414e9c822e99 386 return (p_rtc->RTC_VER & RTC_VER_NVCAL);
mbed_official 107:414e9c822e99 387 }
mbed_official 107:414e9c822e99 388
mbed_official 107:414e9c822e99 389 /**
mbed_official 107:414e9c822e99 390 * \brief Set the RTC alarm date value.
mbed_official 107:414e9c822e99 391 *
mbed_official 107:414e9c822e99 392 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 393 * \param ul_month_flag 1 for setting, 0 for not setting.
mbed_official 107:414e9c822e99 394 * \param ul_month Alarm month value.
mbed_official 107:414e9c822e99 395 * \param ul_day_flag 1 for setting, 0 for not setting.
mbed_official 107:414e9c822e99 396 * \param ul_day Alarm day value.
mbed_official 107:414e9c822e99 397 *
mbed_official 107:414e9c822e99 398 * \return 0 for OK, else invalid setting.
mbed_official 107:414e9c822e99 399 */
mbed_official 107:414e9c822e99 400 uint32_t rtc_set_date_alarm(Rtc *p_rtc,
mbed_official 107:414e9c822e99 401 uint32_t ul_month_flag, uint32_t ul_month,
mbed_official 107:414e9c822e99 402 uint32_t ul_day_flag, uint32_t ul_day)
mbed_official 107:414e9c822e99 403 {
mbed_official 107:414e9c822e99 404 uint32_t ul_alarm = 0;
mbed_official 107:414e9c822e99 405
mbed_official 107:414e9c822e99 406 /* Month alarm setting */
mbed_official 107:414e9c822e99 407 if (ul_month_flag) {
mbed_official 107:414e9c822e99 408 ul_alarm |= ((ul_month / BCD_FACTOR) << (RTC_CALR_MONTH_Pos + BCD_SHIFT)) |
mbed_official 107:414e9c822e99 409 ((ul_month % BCD_FACTOR) << RTC_CALR_MONTH_Pos);
mbed_official 107:414e9c822e99 410 }
mbed_official 107:414e9c822e99 411
mbed_official 107:414e9c822e99 412 /* Day alarm setting */
mbed_official 107:414e9c822e99 413 if (ul_day_flag) {
mbed_official 107:414e9c822e99 414 ul_alarm |= ((ul_day / BCD_FACTOR) << (RTC_CALR_DATE_Pos + BCD_SHIFT)) |
mbed_official 107:414e9c822e99 415 ((ul_day % BCD_FACTOR) << RTC_CALR_DATE_Pos);
mbed_official 107:414e9c822e99 416 }
mbed_official 107:414e9c822e99 417
mbed_official 107:414e9c822e99 418 /* Set alarm */
mbed_official 107:414e9c822e99 419 p_rtc->RTC_CALALR &= ~(RTC_CALALR_MTHEN | RTC_CALALR_DATEEN);
mbed_official 107:414e9c822e99 420 p_rtc->RTC_CALALR = ul_alarm;
mbed_official 107:414e9c822e99 421 p_rtc->RTC_CALALR |= (RTC_CALALR_MTHEN | RTC_CALALR_DATEEN);
mbed_official 107:414e9c822e99 422
mbed_official 107:414e9c822e99 423 return (p_rtc->RTC_VER & RTC_VER_NVCALALR);
mbed_official 107:414e9c822e99 424 }
mbed_official 107:414e9c822e99 425
mbed_official 107:414e9c822e99 426 /**
mbed_official 107:414e9c822e99 427 * \brief Clear the RTC time alarm setting.
mbed_official 107:414e9c822e99 428 *
mbed_official 107:414e9c822e99 429 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 430 */
mbed_official 107:414e9c822e99 431 void rtc_clear_time_alarm(Rtc *p_rtc)
mbed_official 107:414e9c822e99 432 {
mbed_official 107:414e9c822e99 433 p_rtc->RTC_TIMALR = 0;
mbed_official 107:414e9c822e99 434 }
mbed_official 107:414e9c822e99 435
mbed_official 107:414e9c822e99 436 /**
mbed_official 107:414e9c822e99 437 * \brief Clear the RTC date alarm setting.
mbed_official 107:414e9c822e99 438 *
mbed_official 107:414e9c822e99 439 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 440 */
mbed_official 107:414e9c822e99 441 void rtc_clear_date_alarm(Rtc *p_rtc)
mbed_official 107:414e9c822e99 442 {
mbed_official 107:414e9c822e99 443 /* Need a valid value without enabling */
mbed_official 107:414e9c822e99 444 p_rtc->RTC_CALALR = RTC_CALALR_MONTH(0x01) | RTC_CALALR_DATE(0x01);
mbed_official 107:414e9c822e99 445 }
mbed_official 107:414e9c822e99 446
mbed_official 107:414e9c822e99 447 /**
mbed_official 107:414e9c822e99 448 * \brief Get the RTC status.
mbed_official 107:414e9c822e99 449 *
mbed_official 107:414e9c822e99 450 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 451 *
mbed_official 107:414e9c822e99 452 * \return Status of the RTC.
mbed_official 107:414e9c822e99 453 */
mbed_official 107:414e9c822e99 454 uint32_t rtc_get_status(Rtc *p_rtc)
mbed_official 107:414e9c822e99 455 {
mbed_official 107:414e9c822e99 456 return (p_rtc->RTC_SR);
mbed_official 107:414e9c822e99 457 }
mbed_official 107:414e9c822e99 458
mbed_official 107:414e9c822e99 459 /**
mbed_official 107:414e9c822e99 460 * \brief Set the RTC SCCR to clear status bits.
mbed_official 107:414e9c822e99 461 *
mbed_official 107:414e9c822e99 462 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 463 * \param ul_clear Some flag bits which will be cleared.
mbed_official 107:414e9c822e99 464 */
mbed_official 107:414e9c822e99 465 void rtc_clear_status(Rtc *p_rtc, uint32_t ul_clear)
mbed_official 107:414e9c822e99 466 {
mbed_official 107:414e9c822e99 467 p_rtc->RTC_SCCR = ul_clear;
mbed_official 107:414e9c822e99 468 }
mbed_official 107:414e9c822e99 469
mbed_official 107:414e9c822e99 470 /**
mbed_official 107:414e9c822e99 471 * \brief Get the RTC valid entry.
mbed_official 107:414e9c822e99 472 *
mbed_official 107:414e9c822e99 473 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 474 *
mbed_official 107:414e9c822e99 475 * \return 0 for no invalid data, else has contained invalid data.
mbed_official 107:414e9c822e99 476 */
mbed_official 107:414e9c822e99 477 uint32_t rtc_get_valid_entry(Rtc *p_rtc)
mbed_official 107:414e9c822e99 478 {
mbed_official 107:414e9c822e99 479 return (p_rtc->RTC_VER);
mbed_official 107:414e9c822e99 480 }
mbed_official 107:414e9c822e99 481
mbed_official 107:414e9c822e99 482 /**
mbed_official 107:414e9c822e99 483 * \brief Set the RTC time event selection.
mbed_official 107:414e9c822e99 484 *
mbed_official 107:414e9c822e99 485 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 486 * \param ul_selection Time event selection to be enabled.
mbed_official 107:414e9c822e99 487 */
mbed_official 107:414e9c822e99 488 void rtc_set_time_event(Rtc *p_rtc, uint32_t ul_selection)
mbed_official 107:414e9c822e99 489 {
mbed_official 107:414e9c822e99 490 p_rtc->RTC_CR &= ~RTC_CR_TIMEVSEL_Msk;
mbed_official 107:414e9c822e99 491 p_rtc->RTC_CR |= (ul_selection << RTC_CR_TIMEVSEL_Pos) & RTC_CR_TIMEVSEL_Msk;
mbed_official 107:414e9c822e99 492 }
mbed_official 107:414e9c822e99 493
mbed_official 107:414e9c822e99 494 /**
mbed_official 107:414e9c822e99 495 * \brief Set the RTC calendar event selection.
mbed_official 107:414e9c822e99 496 *
mbed_official 107:414e9c822e99 497 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 498 * \param ul_selection Calendar event selection to be enabled..
mbed_official 107:414e9c822e99 499 */
mbed_official 107:414e9c822e99 500 void rtc_set_calendar_event(Rtc *p_rtc, uint32_t ul_selection)
mbed_official 107:414e9c822e99 501 {
mbed_official 107:414e9c822e99 502 p_rtc->RTC_CR &= ~RTC_CR_CALEVSEL_Msk;
mbed_official 107:414e9c822e99 503 p_rtc->RTC_CR |= (ul_selection << RTC_CR_CALEVSEL_Pos) & RTC_CR_CALEVSEL_Msk;
mbed_official 107:414e9c822e99 504 }
mbed_official 107:414e9c822e99 505
mbed_official 107:414e9c822e99 506 #if ((SAM3S8) || (SAM3SD8) || (SAM4S) || (SAM4N) || (SAM4C) || (SAMG) || (SAM4CP) || (SAM4CM))
mbed_official 107:414e9c822e99 507 /**
mbed_official 107:414e9c822e99 508 * \brief Set the RTC calendar mode.
mbed_official 107:414e9c822e99 509 *
mbed_official 107:414e9c822e99 510 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 511 * \param ul_mode 1 for Persian mode,0 for Gregorian mode.
mbed_official 107:414e9c822e99 512 */
mbed_official 107:414e9c822e99 513 void rtc_set_calendar_mode(Rtc *p_rtc, uint32_t ul_mode)
mbed_official 107:414e9c822e99 514 {
mbed_official 107:414e9c822e99 515 if (ul_mode) {
mbed_official 107:414e9c822e99 516 p_rtc->RTC_MR |= RTC_MR_PERSIAN;
mbed_official 107:414e9c822e99 517 } else {
mbed_official 107:414e9c822e99 518 p_rtc->RTC_MR &= (~RTC_MR_PERSIAN);
mbed_official 107:414e9c822e99 519 }
mbed_official 107:414e9c822e99 520 }
mbed_official 107:414e9c822e99 521
mbed_official 107:414e9c822e99 522 /**
mbed_official 107:414e9c822e99 523 * \brief Get the RTC calendar mode.
mbed_official 107:414e9c822e99 524 *
mbed_official 107:414e9c822e99 525 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 526 *
mbed_official 107:414e9c822e99 527 * \return 1 for Persian calendar, 0 for Gregorian calendar.
mbed_official 107:414e9c822e99 528 */
mbed_official 107:414e9c822e99 529 uint32_t rtc_get_calendar_mode(Rtc *p_rtc)
mbed_official 107:414e9c822e99 530 {
mbed_official 107:414e9c822e99 531 uint32_t ul_temp = p_rtc->RTC_MR;
mbed_official 107:414e9c822e99 532
mbed_official 107:414e9c822e99 533 if (ul_temp & RTC_MR_PERSIAN) {
mbed_official 107:414e9c822e99 534 return 1;
mbed_official 107:414e9c822e99 535 } else {
mbed_official 107:414e9c822e99 536 return 0;
mbed_official 107:414e9c822e99 537 }
mbed_official 107:414e9c822e99 538 }
mbed_official 107:414e9c822e99 539
mbed_official 107:414e9c822e99 540 /**
mbed_official 107:414e9c822e99 541 * \brief Set the RTC calibration.
mbed_official 107:414e9c822e99 542 *
mbed_official 107:414e9c822e99 543 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 544 * \param ul_direction_ppm Positive/negative correction.
mbed_official 107:414e9c822e99 545 * \param ul_correction Correction value.
mbed_official 107:414e9c822e99 546 * \param ul_range_ppm Low/high range correction.
mbed_official 107:414e9c822e99 547 */
mbed_official 107:414e9c822e99 548 void rtc_set_calibration(Rtc *p_rtc, uint32_t ul_direction_ppm,
mbed_official 107:414e9c822e99 549 uint32_t ul_correction, uint32_t ul_range_ppm)
mbed_official 107:414e9c822e99 550 {
mbed_official 107:414e9c822e99 551 uint32_t ul_temp;
mbed_official 107:414e9c822e99 552
mbed_official 107:414e9c822e99 553 ul_temp = p_rtc->RTC_MR;
mbed_official 107:414e9c822e99 554
mbed_official 107:414e9c822e99 555 if (ul_direction_ppm) {
mbed_official 107:414e9c822e99 556 ul_temp |= RTC_MR_NEGPPM;
mbed_official 107:414e9c822e99 557 } else {
mbed_official 107:414e9c822e99 558 ul_temp &= (~RTC_MR_NEGPPM);
mbed_official 107:414e9c822e99 559 }
mbed_official 107:414e9c822e99 560
mbed_official 107:414e9c822e99 561 ul_temp |= RTC_MR_CORRECTION(ul_correction);
mbed_official 107:414e9c822e99 562
mbed_official 107:414e9c822e99 563 if (ul_range_ppm) {
mbed_official 107:414e9c822e99 564 ul_temp |= RTC_MR_HIGHPPM;
mbed_official 107:414e9c822e99 565 } else {
mbed_official 107:414e9c822e99 566 ul_temp &= (~RTC_MR_HIGHPPM);
mbed_official 107:414e9c822e99 567 }
mbed_official 107:414e9c822e99 568
mbed_official 107:414e9c822e99 569 p_rtc->RTC_MR = ul_temp;
mbed_official 107:414e9c822e99 570 }
mbed_official 107:414e9c822e99 571 #endif
mbed_official 107:414e9c822e99 572
mbed_official 107:414e9c822e99 573 #if ((SAM3S8) || (SAM3SD8) || (SAM4S) || (SAM4C) || (SAMG) || (SAM4CP) || (SAM4CM) || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 574 /**
mbed_official 107:414e9c822e99 575 * \brief Set the RTC output waveform.
mbed_official 107:414e9c822e99 576 *
mbed_official 107:414e9c822e99 577 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 578 * \param ul_channel Output channel selection.
mbed_official 107:414e9c822e99 579 * \param ul_value Output source selection value.
mbed_official 107:414e9c822e99 580 */
mbed_official 107:414e9c822e99 581 void rtc_set_waveform(Rtc *p_rtc, uint32_t ul_channel, uint32_t ul_value)
mbed_official 107:414e9c822e99 582 {
mbed_official 107:414e9c822e99 583 if (ul_channel == 0) {
mbed_official 107:414e9c822e99 584 switch (ul_value) {
mbed_official 107:414e9c822e99 585 case 0:
mbed_official 107:414e9c822e99 586 p_rtc->RTC_MR &= ~RTC_MR_OUT0_Msk;
mbed_official 107:414e9c822e99 587 p_rtc->RTC_MR |= RTC_MR_OUT0_NO_WAVE;
mbed_official 107:414e9c822e99 588 break;
mbed_official 107:414e9c822e99 589
mbed_official 107:414e9c822e99 590 case 1:
mbed_official 107:414e9c822e99 591 p_rtc->RTC_MR &= ~RTC_MR_OUT0_Msk;
mbed_official 107:414e9c822e99 592 p_rtc->RTC_MR |= RTC_MR_OUT0_FREQ1HZ;
mbed_official 107:414e9c822e99 593 break;
mbed_official 107:414e9c822e99 594
mbed_official 107:414e9c822e99 595 case 2:
mbed_official 107:414e9c822e99 596 p_rtc->RTC_MR &= ~RTC_MR_OUT0_Msk;
mbed_official 107:414e9c822e99 597 p_rtc->RTC_MR |= RTC_MR_OUT0_FREQ32HZ;
mbed_official 107:414e9c822e99 598 break;
mbed_official 107:414e9c822e99 599
mbed_official 107:414e9c822e99 600 case 3:
mbed_official 107:414e9c822e99 601 p_rtc->RTC_MR &= ~RTC_MR_OUT0_Msk;
mbed_official 107:414e9c822e99 602 p_rtc->RTC_MR |= RTC_MR_OUT0_FREQ64HZ;
mbed_official 107:414e9c822e99 603 break;
mbed_official 107:414e9c822e99 604
mbed_official 107:414e9c822e99 605 case 4:
mbed_official 107:414e9c822e99 606 p_rtc->RTC_MR &= ~RTC_MR_OUT0_Msk;
mbed_official 107:414e9c822e99 607 p_rtc->RTC_MR |= RTC_MR_OUT0_FREQ512HZ;
mbed_official 107:414e9c822e99 608 break;
mbed_official 107:414e9c822e99 609
mbed_official 107:414e9c822e99 610 #if (!SAMG)
mbed_official 107:414e9c822e99 611 case 5:
mbed_official 107:414e9c822e99 612 p_rtc->RTC_MR &= ~RTC_MR_OUT0_Msk;
mbed_official 107:414e9c822e99 613 p_rtc->RTC_MR |= RTC_MR_OUT0_ALARM_TOGGLE;
mbed_official 107:414e9c822e99 614 break;
mbed_official 107:414e9c822e99 615 #endif
mbed_official 107:414e9c822e99 616
mbed_official 107:414e9c822e99 617 case 6:
mbed_official 107:414e9c822e99 618 p_rtc->RTC_MR &= ~RTC_MR_OUT0_Msk;
mbed_official 107:414e9c822e99 619 p_rtc->RTC_MR |= RTC_MR_OUT0_ALARM_FLAG;
mbed_official 107:414e9c822e99 620 break;
mbed_official 107:414e9c822e99 621
mbed_official 107:414e9c822e99 622 #if (!SAMG)
mbed_official 107:414e9c822e99 623 case 7:
mbed_official 107:414e9c822e99 624 p_rtc->RTC_MR &= ~RTC_MR_OUT0_Msk;
mbed_official 107:414e9c822e99 625 p_rtc->RTC_MR |= RTC_MR_OUT0_PROG_PULSE;
mbed_official 107:414e9c822e99 626 break;
mbed_official 107:414e9c822e99 627 #endif
mbed_official 107:414e9c822e99 628
mbed_official 107:414e9c822e99 629 default:
mbed_official 107:414e9c822e99 630 break;
mbed_official 107:414e9c822e99 631 }
mbed_official 107:414e9c822e99 632 } else {
mbed_official 107:414e9c822e99 633 #if (!SAM4C && !SAM4CP && !SAM4CM)
mbed_official 107:414e9c822e99 634 switch (ul_value) {
mbed_official 107:414e9c822e99 635 case 0:
mbed_official 107:414e9c822e99 636 p_rtc->RTC_MR &= ~RTC_MR_OUT1_Msk;
mbed_official 107:414e9c822e99 637 p_rtc->RTC_MR |= RTC_MR_OUT1_NO_WAVE;
mbed_official 107:414e9c822e99 638 break;
mbed_official 107:414e9c822e99 639
mbed_official 107:414e9c822e99 640 case 1:
mbed_official 107:414e9c822e99 641 p_rtc->RTC_MR &= ~RTC_MR_OUT1_Msk;
mbed_official 107:414e9c822e99 642 p_rtc->RTC_MR |= RTC_MR_OUT1_FREQ1HZ;
mbed_official 107:414e9c822e99 643 break;
mbed_official 107:414e9c822e99 644
mbed_official 107:414e9c822e99 645 case 2:
mbed_official 107:414e9c822e99 646 p_rtc->RTC_MR &= ~RTC_MR_OUT1_Msk;
mbed_official 107:414e9c822e99 647 p_rtc->RTC_MR |= RTC_MR_OUT1_FREQ32HZ;
mbed_official 107:414e9c822e99 648 break;
mbed_official 107:414e9c822e99 649
mbed_official 107:414e9c822e99 650 case 3:
mbed_official 107:414e9c822e99 651 p_rtc->RTC_MR &= ~RTC_MR_OUT1_Msk;
mbed_official 107:414e9c822e99 652 p_rtc->RTC_MR |= RTC_MR_OUT1_FREQ64HZ;
mbed_official 107:414e9c822e99 653 break;
mbed_official 107:414e9c822e99 654
mbed_official 107:414e9c822e99 655 case 4:
mbed_official 107:414e9c822e99 656 p_rtc->RTC_MR &= ~RTC_MR_OUT1_Msk;
mbed_official 107:414e9c822e99 657 p_rtc->RTC_MR |= RTC_MR_OUT1_FREQ512HZ;
mbed_official 107:414e9c822e99 658 break;
mbed_official 107:414e9c822e99 659
mbed_official 107:414e9c822e99 660 #if (!SAMG)
mbed_official 107:414e9c822e99 661 case 5:
mbed_official 107:414e9c822e99 662 p_rtc->RTC_MR &= ~RTC_MR_OUT1_Msk;
mbed_official 107:414e9c822e99 663 p_rtc->RTC_MR |= RTC_MR_OUT1_ALARM_TOGGLE;
mbed_official 107:414e9c822e99 664 break;
mbed_official 107:414e9c822e99 665 #endif
mbed_official 107:414e9c822e99 666
mbed_official 107:414e9c822e99 667 case 6:
mbed_official 107:414e9c822e99 668 p_rtc->RTC_MR &= ~RTC_MR_OUT1_Msk;
mbed_official 107:414e9c822e99 669 p_rtc->RTC_MR |= RTC_MR_OUT1_ALARM_FLAG;
mbed_official 107:414e9c822e99 670 break;
mbed_official 107:414e9c822e99 671
mbed_official 107:414e9c822e99 672 #if (!SAMG)
mbed_official 107:414e9c822e99 673 case 7:
mbed_official 107:414e9c822e99 674 p_rtc->RTC_MR &= ~RTC_MR_OUT1_Msk;
mbed_official 107:414e9c822e99 675 p_rtc->RTC_MR |= RTC_MR_OUT1_PROG_PULSE;
mbed_official 107:414e9c822e99 676 break;
mbed_official 107:414e9c822e99 677 #endif
mbed_official 107:414e9c822e99 678
mbed_official 107:414e9c822e99 679 default:
mbed_official 107:414e9c822e99 680 break;
mbed_official 107:414e9c822e99 681 }
mbed_official 107:414e9c822e99 682 #endif
mbed_official 107:414e9c822e99 683 }
mbed_official 107:414e9c822e99 684 }
mbed_official 107:414e9c822e99 685
mbed_official 107:414e9c822e99 686 #if ((SAM3S8) || (SAM3SD8) || (SAM4S) || (SAM4C) || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 687 /**
mbed_official 107:414e9c822e99 688 * \brief Set the pulse output waveform parameters.
mbed_official 107:414e9c822e99 689 *
mbed_official 107:414e9c822e99 690 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 691 * \param ul_time_high High duration of the output pulse.
mbed_official 107:414e9c822e99 692 * \param ul_period Period of the output pulse.
mbed_official 107:414e9c822e99 693 */
mbed_official 107:414e9c822e99 694 void rtc_set_pulse_parameter(Rtc *p_rtc, uint32_t ul_time_high,
mbed_official 107:414e9c822e99 695 uint32_t ul_period)
mbed_official 107:414e9c822e99 696 {
mbed_official 107:414e9c822e99 697 uint32_t ul_temp;
mbed_official 107:414e9c822e99 698
mbed_official 107:414e9c822e99 699 ul_temp = p_rtc->RTC_MR;
mbed_official 107:414e9c822e99 700
mbed_official 107:414e9c822e99 701 ul_temp |= (RTC_MR_THIGH_Msk & ((ul_time_high) << RTC_MR_THIGH_Pos));
mbed_official 107:414e9c822e99 702 ul_temp |= (RTC_MR_TPERIOD_Msk & ((ul_period) << RTC_MR_TPERIOD_Pos));
mbed_official 107:414e9c822e99 703
mbed_official 107:414e9c822e99 704 p_rtc->RTC_MR = ul_temp;
mbed_official 107:414e9c822e99 705 }
mbed_official 107:414e9c822e99 706 #endif
mbed_official 107:414e9c822e99 707 #endif
mbed_official 107:414e9c822e99 708
mbed_official 107:414e9c822e99 709
mbed_official 107:414e9c822e99 710 #if ((SAM3N) || (SAM3U) || (SAM3XA))
mbed_official 107:414e9c822e99 711 /**
mbed_official 107:414e9c822e99 712 * \brief Enable or disable write protection of RTC registers.
mbed_official 107:414e9c822e99 713 *
mbed_official 107:414e9c822e99 714 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 715 * \param ul_enable 1 to enable, 0 to disable.
mbed_official 107:414e9c822e99 716 */
mbed_official 107:414e9c822e99 717 void rtc_set_writeprotect(Rtc *p_rtc, uint32_t ul_enable)
mbed_official 107:414e9c822e99 718 {
mbed_official 107:414e9c822e99 719 if (ul_enable) {
mbed_official 107:414e9c822e99 720 p_rtc->RTC_WPMR = RTC_WPMR_WPKEY(RTC_WP_KEY) | RTC_WPMR_WPEN;
mbed_official 107:414e9c822e99 721 } else {
mbed_official 107:414e9c822e99 722 p_rtc->RTC_WPMR = RTC_WPMR_WPKEY(RTC_WP_KEY);
mbed_official 107:414e9c822e99 723 }
mbed_official 107:414e9c822e99 724 }
mbed_official 107:414e9c822e99 725 #endif /* ((SAM3N) || (SAM3U) || (SAM3XA)) */
mbed_official 107:414e9c822e99 726
mbed_official 107:414e9c822e99 727 #if SAM4C || SAM4CP || SAM4CM
mbed_official 107:414e9c822e99 728 /**
mbed_official 107:414e9c822e99 729 * \brief Get the RTC tamper time value.
mbed_official 107:414e9c822e99 730 *
mbed_official 107:414e9c822e99 731 * \note This function should be called before rtc_get_tamper_source()
mbed_official 107:414e9c822e99 732 * function call, Otherwise the tamper time will be cleared.
mbed_official 107:414e9c822e99 733 *
mbed_official 107:414e9c822e99 734 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 735 * \param pul_hour Current hour, 24-hour mode.
mbed_official 107:414e9c822e99 736 * \param pul_minute Current minute.
mbed_official 107:414e9c822e99 737 * \param pul_second Current second.
mbed_official 107:414e9c822e99 738 * \param reg_num Current tamper register set number.
mbed_official 107:414e9c822e99 739 */
mbed_official 107:414e9c822e99 740 void rtc_get_tamper_time(Rtc *p_rtc, uint32_t *pul_hour, uint32_t *pul_minute,
mbed_official 107:414e9c822e99 741 uint32_t *pul_second, uint8_t reg_num)
mbed_official 107:414e9c822e99 742 {
mbed_official 107:414e9c822e99 743 uint32_t ul_time;
mbed_official 107:414e9c822e99 744 uint32_t ul_temp;
mbed_official 107:414e9c822e99 745
mbed_official 107:414e9c822e99 746 /* Get the current RTC time (multiple reads are to insure a stable value). */
mbed_official 107:414e9c822e99 747 ul_time = p_rtc->RTC_TS[reg_num].RTC_TSTR;
mbed_official 107:414e9c822e99 748 while (ul_time != p_rtc->RTC_TS[reg_num].RTC_TSTR) {
mbed_official 107:414e9c822e99 749 ul_time = p_rtc->RTC_TS[reg_num].RTC_TSTR;
mbed_official 107:414e9c822e99 750 }
mbed_official 107:414e9c822e99 751
mbed_official 107:414e9c822e99 752 /* Hour */
mbed_official 107:414e9c822e99 753 if (pul_hour) {
mbed_official 107:414e9c822e99 754 ul_temp = (ul_time & RTC_TSTR_HOUR_Msk) >> RTC_TSTR_HOUR_Pos;
mbed_official 107:414e9c822e99 755 *pul_hour = (ul_temp >> BCD_SHIFT) * BCD_FACTOR + (ul_temp & BCD_MASK);
mbed_official 107:414e9c822e99 756
mbed_official 107:414e9c822e99 757 if ((ul_time & RTC_TSTR_AMPM) == RTC_TSTR_AMPM) {
mbed_official 107:414e9c822e99 758 *pul_hour += 12;
mbed_official 107:414e9c822e99 759 }
mbed_official 107:414e9c822e99 760 }
mbed_official 107:414e9c822e99 761
mbed_official 107:414e9c822e99 762 /* Minute */
mbed_official 107:414e9c822e99 763 if (pul_minute) {
mbed_official 107:414e9c822e99 764 ul_temp = (ul_time & RTC_TSTR_MIN_Msk) >> RTC_TSTR_MIN_Pos;
mbed_official 107:414e9c822e99 765 *pul_minute = (ul_temp >> BCD_SHIFT) * BCD_FACTOR + (ul_temp & BCD_MASK);
mbed_official 107:414e9c822e99 766 }
mbed_official 107:414e9c822e99 767
mbed_official 107:414e9c822e99 768 /* Second */
mbed_official 107:414e9c822e99 769 if (pul_second) {
mbed_official 107:414e9c822e99 770 ul_temp = (ul_time & RTC_TSTR_SEC_Msk) >> RTC_TSTR_SEC_Pos;
mbed_official 107:414e9c822e99 771 *pul_second = (ul_temp >> BCD_SHIFT) * BCD_FACTOR + (ul_temp & BCD_MASK);
mbed_official 107:414e9c822e99 772 }
mbed_official 107:414e9c822e99 773 }
mbed_official 107:414e9c822e99 774
mbed_official 107:414e9c822e99 775 /**
mbed_official 107:414e9c822e99 776 * \brief Get the RTC tamper date.
mbed_official 107:414e9c822e99 777 *
mbed_official 107:414e9c822e99 778 * \note This function should be called before rtc_get_tamper_source()
mbed_official 107:414e9c822e99 779 * function call, Otherwise the tamper date will be cleared.
mbed_official 107:414e9c822e99 780 *
mbed_official 107:414e9c822e99 781 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 782 * \param pul_year Current year.
mbed_official 107:414e9c822e99 783 * \param pul_month Current month.
mbed_official 107:414e9c822e99 784 * \param pul_day Current day.
mbed_official 107:414e9c822e99 785 * \param pul_week Current day in current week.
mbed_official 107:414e9c822e99 786 * \param reg_num Current tamper register set number.
mbed_official 107:414e9c822e99 787 */
mbed_official 107:414e9c822e99 788 void rtc_get_tamper_date(Rtc *p_rtc, uint32_t *pul_year, uint32_t *pul_month,
mbed_official 107:414e9c822e99 789 uint32_t *pul_day, uint32_t *pul_week, uint8_t reg_num)
mbed_official 107:414e9c822e99 790 {
mbed_official 107:414e9c822e99 791 uint32_t ul_date;
mbed_official 107:414e9c822e99 792 uint32_t ul_cent;
mbed_official 107:414e9c822e99 793 uint32_t ul_temp;
mbed_official 107:414e9c822e99 794
mbed_official 107:414e9c822e99 795 /* Get the current date (multiple reads are to insure a stable value). */
mbed_official 107:414e9c822e99 796 ul_date = p_rtc->RTC_TS[reg_num].RTC_TSDR;
mbed_official 107:414e9c822e99 797 while (ul_date != p_rtc->RTC_TS[reg_num].RTC_TSDR) {
mbed_official 107:414e9c822e99 798 ul_date = p_rtc->RTC_TS[reg_num].RTC_TSDR;
mbed_official 107:414e9c822e99 799 }
mbed_official 107:414e9c822e99 800
mbed_official 107:414e9c822e99 801 /* Retrieve year */
mbed_official 107:414e9c822e99 802 if (pul_year) {
mbed_official 107:414e9c822e99 803 ul_temp = (ul_date & RTC_TSDR_CENT_Msk) >> RTC_TSDR_CENT_Pos;
mbed_official 107:414e9c822e99 804 ul_cent = (ul_temp >> BCD_SHIFT) * BCD_FACTOR + (ul_temp & BCD_MASK);
mbed_official 107:414e9c822e99 805 ul_temp = (ul_date & RTC_TSDR_YEAR_Msk) >> RTC_TSDR_YEAR_Pos;
mbed_official 107:414e9c822e99 806 *pul_year = (ul_cent * BCD_FACTOR * BCD_FACTOR) +
mbed_official 107:414e9c822e99 807 (ul_temp >> BCD_SHIFT) * BCD_FACTOR + (ul_temp & BCD_MASK);
mbed_official 107:414e9c822e99 808 }
mbed_official 107:414e9c822e99 809
mbed_official 107:414e9c822e99 810 /* Retrieve month */
mbed_official 107:414e9c822e99 811 if (pul_month) {
mbed_official 107:414e9c822e99 812 ul_temp = (ul_date & RTC_TSDR_MONTH_Msk) >> RTC_TSDR_MONTH_Pos;
mbed_official 107:414e9c822e99 813 *pul_month = (ul_temp >> BCD_SHIFT) * BCD_FACTOR + (ul_temp & BCD_MASK);
mbed_official 107:414e9c822e99 814 }
mbed_official 107:414e9c822e99 815
mbed_official 107:414e9c822e99 816 /* Retrieve day */
mbed_official 107:414e9c822e99 817 if (pul_day) {
mbed_official 107:414e9c822e99 818 ul_temp = (ul_date & RTC_TSDR_DATE_Msk) >> RTC_TSDR_DATE_Pos;
mbed_official 107:414e9c822e99 819 *pul_day = (ul_temp >> BCD_SHIFT) * BCD_FACTOR + (ul_temp & BCD_MASK);
mbed_official 107:414e9c822e99 820 }
mbed_official 107:414e9c822e99 821
mbed_official 107:414e9c822e99 822 /* Retrieve week */
mbed_official 107:414e9c822e99 823 if (pul_week) {
mbed_official 107:414e9c822e99 824 *pul_week = ((ul_date & RTC_TSDR_DAY_Msk) >> RTC_TSDR_DAY_Pos);
mbed_official 107:414e9c822e99 825 }
mbed_official 107:414e9c822e99 826 }
mbed_official 107:414e9c822e99 827
mbed_official 107:414e9c822e99 828 /**
mbed_official 107:414e9c822e99 829 * \brief Get the RTC tamper source.
mbed_official 107:414e9c822e99 830 *
mbed_official 107:414e9c822e99 831 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 832 * \param reg_num Current tamper register set number.
mbed_official 107:414e9c822e99 833 *
mbed_official 107:414e9c822e99 834 * \return Tamper source.
mbed_official 107:414e9c822e99 835 */
mbed_official 107:414e9c822e99 836 uint32_t rtc_get_tamper_source(Rtc *p_rtc, uint8_t reg_num)
mbed_official 107:414e9c822e99 837 {
mbed_official 107:414e9c822e99 838 return (p_rtc->RTC_TS[reg_num].RTC_TSSR & RTC_TSSR_TSRC_Msk) >>
mbed_official 107:414e9c822e99 839 RTC_TSSR_TSRC_Pos;
mbed_official 107:414e9c822e99 840 }
mbed_official 107:414e9c822e99 841
mbed_official 107:414e9c822e99 842 /**
mbed_official 107:414e9c822e99 843 * \brief Get the RTC tamper event counter.
mbed_official 107:414e9c822e99 844 *
mbed_official 107:414e9c822e99 845 * \note This function should be called before rtc_get_tamper_source()
mbed_official 107:414e9c822e99 846 * function call, Otherwise the tamper event counter will be cleared.
mbed_official 107:414e9c822e99 847 *
mbed_official 107:414e9c822e99 848 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 849 *
mbed_official 107:414e9c822e99 850 * \return Tamper event counter
mbed_official 107:414e9c822e99 851 */
mbed_official 107:414e9c822e99 852 uint32_t rtc_get_tamper_event_counter(Rtc *p_rtc)
mbed_official 107:414e9c822e99 853 {
mbed_official 107:414e9c822e99 854 return (p_rtc->RTC_TS[0].RTC_TSTR & RTC_TSTR_TEVCNT_Msk) >>
mbed_official 107:414e9c822e99 855 RTC_TSTR_TEVCNT_Pos;
mbed_official 107:414e9c822e99 856 }
mbed_official 107:414e9c822e99 857
mbed_official 107:414e9c822e99 858 /**
mbed_official 107:414e9c822e99 859 * \brief Check the system is in backup mode when RTC tamper event happen.
mbed_official 107:414e9c822e99 860 *
mbed_official 107:414e9c822e99 861 * \note This function should be called before rtc_get_tamper_source()
mbed_official 107:414e9c822e99 862 * function call, Otherwise the flag indicates tamper occur in backup
mbed_official 107:414e9c822e99 863 * mode will be cleared.
mbed_official 107:414e9c822e99 864 *
mbed_official 107:414e9c822e99 865 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 866 * \param reg_num Current tamper register set number.
mbed_official 107:414e9c822e99 867 *
mbed_official 107:414e9c822e99 868 * \return True - The system is in backup mode when the tamper event occurs.
mbed_official 107:414e9c822e99 869 * Flase - The system is different from backup mode.
mbed_official 107:414e9c822e99 870 */
mbed_official 107:414e9c822e99 871 bool rtc_is_tamper_occur_in_backup_mode(Rtc *p_rtc, uint8_t reg_num)
mbed_official 107:414e9c822e99 872 {
mbed_official 107:414e9c822e99 873 if(p_rtc->RTC_TS[reg_num].RTC_TSTR & RTC_TSTR_BACKUP) {
mbed_official 107:414e9c822e99 874 return true;
mbed_official 107:414e9c822e99 875 } else {
mbed_official 107:414e9c822e99 876 return false;
mbed_official 107:414e9c822e99 877 }
mbed_official 107:414e9c822e99 878 }
mbed_official 107:414e9c822e99 879 #endif
mbed_official 107:414e9c822e99 880
mbed_official 107:414e9c822e99 881 #if (SAMG55)
mbed_official 107:414e9c822e99 882 /**
mbed_official 107:414e9c822e99 883 * \brief Get the RTC milliseconds value.
mbed_official 107:414e9c822e99 884 *
mbed_official 107:414e9c822e99 885 * \param p_rtc Pointer to an RTC instance.
mbed_official 107:414e9c822e99 886 *
mbed_official 107:414e9c822e99 887 * \return Number of 1/1024 seconds elapsed within one second.
mbed_official 107:414e9c822e99 888 */
mbed_official 107:414e9c822e99 889 uint32_t rtc_get_milliseconds(Rtc *p_rtc)
mbed_official 107:414e9c822e99 890 {
mbed_official 107:414e9c822e99 891 return (p_rtc->RTC_MSR) & RTC_MSR_MS_Msk;
mbed_official 107:414e9c822e99 892 }
mbed_official 107:414e9c822e99 893 #endif
mbed_official 107:414e9c822e99 894
mbed_official 107:414e9c822e99 895
mbed_official 107:414e9c822e99 896 //@}
mbed_official 107:414e9c822e99 897
mbed_official 107:414e9c822e99 898 /// @cond 0
mbed_official 107:414e9c822e99 899 /**INDENT-OFF**/
mbed_official 107:414e9c822e99 900 #ifdef __cplusplus
mbed_official 107:414e9c822e99 901 }
mbed_official 107:414e9c822e99 902 #endif
mbed_official 107:414e9c822e99 903 /**INDENT-ON**/
mbed_official 107:414e9c822e99 904 /// @endcond