1 /** 2 * \file 3 * 4 * \brief ARM functions for busy-wait delay loops 5 * 6 * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. 7 * 8 * \asf_license_start 9 * 10 * \page License 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions are met: 14 * 15 * 1. Redistributions of source code must retain the above copyright notice, 16 * this list of conditions and the following disclaimer. 17 * 18 * 2. Redistributions in binary form must reproduce the above copyright notice, 19 * this list of conditions and the following disclaimer in the documentation 20 * and/or other materials provided with the distribution. 21 * 22 * 3. The name of Atmel may not be used to endorse or promote products derived 23 * from this software without specific prior written permission. 24 * 25 * 4. This software may only be redistributed and used in connection with an 26 * Atmel microcontroller product. 27 * 28 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED 29 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE 31 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR 32 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 38 * POSSIBILITY OF SUCH DAMAGE. 39 * 40 * \asf_license_stop 41 * 42 */ 43 /* 44 * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a> 45 */ 46 #ifndef _cycle_counter_h_ 47 #define _cycle_counter_h_ 48 49 #ifdef __cplusplus 50 extern "C" { 51 #endif 52 53 54 #include <compiler.h> 55 56 /** 57 * @name Convenience functions for busy-wait delay loops 58 * 59 * @def delay_cycles 60 * @brief Delay program execution for a specified number of CPU cycles. 61 * @param n number of CPU cycles to wait 62 * 63 * @def cpu_delay_ms 64 * @brief Delay program execution for a specified number of milliseconds. 65 * @param delay number of milliseconds to wait 66 * @param f_cpu CPU frequency in Hertz 67 * 68 * @def cpu_delay_us 69 * @brief Delay program execution for a specified number of microseconds. 70 * @param delay number of microseconds to wait 71 * @param f_cpu CPU frequency in Hertz 72 * 73 * @def cpu_ms_2_cy 74 * @brief Convert milli-seconds into CPU cycles. 75 * @param ms number of milliseconds 76 * @param f_cpu CPU frequency in Hertz 77 * @return the converted number of CPU cycles 78 * 79 * @def cpu_us_2_cy 80 * @brief Convert micro-seconds into CPU cycles. 81 * @param ms number of microseconds 82 * @param f_cpu CPU frequency in Hertz 83 * @return the converted number of CPU cycles 84 * 85 * @{ 86 */ 87 88 /** 89 * \brief Delay loop to delay n number of cycles 90 * 91 * \note The function runs in internal RAM so that flash wait states 92 * will not affect the delay time. 93 * 94 * \param n Number of cycles 95 */ 96 void portable_delay_cycles(unsigned long n); 97 98 /* Cortex-M7 is faster than Cortex-M3/M4/M0+ */ 99 #ifdef __CM7_REV 100 101 # define cpu_ms_2_cy(ms, f_cpu) \ 102 (((uint64_t)(ms) * (f_cpu) + (uint64_t)(5.932e3 - 1ul)) / (uint64_t)5.932e3) 103 # define cpu_us_2_cy(us, f_cpu) \ 104 (((uint64_t)(us) * (f_cpu) + (uint64_t)(5.932e6 - 1ul)) / (uint64_t)5.932e6) 105 106 #else 107 108 # define cpu_ms_2_cy(ms, f_cpu) \ 109 (((uint64_t)(ms) * (f_cpu) + (uint64_t)(14e3 - 1ul)) / (uint64_t)14e3) 110 # define cpu_us_2_cy(us, f_cpu) \ 111 (((uint64_t)(us) * (f_cpu) + (uint64_t)(14e6 - 1ul)) / (uint64_t)14e6) 112 113 #endif 114 115 #define delay_cycles portable_delay_cycles 116 117 #define cpu_delay_ms(delay, f_cpu) delay_cycles(cpu_ms_2_cy(delay, f_cpu)) 118 #define cpu_delay_us(delay, f_cpu) delay_cycles(cpu_us_2_cy(delay, f_cpu)) 119 //! @} 120 121 122 #ifdef __cplusplus 123 } 124 #endif 125 126 #endif /* _cycle_counter_h_ */ 127