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/tc/tc.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 SAM Timer Counter (TC) driver.
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 <assert.h>
mbed_official 107:414e9c822e99 48 #include "tc.h"
mbed_official 107:414e9c822e99 49
mbed_official 107:414e9c822e99 50 /// @cond
mbed_official 107:414e9c822e99 51 /**INDENT-OFF**/
mbed_official 107:414e9c822e99 52 #ifdef __cplusplus
mbed_official 107:414e9c822e99 53 extern "C" {
mbed_official 107:414e9c822e99 54 #endif
mbed_official 107:414e9c822e99 55 /**INDENT-ON**/
mbed_official 107:414e9c822e99 56 /// @endcond
mbed_official 107:414e9c822e99 57
mbed_official 107:414e9c822e99 58 #ifndef TC_WPMR_WPKEY_PASSWD
mbed_official 107:414e9c822e99 59 #define TC_WPMR_WPKEY_PASSWD TC_WPMR_WPKEY((uint32_t)0x54494D)
mbed_official 107:414e9c822e99 60 #endif
mbed_official 107:414e9c822e99 61
mbed_official 107:414e9c822e99 62 /**
mbed_official 107:414e9c822e99 63 * \brief Configure TC for timer, waveform generation, or capture.
mbed_official 107:414e9c822e99 64 *
mbed_official 107:414e9c822e99 65 * \param[in,out] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 66 * \param[in] ul_channel Channel to configure
mbed_official 107:414e9c822e99 67 * \param[in] ul_mode Control mode register bitmask value to set
mbed_official 107:414e9c822e99 68 *
mbed_official 107:414e9c822e99 69 * \note For more information regarding <i>ul_mode</i> configuration refer to
mbed_official 107:414e9c822e99 70 * the section entitled "Channel Mode Register: Capture Mode" and/or section
mbed_official 107:414e9c822e99 71 * "Waveform Operating Mode" in the device-specific datasheet.
mbed_official 107:414e9c822e99 72 *
mbed_official 107:414e9c822e99 73 * \note If the TC is configured for waveform generation then the external event
mbed_official 107:414e9c822e99 74 * selection (EEVT) should only be set to TC_CMR_EEVT_TIOB, or the
mbed_official 107:414e9c822e99 75 * equivalent value of 0, if it really is the intention to use TIOB as an
mbed_official 107:414e9c822e99 76 * external event trigger. This is because this setting forces TIOB to be
mbed_official 107:414e9c822e99 77 * an input, even if the external event trigger has not been enabled with
mbed_official 107:414e9c822e99 78 * TC_CMR_ENETRG, and thus prevents normal operation of TIOB.
mbed_official 107:414e9c822e99 79 */
mbed_official 107:414e9c822e99 80 void tc_init(
mbed_official 107:414e9c822e99 81 Tc *p_tc,
mbed_official 107:414e9c822e99 82 uint32_t ul_channel,
mbed_official 107:414e9c822e99 83 uint32_t ul_mode)
mbed_official 107:414e9c822e99 84 {
mbed_official 107:414e9c822e99 85 TcChannel *tc_channel;
mbed_official 107:414e9c822e99 86
mbed_official 107:414e9c822e99 87 /* Validate inputs. */
mbed_official 107:414e9c822e99 88 Assert(p_tc);
mbed_official 107:414e9c822e99 89 Assert(ul_channel <
mbed_official 107:414e9c822e99 90 (sizeof(p_tc->TC_CHANNEL) / sizeof(p_tc->TC_CHANNEL[0])));
mbed_official 107:414e9c822e99 91 tc_channel = p_tc->TC_CHANNEL + ul_channel;
mbed_official 107:414e9c822e99 92
mbed_official 107:414e9c822e99 93 /* Disable TC clock. */
mbed_official 107:414e9c822e99 94 tc_channel->TC_CCR = TC_CCR_CLKDIS;
mbed_official 107:414e9c822e99 95
mbed_official 107:414e9c822e99 96 /* Disable interrupts. */
mbed_official 107:414e9c822e99 97 tc_channel->TC_IDR = 0xFFFFFFFF;
mbed_official 107:414e9c822e99 98
mbed_official 107:414e9c822e99 99 /* Clear status register. */
mbed_official 107:414e9c822e99 100 tc_channel->TC_SR;
mbed_official 107:414e9c822e99 101
mbed_official 107:414e9c822e99 102 /* Set mode. */
mbed_official 107:414e9c822e99 103 tc_channel->TC_CMR = ul_mode;
mbed_official 107:414e9c822e99 104 }
mbed_official 107:414e9c822e99 105
mbed_official 107:414e9c822e99 106 /**
mbed_official 107:414e9c822e99 107 * \brief Asserts a SYNC signal to generate a software trigger on
mbed_official 107:414e9c822e99 108 * all channels.
mbed_official 107:414e9c822e99 109 *
mbed_official 107:414e9c822e99 110 * \param[out] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 111 *
mbed_official 107:414e9c822e99 112 */
mbed_official 107:414e9c822e99 113 void tc_sync_trigger(
mbed_official 107:414e9c822e99 114 Tc *p_tc)
mbed_official 107:414e9c822e99 115 {
mbed_official 107:414e9c822e99 116 /* Validate inputs. */
mbed_official 107:414e9c822e99 117 Assert(p_tc);
mbed_official 107:414e9c822e99 118
mbed_official 107:414e9c822e99 119 p_tc->TC_BCR = TC_BCR_SYNC;
mbed_official 107:414e9c822e99 120 }
mbed_official 107:414e9c822e99 121
mbed_official 107:414e9c822e99 122 /**
mbed_official 107:414e9c822e99 123 * \brief Configure the TC Block mode.
mbed_official 107:414e9c822e99 124 *
mbed_official 107:414e9c822e99 125 * \note The function tc_init() must be called prior to this one.
mbed_official 107:414e9c822e99 126 *
mbed_official 107:414e9c822e99 127 * \param[out] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 128 * \param[in] ul_blockmode Block mode register value to set
mbed_official 107:414e9c822e99 129 *
mbed_official 107:414e9c822e99 130 * \note For more information regarding <i>ul_blockmode</i> configuration refer to
mbed_official 107:414e9c822e99 131 * the section entitled "TC Block Mode Register" in the device-specific datasheet.
mbed_official 107:414e9c822e99 132 */
mbed_official 107:414e9c822e99 133 void tc_set_block_mode(
mbed_official 107:414e9c822e99 134 Tc *p_tc,
mbed_official 107:414e9c822e99 135 uint32_t ul_blockmode)
mbed_official 107:414e9c822e99 136 {
mbed_official 107:414e9c822e99 137 /* Validate inputs. */
mbed_official 107:414e9c822e99 138 Assert(p_tc);
mbed_official 107:414e9c822e99 139
mbed_official 107:414e9c822e99 140 p_tc->TC_BMR = ul_blockmode;
mbed_official 107:414e9c822e99 141 }
mbed_official 107:414e9c822e99 142
mbed_official 107:414e9c822e99 143 #if (!SAM3U) || defined(__DOXYGEN__)
mbed_official 107:414e9c822e99 144
mbed_official 107:414e9c822e99 145 /**
mbed_official 107:414e9c822e99 146 * \brief Configure TC for 2-bit Gray Counter for Stepper Motor.
mbed_official 107:414e9c822e99 147 * \note The function tc_init() must be called prior to this one.
mbed_official 107:414e9c822e99 148 *
mbed_official 107:414e9c822e99 149 * \note This function is not available on SAM3U devices.
mbed_official 107:414e9c822e99 150 *
mbed_official 107:414e9c822e99 151 * \param[out] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 152 * \param[in] ul_channel Channel to configure
mbed_official 107:414e9c822e99 153 * \param[in] ul_steppermode Stepper motor mode register value to set
mbed_official 107:414e9c822e99 154 *
mbed_official 107:414e9c822e99 155 * \return 0 for OK.
mbed_official 107:414e9c822e99 156 */
mbed_official 107:414e9c822e99 157 uint32_t tc_init_2bit_gray(
mbed_official 107:414e9c822e99 158 Tc *p_tc,
mbed_official 107:414e9c822e99 159 uint32_t ul_channel,
mbed_official 107:414e9c822e99 160 uint32_t ul_steppermode)
mbed_official 107:414e9c822e99 161 {
mbed_official 107:414e9c822e99 162 /* Validate inputs. */
mbed_official 107:414e9c822e99 163 Assert(p_tc);
mbed_official 107:414e9c822e99 164 Assert(ul_channel <
mbed_official 107:414e9c822e99 165 (sizeof(p_tc->TC_CHANNEL) / sizeof(p_tc->TC_CHANNEL[0])));
mbed_official 107:414e9c822e99 166
mbed_official 107:414e9c822e99 167 p_tc->TC_CHANNEL[ul_channel].TC_SMMR = ul_steppermode;
mbed_official 107:414e9c822e99 168 return 0;
mbed_official 107:414e9c822e99 169 }
mbed_official 107:414e9c822e99 170
mbed_official 107:414e9c822e99 171 #endif /* (!SAM3U) || defined(__DOXYGEN__) */
mbed_official 107:414e9c822e99 172
mbed_official 107:414e9c822e99 173 /**
mbed_official 107:414e9c822e99 174 * \brief Start the TC clock on the specified channel.
mbed_official 107:414e9c822e99 175 *
mbed_official 107:414e9c822e99 176 * \param[out] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 177 * \param[in] ul_channel Channel to configure
mbed_official 107:414e9c822e99 178 */
mbed_official 107:414e9c822e99 179 void tc_start(
mbed_official 107:414e9c822e99 180 Tc *p_tc,
mbed_official 107:414e9c822e99 181 uint32_t ul_channel)
mbed_official 107:414e9c822e99 182 {
mbed_official 107:414e9c822e99 183 /* Validate inputs. */
mbed_official 107:414e9c822e99 184 Assert(p_tc);
mbed_official 107:414e9c822e99 185 Assert(ul_channel <
mbed_official 107:414e9c822e99 186 (sizeof(p_tc->TC_CHANNEL) / sizeof(p_tc->TC_CHANNEL[0])));
mbed_official 107:414e9c822e99 187
mbed_official 107:414e9c822e99 188 p_tc->TC_CHANNEL[ul_channel].TC_CCR = TC_CCR_CLKEN | TC_CCR_SWTRG;
mbed_official 107:414e9c822e99 189 }
mbed_official 107:414e9c822e99 190
mbed_official 107:414e9c822e99 191 /**
mbed_official 107:414e9c822e99 192 * \brief Stop the TC clock on the specified channel.
mbed_official 107:414e9c822e99 193 *
mbed_official 107:414e9c822e99 194 * \param[out] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 195 * \param[in] ul_channel Channel to configure
mbed_official 107:414e9c822e99 196 */
mbed_official 107:414e9c822e99 197 void tc_stop(
mbed_official 107:414e9c822e99 198 Tc *p_tc,
mbed_official 107:414e9c822e99 199 uint32_t ul_channel)
mbed_official 107:414e9c822e99 200 {
mbed_official 107:414e9c822e99 201 /* Validate inputs. */
mbed_official 107:414e9c822e99 202 Assert(p_tc);
mbed_official 107:414e9c822e99 203 Assert(ul_channel <
mbed_official 107:414e9c822e99 204 (sizeof(p_tc->TC_CHANNEL) / sizeof(p_tc->TC_CHANNEL[0])));
mbed_official 107:414e9c822e99 205
mbed_official 107:414e9c822e99 206 p_tc->TC_CHANNEL[ul_channel].TC_CCR = TC_CCR_CLKDIS;
mbed_official 107:414e9c822e99 207 }
mbed_official 107:414e9c822e99 208
mbed_official 107:414e9c822e99 209 /**
mbed_official 107:414e9c822e99 210 * \brief Read the counter value on the specified channel.
mbed_official 107:414e9c822e99 211 *
mbed_official 107:414e9c822e99 212 * \param[in] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 213 * \param[in] ul_channel Channel to read
mbed_official 107:414e9c822e99 214 *
mbed_official 107:414e9c822e99 215 * \return The counter value.
mbed_official 107:414e9c822e99 216 */
mbed_official 107:414e9c822e99 217 uint32_t tc_read_cv(
mbed_official 107:414e9c822e99 218 Tc *p_tc,
mbed_official 107:414e9c822e99 219 uint32_t ul_channel)
mbed_official 107:414e9c822e99 220 {
mbed_official 107:414e9c822e99 221 /* Validate inputs. */
mbed_official 107:414e9c822e99 222 Assert(p_tc);
mbed_official 107:414e9c822e99 223 Assert(ul_channel <
mbed_official 107:414e9c822e99 224 (sizeof(p_tc->TC_CHANNEL) / sizeof(p_tc->TC_CHANNEL[0])));
mbed_official 107:414e9c822e99 225
mbed_official 107:414e9c822e99 226 return p_tc->TC_CHANNEL[ul_channel].TC_CV;
mbed_official 107:414e9c822e99 227 }
mbed_official 107:414e9c822e99 228
mbed_official 107:414e9c822e99 229 /**
mbed_official 107:414e9c822e99 230 * \brief Read TC Register A (RA) on the specified channel.
mbed_official 107:414e9c822e99 231 *
mbed_official 107:414e9c822e99 232 * \param[in] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 233 * \param[in] ul_channel Channel to read
mbed_official 107:414e9c822e99 234 *
mbed_official 107:414e9c822e99 235 * \return The TC Register A (RA) value.
mbed_official 107:414e9c822e99 236 */
mbed_official 107:414e9c822e99 237 uint32_t tc_read_ra(
mbed_official 107:414e9c822e99 238 Tc *p_tc,
mbed_official 107:414e9c822e99 239 uint32_t ul_channel)
mbed_official 107:414e9c822e99 240 {
mbed_official 107:414e9c822e99 241 /* Validate inputs. */
mbed_official 107:414e9c822e99 242 Assert(p_tc);
mbed_official 107:414e9c822e99 243 Assert(ul_channel <
mbed_official 107:414e9c822e99 244 (sizeof(p_tc->TC_CHANNEL) / sizeof(p_tc->TC_CHANNEL[0])));
mbed_official 107:414e9c822e99 245
mbed_official 107:414e9c822e99 246 return p_tc->TC_CHANNEL[ul_channel].TC_RA;
mbed_official 107:414e9c822e99 247 }
mbed_official 107:414e9c822e99 248
mbed_official 107:414e9c822e99 249 /**
mbed_official 107:414e9c822e99 250 * \brief Read TC Register B (RB) on the specified channel.
mbed_official 107:414e9c822e99 251 *
mbed_official 107:414e9c822e99 252 * \param[in] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 253 * \param[in] ul_channel Channel to read
mbed_official 107:414e9c822e99 254 *
mbed_official 107:414e9c822e99 255 * \return The TC Register B (RB) value.
mbed_official 107:414e9c822e99 256 */
mbed_official 107:414e9c822e99 257 uint32_t tc_read_rb(
mbed_official 107:414e9c822e99 258 Tc *p_tc,
mbed_official 107:414e9c822e99 259 uint32_t ul_channel)
mbed_official 107:414e9c822e99 260 {
mbed_official 107:414e9c822e99 261 /* Validate inputs. */
mbed_official 107:414e9c822e99 262 Assert(p_tc);
mbed_official 107:414e9c822e99 263 Assert(ul_channel <
mbed_official 107:414e9c822e99 264 (sizeof(p_tc->TC_CHANNEL) / sizeof(p_tc->TC_CHANNEL[0])));
mbed_official 107:414e9c822e99 265
mbed_official 107:414e9c822e99 266 return p_tc->TC_CHANNEL[ul_channel].TC_RB;
mbed_official 107:414e9c822e99 267 }
mbed_official 107:414e9c822e99 268
mbed_official 107:414e9c822e99 269 /**
mbed_official 107:414e9c822e99 270 * \brief Read TC Register C (RC) on the specified channel.
mbed_official 107:414e9c822e99 271 *
mbed_official 107:414e9c822e99 272 * \param[in] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 273 * \param[in] ul_channel Channel to read
mbed_official 107:414e9c822e99 274 *
mbed_official 107:414e9c822e99 275 * \return The Register C (RC) value.
mbed_official 107:414e9c822e99 276 */
mbed_official 107:414e9c822e99 277 uint32_t tc_read_rc(
mbed_official 107:414e9c822e99 278 Tc *p_tc,
mbed_official 107:414e9c822e99 279 uint32_t ul_channel)
mbed_official 107:414e9c822e99 280 {
mbed_official 107:414e9c822e99 281 /* Validate inputs. */
mbed_official 107:414e9c822e99 282 Assert(p_tc);
mbed_official 107:414e9c822e99 283 Assert(ul_channel <
mbed_official 107:414e9c822e99 284 (sizeof(p_tc->TC_CHANNEL) / sizeof(p_tc->TC_CHANNEL[0])));
mbed_official 107:414e9c822e99 285
mbed_official 107:414e9c822e99 286 return p_tc->TC_CHANNEL[ul_channel].TC_RC;
mbed_official 107:414e9c822e99 287 }
mbed_official 107:414e9c822e99 288
mbed_official 107:414e9c822e99 289 /**
mbed_official 107:414e9c822e99 290 * \brief Write to TC Register A (RA) on the specified channel.
mbed_official 107:414e9c822e99 291 *
mbed_official 107:414e9c822e99 292 * \param[out] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 293 * \param[in] ul_channel Channel to write
mbed_official 107:414e9c822e99 294 * \param[in] ul_value Value to write
mbed_official 107:414e9c822e99 295 */
mbed_official 107:414e9c822e99 296 void tc_write_ra(
mbed_official 107:414e9c822e99 297 Tc *p_tc,
mbed_official 107:414e9c822e99 298 uint32_t ul_channel,
mbed_official 107:414e9c822e99 299 uint32_t ul_value)
mbed_official 107:414e9c822e99 300 {
mbed_official 107:414e9c822e99 301 /* Validate inputs. */
mbed_official 107:414e9c822e99 302 Assert(p_tc);
mbed_official 107:414e9c822e99 303 Assert(ul_channel <
mbed_official 107:414e9c822e99 304 (sizeof(p_tc->TC_CHANNEL) / sizeof(p_tc->TC_CHANNEL[0])));
mbed_official 107:414e9c822e99 305
mbed_official 107:414e9c822e99 306 p_tc->TC_CHANNEL[ul_channel].TC_RA = ul_value;
mbed_official 107:414e9c822e99 307 }
mbed_official 107:414e9c822e99 308
mbed_official 107:414e9c822e99 309 /**
mbed_official 107:414e9c822e99 310 * \brief Write to TC Register B (RB) on the specified channel.
mbed_official 107:414e9c822e99 311 *
mbed_official 107:414e9c822e99 312 * \param[out] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 313 * \param[in] ul_channel Channel to write
mbed_official 107:414e9c822e99 314 * \param[in] ul_value Value to write
mbed_official 107:414e9c822e99 315 */
mbed_official 107:414e9c822e99 316 void tc_write_rb(
mbed_official 107:414e9c822e99 317 Tc *p_tc,
mbed_official 107:414e9c822e99 318 uint32_t ul_channel,
mbed_official 107:414e9c822e99 319 uint32_t ul_value)
mbed_official 107:414e9c822e99 320 {
mbed_official 107:414e9c822e99 321 /* Validate inputs. */
mbed_official 107:414e9c822e99 322 Assert(p_tc);
mbed_official 107:414e9c822e99 323 Assert(ul_channel <
mbed_official 107:414e9c822e99 324 (sizeof(p_tc->TC_CHANNEL) / sizeof(p_tc->TC_CHANNEL[0])));
mbed_official 107:414e9c822e99 325
mbed_official 107:414e9c822e99 326 p_tc->TC_CHANNEL[ul_channel].TC_RB = ul_value;
mbed_official 107:414e9c822e99 327 }
mbed_official 107:414e9c822e99 328
mbed_official 107:414e9c822e99 329 /**
mbed_official 107:414e9c822e99 330 * \brief Write to TC Register C (RC) on the selected channel.
mbed_official 107:414e9c822e99 331 *
mbed_official 107:414e9c822e99 332 * \param[out] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 333 * \param[in] ul_channel Channel to write
mbed_official 107:414e9c822e99 334 * \param[in] ul_value Value to write
mbed_official 107:414e9c822e99 335 */
mbed_official 107:414e9c822e99 336 void tc_write_rc(
mbed_official 107:414e9c822e99 337 Tc *p_tc,
mbed_official 107:414e9c822e99 338 uint32_t ul_channel,
mbed_official 107:414e9c822e99 339 uint32_t ul_value)
mbed_official 107:414e9c822e99 340 {
mbed_official 107:414e9c822e99 341 /* Validate inputs. */
mbed_official 107:414e9c822e99 342 Assert(p_tc);
mbed_official 107:414e9c822e99 343 Assert(ul_channel <
mbed_official 107:414e9c822e99 344 (sizeof(p_tc->TC_CHANNEL) / sizeof(p_tc->TC_CHANNEL[0])));
mbed_official 107:414e9c822e99 345
mbed_official 107:414e9c822e99 346 p_tc->TC_CHANNEL[ul_channel].TC_RC = ul_value;
mbed_official 107:414e9c822e99 347 }
mbed_official 107:414e9c822e99 348
mbed_official 107:414e9c822e99 349 /**
mbed_official 107:414e9c822e99 350 * \brief Enable the TC interrupts on the specified channel.
mbed_official 107:414e9c822e99 351 *
mbed_official 107:414e9c822e99 352 * \param[in,out] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 353 * \param[in] ul_channel Channel to configure
mbed_official 107:414e9c822e99 354 * \param[in] ul_sources Bitmask of interrupt sources
mbed_official 107:414e9c822e99 355 *
mbed_official 107:414e9c822e99 356 * Where the input parameter <i>ul_sources</i> can be one or more of the following:
mbed_official 107:414e9c822e99 357 * <table>
mbed_official 107:414e9c822e99 358 * <tr>
mbed_official 107:414e9c822e99 359 * <th>Parameter Value</th>
mbed_official 107:414e9c822e99 360 * <th>Description</th>
mbed_official 107:414e9c822e99 361 * </tr>
mbed_official 107:414e9c822e99 362 * <tr><td>TC_IER_COVFS</td><td>Enables the Counter Overflow Interrupt</td></tr>
mbed_official 107:414e9c822e99 363 * <tr><td>TC_IER_LOVRS</td><td>Enables the Load Overrun Interrupt</td></tr>
mbed_official 107:414e9c822e99 364 * <tr><td>TC_IER_CPAS</td><td>Enables the RA Compare Interrupt</td></tr>
mbed_official 107:414e9c822e99 365 * <tr><td>TC_IER_CPBS</td><td>Enables the RB Compare Interrupt</td></tr>
mbed_official 107:414e9c822e99 366 * <tr><td>TC_IER_CPCS</td><td>Enables the RC Compare Interrupt</td></tr>
mbed_official 107:414e9c822e99 367 * <tr><td>TC_IER_LDRAS</td><td>Enables the RA Load Interrupt</td></tr>
mbed_official 107:414e9c822e99 368 * <tr><td>TC_IER_LDRBS</td><td>Enables the RB Load Interrupt</td></tr>
mbed_official 107:414e9c822e99 369 * <tr><td>TC_IER_ETRGS</td><td>Enables the External Trigger Interrupt</td></tr>
mbed_official 107:414e9c822e99 370 * </table>
mbed_official 107:414e9c822e99 371 */
mbed_official 107:414e9c822e99 372 void tc_enable_interrupt(
mbed_official 107:414e9c822e99 373 Tc *p_tc,
mbed_official 107:414e9c822e99 374 uint32_t ul_channel,
mbed_official 107:414e9c822e99 375 uint32_t ul_sources)
mbed_official 107:414e9c822e99 376 {
mbed_official 107:414e9c822e99 377 TcChannel *tc_channel;
mbed_official 107:414e9c822e99 378
mbed_official 107:414e9c822e99 379 /* Validate inputs. */
mbed_official 107:414e9c822e99 380 Assert(p_tc);
mbed_official 107:414e9c822e99 381 Assert(ul_channel <
mbed_official 107:414e9c822e99 382 (sizeof(p_tc->TC_CHANNEL) / sizeof(p_tc->TC_CHANNEL[0])));
mbed_official 107:414e9c822e99 383 tc_channel = p_tc->TC_CHANNEL + ul_channel;
mbed_official 107:414e9c822e99 384 tc_channel->TC_IER = ul_sources;
mbed_official 107:414e9c822e99 385 }
mbed_official 107:414e9c822e99 386
mbed_official 107:414e9c822e99 387 /**
mbed_official 107:414e9c822e99 388 * \brief Disable TC interrupts on the specified channel.
mbed_official 107:414e9c822e99 389 *
mbed_official 107:414e9c822e99 390 * \param[in,out] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 391 * \param[in] ul_channel Channel to configure
mbed_official 107:414e9c822e99 392 * \param[in] ul_sources A bitmask of Interrupt sources
mbed_official 107:414e9c822e99 393 *
mbed_official 107:414e9c822e99 394 * Where the input parameter <i>ul_sources</i> can be one or more of the following:
mbed_official 107:414e9c822e99 395 * <table>
mbed_official 107:414e9c822e99 396 * <tr>
mbed_official 107:414e9c822e99 397 * <th>Parameter Value</th>
mbed_official 107:414e9c822e99 398 * <th>Description</th>
mbed_official 107:414e9c822e99 399 * </tr>
mbed_official 107:414e9c822e99 400 * <tr><td>TC_IDR_COVFS</td><td>Disables the Counter Overflow Interrupt</td></tr>
mbed_official 107:414e9c822e99 401 * <tr><td>TC_IDR_LOVRS</td><td>Disables the Load Overrun Interrupt</td></tr>
mbed_official 107:414e9c822e99 402 * <tr><td>TC_IDR_CPAS</td><td>Disables the RA Compare Interrupt</td></tr>
mbed_official 107:414e9c822e99 403 * <tr><td>TC_IDR_CPBS</td><td>Disables the RB Compare Interrupt</td></tr>
mbed_official 107:414e9c822e99 404 * <tr><td>TC_IDR_CPCS</td><td>Disables the RC Compare Interrupt</td></tr>
mbed_official 107:414e9c822e99 405 * <tr><td>TC_IDR_LDRAS</td><td>Disables the RA Load Interrupt</td></tr>
mbed_official 107:414e9c822e99 406 * <tr><td>TC_IDR_LDRBS</td><td>Disables the RB Load Interrupt</td></tr>
mbed_official 107:414e9c822e99 407 * <tr><td>TC_IDR_ETRGS</td><td>Disables the External Trigger Interrupt</td></tr>
mbed_official 107:414e9c822e99 408 * </table>
mbed_official 107:414e9c822e99 409 */
mbed_official 107:414e9c822e99 410 void tc_disable_interrupt(
mbed_official 107:414e9c822e99 411 Tc *p_tc,
mbed_official 107:414e9c822e99 412 uint32_t ul_channel,
mbed_official 107:414e9c822e99 413 uint32_t ul_sources)
mbed_official 107:414e9c822e99 414 {
mbed_official 107:414e9c822e99 415 TcChannel *tc_channel;
mbed_official 107:414e9c822e99 416
mbed_official 107:414e9c822e99 417 /* Validate inputs. */
mbed_official 107:414e9c822e99 418 Assert(p_tc);
mbed_official 107:414e9c822e99 419 Assert(ul_channel <
mbed_official 107:414e9c822e99 420 (sizeof(p_tc->TC_CHANNEL) / sizeof(p_tc->TC_CHANNEL[0])));
mbed_official 107:414e9c822e99 421 tc_channel = p_tc->TC_CHANNEL + ul_channel;
mbed_official 107:414e9c822e99 422 tc_channel->TC_IDR = ul_sources;
mbed_official 107:414e9c822e99 423 }
mbed_official 107:414e9c822e99 424
mbed_official 107:414e9c822e99 425 /**
mbed_official 107:414e9c822e99 426 * \brief Read the TC interrupt mask for the specified channel.
mbed_official 107:414e9c822e99 427 *
mbed_official 107:414e9c822e99 428 * \param[in] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 429 * \param[in] ul_channel Channel to read
mbed_official 107:414e9c822e99 430 *
mbed_official 107:414e9c822e99 431 * \return The TC interrupt mask value.
mbed_official 107:414e9c822e99 432 */
mbed_official 107:414e9c822e99 433 uint32_t tc_get_interrupt_mask(
mbed_official 107:414e9c822e99 434 Tc *p_tc,
mbed_official 107:414e9c822e99 435 uint32_t ul_channel)
mbed_official 107:414e9c822e99 436 {
mbed_official 107:414e9c822e99 437 TcChannel *tc_channel;
mbed_official 107:414e9c822e99 438
mbed_official 107:414e9c822e99 439 /* Validate inputs. */
mbed_official 107:414e9c822e99 440 Assert(p_tc);
mbed_official 107:414e9c822e99 441 Assert(ul_channel <
mbed_official 107:414e9c822e99 442 (sizeof(p_tc->TC_CHANNEL) / sizeof(p_tc->TC_CHANNEL[0])));
mbed_official 107:414e9c822e99 443 tc_channel = p_tc->TC_CHANNEL + ul_channel;
mbed_official 107:414e9c822e99 444 return tc_channel->TC_IMR;
mbed_official 107:414e9c822e99 445 }
mbed_official 107:414e9c822e99 446
mbed_official 107:414e9c822e99 447 /**
mbed_official 107:414e9c822e99 448 * \brief Get the current status for the specified TC channel.
mbed_official 107:414e9c822e99 449 *
mbed_official 107:414e9c822e99 450 * \param[in] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 451 * \param[in] ul_channel Channel number
mbed_official 107:414e9c822e99 452 *
mbed_official 107:414e9c822e99 453 * \return The current TC status.
mbed_official 107:414e9c822e99 454 */
mbed_official 107:414e9c822e99 455 uint32_t tc_get_status(
mbed_official 107:414e9c822e99 456 Tc *p_tc,
mbed_official 107:414e9c822e99 457 uint32_t ul_channel)
mbed_official 107:414e9c822e99 458 {
mbed_official 107:414e9c822e99 459 TcChannel *tc_channel;
mbed_official 107:414e9c822e99 460
mbed_official 107:414e9c822e99 461 /* Validate inputs. */
mbed_official 107:414e9c822e99 462 Assert(p_tc);
mbed_official 107:414e9c822e99 463 Assert(ul_channel <
mbed_official 107:414e9c822e99 464 (sizeof(p_tc->TC_CHANNEL) / sizeof(p_tc->TC_CHANNEL[0])));
mbed_official 107:414e9c822e99 465
mbed_official 107:414e9c822e99 466 tc_channel = p_tc->TC_CHANNEL + ul_channel;
mbed_official 107:414e9c822e99 467 return tc_channel->TC_SR;
mbed_official 107:414e9c822e99 468 }
mbed_official 107:414e9c822e99 469
mbed_official 107:414e9c822e99 470 /* TC divisor used to find the lowest acceptable timer frequency */
mbed_official 107:414e9c822e99 471 #define TC_DIV_FACTOR 65536
mbed_official 107:414e9c822e99 472
mbed_official 107:414e9c822e99 473 #if (!SAM4L) && !defined(__DOXYGEN__)
mbed_official 107:414e9c822e99 474
mbed_official 107:414e9c822e99 475 #ifndef FREQ_SLOW_CLOCK_EXT
mbed_official 107:414e9c822e99 476 #define FREQ_SLOW_CLOCK_EXT 32768 /* External slow clock frequency (hz) */
mbed_official 107:414e9c822e99 477 #endif
mbed_official 107:414e9c822e99 478
mbed_official 107:414e9c822e99 479 /**
mbed_official 107:414e9c822e99 480 * \brief Find the best MCK divisor.
mbed_official 107:414e9c822e99 481 *
mbed_official 107:414e9c822e99 482 * Finds the best MCK divisor given the timer frequency and MCK. The result
mbed_official 107:414e9c822e99 483 * is guaranteed to satisfy the following equation:
mbed_official 107:414e9c822e99 484 * \code (MCK / (DIV * 65536)) <= freq <= (MCK / DIV) \endcode
mbed_official 107:414e9c822e99 485 * With DIV being the lowest possible value, to maximize timing adjust resolution.
mbed_official 107:414e9c822e99 486 *
mbed_official 107:414e9c822e99 487 * \param[in] ul_freq Desired timer frequency
mbed_official 107:414e9c822e99 488 * \param[in] ul_mck Master clock frequency
mbed_official 107:414e9c822e99 489 * \param[out] p_uldiv Divisor value
mbed_official 107:414e9c822e99 490 * \param[out] p_ultcclks TCCLKS field value for divisor
mbed_official 107:414e9c822e99 491 * \param[in] ul_boardmck Board clock frequency
mbed_official 107:414e9c822e99 492 *
mbed_official 107:414e9c822e99 493 * \return The divisor found status.
mbed_official 107:414e9c822e99 494 * \retval 0 No suitable divisor was found
mbed_official 107:414e9c822e99 495 * \retval 1 A divisor was found
mbed_official 107:414e9c822e99 496 */
mbed_official 107:414e9c822e99 497 uint32_t tc_find_mck_divisor(
mbed_official 107:414e9c822e99 498 uint32_t ul_freq,
mbed_official 107:414e9c822e99 499 uint32_t ul_mck,
mbed_official 107:414e9c822e99 500 uint32_t *p_uldiv,
mbed_official 107:414e9c822e99 501 uint32_t *p_ultcclks,
mbed_official 107:414e9c822e99 502 uint32_t ul_boardmck)
mbed_official 107:414e9c822e99 503 {
mbed_official 107:414e9c822e99 504 const uint32_t divisors[5] = { 2, 8, 32, 128,
mbed_official 107:414e9c822e99 505 ul_boardmck / FREQ_SLOW_CLOCK_EXT
mbed_official 107:414e9c822e99 506 };
mbed_official 107:414e9c822e99 507 uint32_t ul_index;
mbed_official 107:414e9c822e99 508 uint32_t ul_high, ul_low;
mbed_official 107:414e9c822e99 509
mbed_official 107:414e9c822e99 510 /* Satisfy frequency bound. */
mbed_official 107:414e9c822e99 511 for (ul_index = 0;
mbed_official 107:414e9c822e99 512 ul_index < (sizeof(divisors) / sizeof(divisors[0]));
mbed_official 107:414e9c822e99 513 ul_index++) {
mbed_official 107:414e9c822e99 514 ul_high = ul_mck / divisors[ul_index];
mbed_official 107:414e9c822e99 515 ul_low = ul_high / TC_DIV_FACTOR;
mbed_official 107:414e9c822e99 516 if (ul_freq > ul_high) {
mbed_official 107:414e9c822e99 517 return 0;
mbed_official 107:414e9c822e99 518 } else if (ul_freq >= ul_low) {
mbed_official 107:414e9c822e99 519 break;
mbed_official 107:414e9c822e99 520 }
mbed_official 107:414e9c822e99 521 }
mbed_official 107:414e9c822e99 522 if (ul_index >= (sizeof(divisors) / sizeof(divisors[0]))) {
mbed_official 107:414e9c822e99 523 return 0;
mbed_official 107:414e9c822e99 524 }
mbed_official 107:414e9c822e99 525
mbed_official 107:414e9c822e99 526 /* Store results. */
mbed_official 107:414e9c822e99 527 if (p_uldiv) {
mbed_official 107:414e9c822e99 528 *p_uldiv = divisors[ul_index];
mbed_official 107:414e9c822e99 529 }
mbed_official 107:414e9c822e99 530
mbed_official 107:414e9c822e99 531 if (p_ultcclks) {
mbed_official 107:414e9c822e99 532 *p_ultcclks = ul_index;
mbed_official 107:414e9c822e99 533 }
mbed_official 107:414e9c822e99 534
mbed_official 107:414e9c822e99 535 return 1;
mbed_official 107:414e9c822e99 536 }
mbed_official 107:414e9c822e99 537
mbed_official 107:414e9c822e99 538 #endif /* (!SAM4L) */
mbed_official 107:414e9c822e99 539
mbed_official 107:414e9c822e99 540 #if (SAM4L) || defined(__DOXYGEN__)
mbed_official 107:414e9c822e99 541 /**
mbed_official 107:414e9c822e99 542 * \brief Find the best PBA/MCK divisor.
mbed_official 107:414e9c822e99 543 *
mbed_official 107:414e9c822e99 544 * <b>For SAM4L devices:</b> Finds the best PBA divisor given the timer
mbed_official 107:414e9c822e99 545 * frequency and PBA clock. The result is guaranteed to satisfy the following equation:
mbed_official 107:414e9c822e99 546 * \code (ul_pbaclk / (2* DIV * 65536)) <= freq <= (ul_pbaclk / (2* DIV)) \endcode
mbed_official 107:414e9c822e99 547 * with DIV being the lowest possible value, to maximize timing adjust resolution.
mbed_official 107:414e9c822e99 548 *
mbed_official 107:414e9c822e99 549 * <b>For non SAM4L devices:</b> Finds the best MCK divisor given the timer frequency
mbed_official 107:414e9c822e99 550 * and MCK. The result is guaranteed to satisfy the following equation:
mbed_official 107:414e9c822e99 551 * \code (MCK / (DIV * 65536)) <= freq <= (MCK / DIV) \endcode
mbed_official 107:414e9c822e99 552 * with DIV being the lowest possible value, to maximize timing adjust resolution.
mbed_official 107:414e9c822e99 553 *
mbed_official 107:414e9c822e99 554 * \param[in] ul_freq Desired timer frequency
mbed_official 107:414e9c822e99 555 * \param[in] ul_mck PBA clock frequency
mbed_official 107:414e9c822e99 556 * \param[out] p_uldiv Divisor value
mbed_official 107:414e9c822e99 557 * \param[out] p_ultcclks TCCLKS field value for divisor
mbed_official 107:414e9c822e99 558 * \param[in] ul_boardmck Board clock frequency (set to 0 for SAM4L devices)
mbed_official 107:414e9c822e99 559 *
mbed_official 107:414e9c822e99 560 * \return The divisor found status.
mbed_official 107:414e9c822e99 561 * \retval 0 No suitable divisor was found
mbed_official 107:414e9c822e99 562 * \retval 1 A divisor was found
mbed_official 107:414e9c822e99 563 */
mbed_official 107:414e9c822e99 564 uint32_t tc_find_mck_divisor(
mbed_official 107:414e9c822e99 565 uint32_t ul_freq,
mbed_official 107:414e9c822e99 566 uint32_t ul_mck,
mbed_official 107:414e9c822e99 567 uint32_t *p_uldiv,
mbed_official 107:414e9c822e99 568 uint32_t *p_ultcclks,
mbed_official 107:414e9c822e99 569 uint32_t ul_boardmck)
mbed_official 107:414e9c822e99 570 {
mbed_official 107:414e9c822e99 571 const uint32_t divisors[5] = { 0, 2, 8, 32, 128};
mbed_official 107:414e9c822e99 572 uint32_t ul_index;
mbed_official 107:414e9c822e99 573 uint32_t ul_high, ul_low;
mbed_official 107:414e9c822e99 574
mbed_official 107:414e9c822e99 575 UNUSED(ul_boardmck);
mbed_official 107:414e9c822e99 576
mbed_official 107:414e9c822e99 577 /* Satisfy frequency bound. */
mbed_official 107:414e9c822e99 578 for (ul_index = 1;
mbed_official 107:414e9c822e99 579 ul_index < (sizeof(divisors) / sizeof(divisors[0]));
mbed_official 107:414e9c822e99 580 ul_index++) {
mbed_official 107:414e9c822e99 581 ul_high = ul_mck / divisors[ul_index];
mbed_official 107:414e9c822e99 582 ul_low = ul_high / TC_DIV_FACTOR;
mbed_official 107:414e9c822e99 583 if (ul_freq > ul_high) {
mbed_official 107:414e9c822e99 584 return 0;
mbed_official 107:414e9c822e99 585 } else if (ul_freq >= ul_low) {
mbed_official 107:414e9c822e99 586 break;
mbed_official 107:414e9c822e99 587 }
mbed_official 107:414e9c822e99 588 }
mbed_official 107:414e9c822e99 589 if (ul_index >= (sizeof(divisors) / sizeof(divisors[0]))) {
mbed_official 107:414e9c822e99 590 return 0;
mbed_official 107:414e9c822e99 591 }
mbed_official 107:414e9c822e99 592
mbed_official 107:414e9c822e99 593 /* Store results. */
mbed_official 107:414e9c822e99 594 if (p_uldiv) {
mbed_official 107:414e9c822e99 595 *p_uldiv = divisors[ul_index];
mbed_official 107:414e9c822e99 596 }
mbed_official 107:414e9c822e99 597
mbed_official 107:414e9c822e99 598 if (p_ultcclks) {
mbed_official 107:414e9c822e99 599 *p_ultcclks = ul_index;
mbed_official 107:414e9c822e99 600 }
mbed_official 107:414e9c822e99 601
mbed_official 107:414e9c822e99 602 return 1;
mbed_official 107:414e9c822e99 603 }
mbed_official 107:414e9c822e99 604
mbed_official 107:414e9c822e99 605 #endif /* (SAM4L) || defined(__DOXYGEN__) */
mbed_official 107:414e9c822e99 606
mbed_official 107:414e9c822e99 607 #if (!SAM4L && !SAMG) || defined(__DOXYGEN__)
mbed_official 107:414e9c822e99 608
mbed_official 107:414e9c822e99 609 /**
mbed_official 107:414e9c822e99 610 * \brief Enable TC QDEC interrupts.
mbed_official 107:414e9c822e99 611 *
mbed_official 107:414e9c822e99 612 * \note This function is not available on SAM4L or SAMG devices.
mbed_official 107:414e9c822e99 613 *
mbed_official 107:414e9c822e99 614 * \param[out] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 615 * \param[in] ul_sources A bitmask of QDEC interrupts to be enabled
mbed_official 107:414e9c822e99 616 *
mbed_official 107:414e9c822e99 617 * Where the input parameter <i>ul_sources</i> can be one or more of the following:
mbed_official 107:414e9c822e99 618 * <table>
mbed_official 107:414e9c822e99 619 * <tr>
mbed_official 107:414e9c822e99 620 * <th>Parameter Value</th>
mbed_official 107:414e9c822e99 621 * <th>Description</th>
mbed_official 107:414e9c822e99 622 * </tr>
mbed_official 107:414e9c822e99 623 * <tr><td>TC_QIER_IDX</td><td>Enable the rising edge detected on IDX input interrupt</td></tr>
mbed_official 107:414e9c822e99 624 * <tr><td>TC_QIER_DIRCHG</td><td>Enable the change in rotation direction detected interrupt</td></tr>
mbed_official 107:414e9c822e99 625 * <tr><td>TC_QIER_QERR</td><td>Enable the quadrature error detected on PHA/PHB interrupt</td></tr>
mbed_official 107:414e9c822e99 626 * </table>
mbed_official 107:414e9c822e99 627 */
mbed_official 107:414e9c822e99 628 void tc_enable_qdec_interrupt(
mbed_official 107:414e9c822e99 629 Tc *p_tc,
mbed_official 107:414e9c822e99 630 uint32_t ul_sources)
mbed_official 107:414e9c822e99 631 {
mbed_official 107:414e9c822e99 632 /* Validate inputs. */
mbed_official 107:414e9c822e99 633 Assert(p_tc);
mbed_official 107:414e9c822e99 634
mbed_official 107:414e9c822e99 635 p_tc->TC_QIER = ul_sources;
mbed_official 107:414e9c822e99 636 }
mbed_official 107:414e9c822e99 637
mbed_official 107:414e9c822e99 638 /**
mbed_official 107:414e9c822e99 639 * \brief Disable TC QDEC interrupts.
mbed_official 107:414e9c822e99 640 *
mbed_official 107:414e9c822e99 641 * \note This function is not available on SAM4L or SAMG devices.
mbed_official 107:414e9c822e99 642 *
mbed_official 107:414e9c822e99 643 * \param[out] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 644 * \param[in] ul_sources A bitmask of QDEC interrupts to be disabled
mbed_official 107:414e9c822e99 645 *
mbed_official 107:414e9c822e99 646 * Where the input parameter <i>ul_sources</i> can be one or more of the following:
mbed_official 107:414e9c822e99 647 * <table>
mbed_official 107:414e9c822e99 648 * <tr>
mbed_official 107:414e9c822e99 649 * <th>Parameter Value</th>
mbed_official 107:414e9c822e99 650 * <th>Description</th>
mbed_official 107:414e9c822e99 651 * </tr>
mbed_official 107:414e9c822e99 652 * <tr><td>TC_QIDR_IDX</td><td>Disable the rising edge detected on IDX input interrupt</td></tr>
mbed_official 107:414e9c822e99 653 * <tr><td>TC_QIDR_DIRCHG</td><td>Disable the change in rotation direction detected interrupt</td></tr>
mbed_official 107:414e9c822e99 654 * <tr><td>TC_QIDR_QERR</td><td>Disable the quadrature error detected on PHA/PHB interrupt</td></tr>
mbed_official 107:414e9c822e99 655 * </table>
mbed_official 107:414e9c822e99 656 */
mbed_official 107:414e9c822e99 657 void tc_disable_qdec_interrupt(
mbed_official 107:414e9c822e99 658 Tc *p_tc,
mbed_official 107:414e9c822e99 659 uint32_t ul_sources)
mbed_official 107:414e9c822e99 660 {
mbed_official 107:414e9c822e99 661 /* Validate inputs. */
mbed_official 107:414e9c822e99 662 Assert(p_tc);
mbed_official 107:414e9c822e99 663
mbed_official 107:414e9c822e99 664 p_tc->TC_QIDR = ul_sources;
mbed_official 107:414e9c822e99 665 }
mbed_official 107:414e9c822e99 666
mbed_official 107:414e9c822e99 667 /**
mbed_official 107:414e9c822e99 668 * \brief Read TC QDEC interrupt mask.
mbed_official 107:414e9c822e99 669 *
mbed_official 107:414e9c822e99 670 * \note This function is not available on SAM4L or SAMG devices.
mbed_official 107:414e9c822e99 671 *
mbed_official 107:414e9c822e99 672 * \param[in] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 673 *
mbed_official 107:414e9c822e99 674 * \return The QDEC interrupt mask value.
mbed_official 107:414e9c822e99 675 */
mbed_official 107:414e9c822e99 676 uint32_t tc_get_qdec_interrupt_mask(
mbed_official 107:414e9c822e99 677 Tc *p_tc)
mbed_official 107:414e9c822e99 678 {
mbed_official 107:414e9c822e99 679 /* Validate inputs. */
mbed_official 107:414e9c822e99 680 Assert(p_tc);
mbed_official 107:414e9c822e99 681
mbed_official 107:414e9c822e99 682 return p_tc->TC_QIMR;
mbed_official 107:414e9c822e99 683 }
mbed_official 107:414e9c822e99 684
mbed_official 107:414e9c822e99 685 /**
mbed_official 107:414e9c822e99 686 * \brief Get current TC QDEC interrupt status.
mbed_official 107:414e9c822e99 687 *
mbed_official 107:414e9c822e99 688 * \note This function is not available on SAM4L or SAMG devices.
mbed_official 107:414e9c822e99 689 *
mbed_official 107:414e9c822e99 690 * \param[in] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 691 *
mbed_official 107:414e9c822e99 692 * \return The TC QDEC interrupt status.
mbed_official 107:414e9c822e99 693 */
mbed_official 107:414e9c822e99 694 uint32_t tc_get_qdec_interrupt_status(
mbed_official 107:414e9c822e99 695 Tc *p_tc)
mbed_official 107:414e9c822e99 696 {
mbed_official 107:414e9c822e99 697 /* Validate inputs. */
mbed_official 107:414e9c822e99 698 Assert(p_tc);
mbed_official 107:414e9c822e99 699
mbed_official 107:414e9c822e99 700 return p_tc->TC_QISR;
mbed_official 107:414e9c822e99 701 }
mbed_official 107:414e9c822e99 702
mbed_official 107:414e9c822e99 703 #endif /* (!SAM4L && !SAMG) || defined(__DOXYGEN__) */
mbed_official 107:414e9c822e99 704
mbed_official 107:414e9c822e99 705 #if (!SAM3U) || defined(__DOXYGEN__)
mbed_official 107:414e9c822e99 706
mbed_official 107:414e9c822e99 707 /**
mbed_official 107:414e9c822e99 708 * \brief Enable or disable write protection of TC registers.
mbed_official 107:414e9c822e99 709 *
mbed_official 107:414e9c822e99 710 * \note This function is not available on SAM3U devices.
mbed_official 107:414e9c822e99 711 *
mbed_official 107:414e9c822e99 712 * \param[out] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 713 * \param[in] ul_enable 1 to enable, 0 to disable
mbed_official 107:414e9c822e99 714 */
mbed_official 107:414e9c822e99 715 void tc_set_writeprotect(
mbed_official 107:414e9c822e99 716 Tc *p_tc,
mbed_official 107:414e9c822e99 717 uint32_t ul_enable)
mbed_official 107:414e9c822e99 718 {
mbed_official 107:414e9c822e99 719 /* Validate inputs. */
mbed_official 107:414e9c822e99 720 Assert(p_tc);
mbed_official 107:414e9c822e99 721
mbed_official 107:414e9c822e99 722 if (ul_enable) {
mbed_official 107:414e9c822e99 723 p_tc->TC_WPMR = TC_WPMR_WPKEY_PASSWD | TC_WPMR_WPEN;
mbed_official 107:414e9c822e99 724 } else {
mbed_official 107:414e9c822e99 725 p_tc->TC_WPMR = TC_WPMR_WPKEY_PASSWD;
mbed_official 107:414e9c822e99 726 }
mbed_official 107:414e9c822e99 727 }
mbed_official 107:414e9c822e99 728
mbed_official 107:414e9c822e99 729 #endif /* (!SAM3U) || defined(__DOXYGEN__) */
mbed_official 107:414e9c822e99 730
mbed_official 107:414e9c822e99 731 #if SAM4L || defined(__DOXYGEN__)
mbed_official 107:414e9c822e99 732
mbed_official 107:414e9c822e99 733 /**
mbed_official 107:414e9c822e99 734 * \brief Indicate TC features.
mbed_official 107:414e9c822e99 735 *
mbed_official 107:414e9c822e99 736 * \note This function is only available on SAM4L devices.
mbed_official 107:414e9c822e99 737 *
mbed_official 107:414e9c822e99 738 * \param[in] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 739 *
mbed_official 107:414e9c822e99 740 * \return The TC FEATURES register contents.
mbed_official 107:414e9c822e99 741 */
mbed_official 107:414e9c822e99 742 uint32_t tc_get_feature(
mbed_official 107:414e9c822e99 743 Tc *p_tc)
mbed_official 107:414e9c822e99 744 {
mbed_official 107:414e9c822e99 745 /* Validate inputs. */
mbed_official 107:414e9c822e99 746 Assert(p_tc);
mbed_official 107:414e9c822e99 747
mbed_official 107:414e9c822e99 748 return p_tc->TC_FEATURES;
mbed_official 107:414e9c822e99 749 }
mbed_official 107:414e9c822e99 750
mbed_official 107:414e9c822e99 751 /**
mbed_official 107:414e9c822e99 752 * \brief Indicate TC version.
mbed_official 107:414e9c822e99 753 *
mbed_official 107:414e9c822e99 754 * \note This function is only available on SAM4L devices.
mbed_official 107:414e9c822e99 755 *
mbed_official 107:414e9c822e99 756 * \param[in] p_tc Module hardware register base address pointer
mbed_official 107:414e9c822e99 757 *
mbed_official 107:414e9c822e99 758 * \return The TC VERSION register contents.
mbed_official 107:414e9c822e99 759 */
mbed_official 107:414e9c822e99 760 uint32_t tc_get_version(
mbed_official 107:414e9c822e99 761 Tc *p_tc)
mbed_official 107:414e9c822e99 762 {
mbed_official 107:414e9c822e99 763 /* Validate inputs. */
mbed_official 107:414e9c822e99 764 Assert(p_tc);
mbed_official 107:414e9c822e99 765
mbed_official 107:414e9c822e99 766 return p_tc->TC_VERSION;
mbed_official 107:414e9c822e99 767 }
mbed_official 107:414e9c822e99 768
mbed_official 107:414e9c822e99 769 #endif /* SAM4L || defined(__DOXYGEN__) */
mbed_official 107:414e9c822e99 770
mbed_official 107:414e9c822e99 771 /// @cond
mbed_official 107:414e9c822e99 772 /**INDENT-OFF**/
mbed_official 107:414e9c822e99 773 #ifdef __cplusplus
mbed_official 107:414e9c822e99 774 }
mbed_official 107:414e9c822e99 775 #endif
mbed_official 107:414e9c822e99 776 /**INDENT-ON**/
mbed_official 107:414e9c822e99 777 /// @endcond