t

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Tue Apr 05 18:15:12 2016 +0100
Revision:
107:414e9c822e99
Synchronized with git revision dd3c5f7fa8473776950ec6e15c0e4adedb21cf2f

Full URL: https://github.com/mbedmicro/mbed/commit/dd3c5f7fa8473776950ec6e15c0e4adedb21cf2f/

* * Base Commit for SAMG55J19. No errors and no implementations.

* * Added gpio files.

* * Added pinmap files.

* * Base commit for usticker implementation.

* * Added gcc_arm export functionality

* * added files for usticker.
* added template file for samd55j19

* * GPIO IRQ base commit.

* * updated with changes in gpio irq driver.

* * Reverted back unexpected commit in SAM0 gpio driver.

* * updated gpio_irq driver.

* * correction in gpio and gpio_irq drivers.
* added support for some test for gpio.

* * base commit for peripheralpins for usart.
* update in serial apis.

* * updated serial apis.

* * updated serial apis and test.

* * update serial apis for asynch apis.

* * updated peripheral pins for i2c and spi.
* added test support for serial flow control

* * Base commit for low power ticker implementation.

* * base commit for port apis.
* update in lp ticker apis.

* * Added test support for port.

* * base commit for sleep apis.

* * Base commit for spi.

* * updated with corrections in gpio irq.
* usticker file updated with latest source.

* * updated with corrections for unexpected board reset.
* updated gpio irq apis and added test for the same.

* * updated sleep api for deepsleep.

* * updated serial apis.

* Added uc_ticker and SPI api implementations

* Removed unused SPI pin map

* Updated review feedback

* * implemented lpticker with TC module.
* updated files for KnR Coding Statndard.
* updated serial and usticker apis.

* * Base commit for AnalogueIn apis.

* * RTC apis base commit without implementation.

* * Updated with corrections in lpticker implementations.

* * Added implementation for rtc apis.

* * updated with implementations for pwm.
* changed usticker from TC0 to TC1.

* Added I2C support

* * removed setvector usage from usticker and lpticker implementations
* added tests for SAMG55J19

* * Removed unwanted .o and .d files.
* Updated I2C files for KnR Coding Standards.
* Update for reducing compiler warnings in peripheralpins,c
* Updated with PWM free implementation.

* * Removed unwanted headers file inclusion.
* Compiler warning corrections in serial_api.c

* * Updated ADC with 16 bit mode initialization and code refinements.
* Updated PWM with code refinements.

* Updated I2C review feedback and fixed style

* Updated target name for SAMG55

* * Added Test Support for I2C with AT30TSE75X and Added Support for SAMG55J19 in atmelstudio project exporter

* * Added Test Support for I2C with AT30TSE75X and Added Support for SAMG55J19 in atmelstudio project exporter

* Used NVIC_SetVector for interrupt callback

* Removed Target macro define in test

* Updated test cases to have SAMG55 support

* * Updated with corrections in Serial and SPI asynchronous implementations.
* Updated deepsleep api implementation
* Merged LP_Ticker with latest code from mbed 3.0 repository.

* * updated with corrections in I2C Asynch implementation.

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