t

Fork of mbed-dev by mbed official

Committer:
amithy
Date:
Thu Nov 09 22:14:37 2017 +0000
Revision:
178:c26431f84b0d
Parent:
149:156823d33999
test export

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 Timer (RTT) 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 "rtt.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_rtt_group Real-time Timer (RTT)
mbed_official 107:414e9c822e99 59 *
mbed_official 107:414e9c822e99 60 * The Real-time Timer is built around a 32-bit counter used to count
mbed_official 107:414e9c822e99 61 * roll-over events of the programmable 16-bit prescaler, which enables
mbed_official 107:414e9c822e99 62 * counting elapsed seconds from a 32 kHz slow clock source.
mbed_official 107:414e9c822e99 63 * This is a driver for configuration and use of the RTT peripheral.
mbed_official 107:414e9c822e99 64 *
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 * In follow series chip, the bit RTC1HZ and RTTDIS in RTT_MR are write only.
mbed_official 107:414e9c822e99 70 * So we use a variable to record status of these bits.
mbed_official 107:414e9c822e99 71 */
mbed_official 107:414e9c822e99 72 #if (SAM4N || SAM4S || SAM4E || SAM4C || SAMG51 || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 73 static uint32_t g_wobits_in_rtt_mr = 0;
mbed_official 107:414e9c822e99 74 #endif
mbed_official 107:414e9c822e99 75
mbed_official 107:414e9c822e99 76 /**
mbed_official 107:414e9c822e99 77 * \brief Initialize the given RTT.
mbed_official 107:414e9c822e99 78 *
mbed_official 107:414e9c822e99 79 * \note This function restarts the real-time timer. If w_prescaler is equal to zero,
mbed_official 107:414e9c822e99 80 * the prescaler period is equal to 2^16 * SCLK period. If not, the prescaler period
mbed_official 107:414e9c822e99 81 * is equal to us_prescaler * SCLK period.
mbed_official 107:414e9c822e99 82 *
mbed_official 107:414e9c822e99 83 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 84 * \param us_prescaler Prescaler value for the RTT.
mbed_official 107:414e9c822e99 85 *
mbed_official 107:414e9c822e99 86 * \return 0 if successful.
mbed_official 107:414e9c822e99 87 */
mbed_official 107:414e9c822e99 88 uint32_t rtt_init(Rtt *p_rtt, uint16_t us_prescaler)
mbed_official 107:414e9c822e99 89 {
mbed_official 107:414e9c822e99 90 #if (SAM4N || SAM4S || SAM4E || SAM4C || SAMG51 || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 91 p_rtt->RTT_MR = (us_prescaler | RTT_MR_RTTRST | g_wobits_in_rtt_mr);
mbed_official 107:414e9c822e99 92 #else
mbed_official 107:414e9c822e99 93 p_rtt->RTT_MR = (us_prescaler | RTT_MR_RTTRST);
mbed_official 107:414e9c822e99 94 #endif
mbed_official 107:414e9c822e99 95 return 0;
mbed_official 107:414e9c822e99 96 }
mbed_official 107:414e9c822e99 97
mbed_official 107:414e9c822e99 98 #if (SAM4N || SAM4S || SAM4E || SAM4C || SAMG51 || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 99 /**
mbed_official 107:414e9c822e99 100 * \brief Select RTT counter source.
mbed_official 107:414e9c822e99 101 *
mbed_official 107:414e9c822e99 102 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 103 * \param is_rtc_sel RTC 1Hz Clock Selection.
mbed_official 107:414e9c822e99 104 */
mbed_official 107:414e9c822e99 105 void rtt_sel_source(Rtt *p_rtt, bool is_rtc_sel)
mbed_official 107:414e9c822e99 106 {
mbed_official 107:414e9c822e99 107 if(is_rtc_sel) {
mbed_official 107:414e9c822e99 108 g_wobits_in_rtt_mr |= RTT_MR_RTC1HZ;
mbed_official 107:414e9c822e99 109 p_rtt->RTT_MR |= g_wobits_in_rtt_mr;
mbed_official 107:414e9c822e99 110 } else {
mbed_official 107:414e9c822e99 111 g_wobits_in_rtt_mr &= ~RTT_MR_RTC1HZ;
mbed_official 107:414e9c822e99 112 p_rtt->RTT_MR |= g_wobits_in_rtt_mr;
mbed_official 107:414e9c822e99 113 }
mbed_official 107:414e9c822e99 114 }
mbed_official 107:414e9c822e99 115
mbed_official 107:414e9c822e99 116 /**
mbed_official 107:414e9c822e99 117 * \brief Enable RTT.
mbed_official 107:414e9c822e99 118 *
mbed_official 107:414e9c822e99 119 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 120 */
mbed_official 107:414e9c822e99 121 void rtt_enable(Rtt *p_rtt)
mbed_official 107:414e9c822e99 122 {
mbed_official 107:414e9c822e99 123 g_wobits_in_rtt_mr &= ~RTT_MR_RTTDIS;
mbed_official 107:414e9c822e99 124 p_rtt->RTT_MR |= g_wobits_in_rtt_mr;
mbed_official 107:414e9c822e99 125 }
mbed_official 107:414e9c822e99 126 /**
mbed_official 107:414e9c822e99 127 * \brief Disable RTT.
mbed_official 107:414e9c822e99 128 *
mbed_official 107:414e9c822e99 129 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 130 */
mbed_official 107:414e9c822e99 131 void rtt_disable(Rtt *p_rtt)
mbed_official 107:414e9c822e99 132 {
mbed_official 107:414e9c822e99 133 g_wobits_in_rtt_mr |= RTT_MR_RTTDIS;
mbed_official 107:414e9c822e99 134 p_rtt->RTT_MR |= g_wobits_in_rtt_mr;
mbed_official 107:414e9c822e99 135 }
mbed_official 107:414e9c822e99 136 #elif (SAMG53 || SAMG54 || SAMG55)
mbed_official 107:414e9c822e99 137 void rtt_sel_source(Rtt *p_rtt, bool is_rtc_sel)
mbed_official 107:414e9c822e99 138 {
mbed_official 107:414e9c822e99 139 if(is_rtc_sel) {
mbed_official 107:414e9c822e99 140 p_rtt->RTT_MR |= RTT_MR_RTC1HZ;
mbed_official 107:414e9c822e99 141 } else {
mbed_official 107:414e9c822e99 142 p_rtt->RTT_MR &= ~RTT_MR_RTC1HZ;
mbed_official 107:414e9c822e99 143 }
mbed_official 107:414e9c822e99 144 }
mbed_official 107:414e9c822e99 145
mbed_official 107:414e9c822e99 146 void rtt_enable(Rtt *p_rtt)
mbed_official 107:414e9c822e99 147 {
mbed_official 107:414e9c822e99 148 p_rtt->RTT_MR &= ~RTT_MR_RTTDIS;
mbed_official 107:414e9c822e99 149 }
mbed_official 107:414e9c822e99 150 /**
mbed_official 107:414e9c822e99 151 * \brief Disable RTT.
mbed_official 107:414e9c822e99 152 *
mbed_official 107:414e9c822e99 153 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 154 */
mbed_official 107:414e9c822e99 155 void rtt_disable(Rtt *p_rtt)
mbed_official 107:414e9c822e99 156 {
mbed_official 107:414e9c822e99 157 p_rtt->RTT_MR |= RTT_MR_RTTDIS;
mbed_official 107:414e9c822e99 158 }
mbed_official 107:414e9c822e99 159 #endif
mbed_official 107:414e9c822e99 160
mbed_official 107:414e9c822e99 161 /**
mbed_official 107:414e9c822e99 162 * \brief Enable RTT interrupts.
mbed_official 107:414e9c822e99 163 *
mbed_official 107:414e9c822e99 164 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 165 * \param ul_sources Interrupts to be enabled.
mbed_official 107:414e9c822e99 166 */
mbed_official 107:414e9c822e99 167 void rtt_enable_interrupt(Rtt *p_rtt, uint32_t ul_sources)
mbed_official 107:414e9c822e99 168 {
mbed_official 107:414e9c822e99 169 uint32_t temp;
mbed_official 107:414e9c822e99 170
mbed_official 107:414e9c822e99 171 temp = p_rtt->RTT_MR;
mbed_official 107:414e9c822e99 172 temp |= ul_sources;
mbed_official 107:414e9c822e99 173 #if (SAM4N || SAM4S || SAM4E || SAM4C || SAMG51 || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 174 temp |= g_wobits_in_rtt_mr;
mbed_official 107:414e9c822e99 175 #endif
mbed_official 107:414e9c822e99 176 p_rtt->RTT_MR = temp;
mbed_official 107:414e9c822e99 177 }
mbed_official 107:414e9c822e99 178
mbed_official 107:414e9c822e99 179 /**
mbed_official 107:414e9c822e99 180 * \brief Disable RTT interrupts.
mbed_official 107:414e9c822e99 181 *
mbed_official 107:414e9c822e99 182 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 183 * \param ul_sources Interrupts to be disabled.
mbed_official 107:414e9c822e99 184 */
mbed_official 107:414e9c822e99 185 void rtt_disable_interrupt(Rtt *p_rtt, uint32_t ul_sources)
mbed_official 107:414e9c822e99 186 {
mbed_official 107:414e9c822e99 187 uint32_t temp = 0;
mbed_official 107:414e9c822e99 188
mbed_official 107:414e9c822e99 189 temp = p_rtt->RTT_MR;
mbed_official 107:414e9c822e99 190 temp &= (~ul_sources);
mbed_official 107:414e9c822e99 191 #if (SAM4N || SAM4S || SAM4E || SAM4C || SAMG51 || SAM4CP || SAM4CM || SAMV71 || SAMV70 || SAME70 || SAMS70)
mbed_official 107:414e9c822e99 192 temp |= g_wobits_in_rtt_mr;
mbed_official 107:414e9c822e99 193 #endif
mbed_official 107:414e9c822e99 194 p_rtt->RTT_MR = temp;
mbed_official 107:414e9c822e99 195 }
mbed_official 107:414e9c822e99 196
mbed_official 107:414e9c822e99 197 /**
mbed_official 107:414e9c822e99 198 * \brief Read the current value of the RTT timer value.
mbed_official 107:414e9c822e99 199 *
mbed_official 107:414e9c822e99 200 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 201 *
mbed_official 107:414e9c822e99 202 * \return The current Real-time Timer value.
mbed_official 107:414e9c822e99 203 */
mbed_official 107:414e9c822e99 204 uint32_t rtt_read_timer_value(Rtt *p_rtt)
mbed_official 107:414e9c822e99 205 {
mbed_official 107:414e9c822e99 206 return p_rtt->RTT_VR;
mbed_official 107:414e9c822e99 207 }
mbed_official 107:414e9c822e99 208
mbed_official 107:414e9c822e99 209 /**
mbed_official 107:414e9c822e99 210 * \brief Get the status register value of the given RTT.
mbed_official 107:414e9c822e99 211 *
mbed_official 107:414e9c822e99 212 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 213 *
mbed_official 107:414e9c822e99 214 * \return The Real-time Timer status.
mbed_official 107:414e9c822e99 215 */
mbed_official 107:414e9c822e99 216 uint32_t rtt_get_status(Rtt *p_rtt)
mbed_official 107:414e9c822e99 217 {
mbed_official 107:414e9c822e99 218 return p_rtt->RTT_SR;
mbed_official 107:414e9c822e99 219 }
mbed_official 107:414e9c822e99 220
mbed_official 107:414e9c822e99 221 /**
mbed_official 107:414e9c822e99 222 * \brief Configure the RTT to generate an alarm at the given time.
mbed_official 107:414e9c822e99 223 *
mbed_official 107:414e9c822e99 224 * \param p_rtt Pointer to an RTT instance.
mbed_official 107:414e9c822e99 225 * \param ul_alarm_time Alarm time.
mbed_official 107:414e9c822e99 226 *
mbed_official 107:414e9c822e99 227 * \retval 0 Configuration is done.
mbed_official 107:414e9c822e99 228 * \retval 1 Parameter error.
mbed_official 107:414e9c822e99 229 */
mbed_official 107:414e9c822e99 230 uint32_t rtt_write_alarm_time(Rtt *p_rtt, uint32_t ul_alarm_time)
mbed_official 107:414e9c822e99 231 {
mbed_official 107:414e9c822e99 232 uint32_t flag;
mbed_official 107:414e9c822e99 233
mbed_official 107:414e9c822e99 234 if (ul_alarm_time == 0) {
mbed_official 107:414e9c822e99 235 return 1;
mbed_official 107:414e9c822e99 236 }
mbed_official 107:414e9c822e99 237
mbed_official 107:414e9c822e99 238 flag = p_rtt->RTT_MR & RTT_MR_ALMIEN;
mbed_official 107:414e9c822e99 239
mbed_official 107:414e9c822e99 240 rtt_disable_interrupt(RTT, RTT_MR_ALMIEN);
mbed_official 107:414e9c822e99 241
mbed_official 107:414e9c822e99 242 /* Alarm time = ALMV + 1 */
mbed_official 107:414e9c822e99 243 p_rtt->RTT_AR = ul_alarm_time - 1;
mbed_official 107:414e9c822e99 244
mbed_official 107:414e9c822e99 245 if (flag) {
mbed_official 107:414e9c822e99 246 rtt_enable_interrupt(RTT, RTT_MR_ALMIEN);
mbed_official 107:414e9c822e99 247 }
mbed_official 107:414e9c822e99 248
mbed_official 107:414e9c822e99 249 return 0;
mbed_official 107:414e9c822e99 250 }
mbed_official 107:414e9c822e99 251
mbed_official 107:414e9c822e99 252 //@}
mbed_official 107:414e9c822e99 253
mbed_official 107:414e9c822e99 254 /// @cond 0
mbed_official 107:414e9c822e99 255 /**INDENT-OFF**/
mbed_official 107:414e9c822e99 256 #ifdef __cplusplus
mbed_official 107:414e9c822e99 257 }
mbed_official 107:414e9c822e99 258 #endif
mbed_official 107:414e9c822e99 259 /**INDENT-ON**/
mbed_official 107:414e9c822e99 260 /// @endcond