added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
144:ef7eb2e8f9f7
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /*
<> 144:ef7eb2e8f9f7 2 * Copyright (c) 2015, Freescale Semiconductor, Inc.
<> 144:ef7eb2e8f9f7 3 * All rights reserved.
<> 144:ef7eb2e8f9f7 4 *
<> 144:ef7eb2e8f9f7 5 * Redistribution and use in source and binary forms, with or without modification,
<> 144:ef7eb2e8f9f7 6 * are permitted provided that the following conditions are met:
<> 144:ef7eb2e8f9f7 7 *
<> 144:ef7eb2e8f9f7 8 * o Redistributions of source code must retain the above copyright notice, this list
<> 144:ef7eb2e8f9f7 9 * of conditions and the following disclaimer.
<> 144:ef7eb2e8f9f7 10 *
<> 144:ef7eb2e8f9f7 11 * o Redistributions in binary form must reproduce the above copyright notice, this
<> 144:ef7eb2e8f9f7 12 * list of conditions and the following disclaimer in the documentation and/or
<> 144:ef7eb2e8f9f7 13 * other materials provided with the distribution.
<> 144:ef7eb2e8f9f7 14 *
<> 144:ef7eb2e8f9f7 15 * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
<> 144:ef7eb2e8f9f7 16 * contributors may be used to endorse or promote products derived from this
<> 144:ef7eb2e8f9f7 17 * software without specific prior written permission.
<> 144:ef7eb2e8f9f7 18 *
<> 144:ef7eb2e8f9f7 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
<> 144:ef7eb2e8f9f7 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
<> 144:ef7eb2e8f9f7 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
<> 144:ef7eb2e8f9f7 22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
<> 144:ef7eb2e8f9f7 23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
<> 144:ef7eb2e8f9f7 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
<> 144:ef7eb2e8f9f7 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
<> 144:ef7eb2e8f9f7 26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
<> 144:ef7eb2e8f9f7 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
<> 144:ef7eb2e8f9f7 28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<> 144:ef7eb2e8f9f7 29 */
<> 144:ef7eb2e8f9f7 30
<> 144:ef7eb2e8f9f7 31 #ifndef _FSL_COMMON_H_
<> 144:ef7eb2e8f9f7 32 #define _FSL_COMMON_H_
<> 144:ef7eb2e8f9f7 33
<> 144:ef7eb2e8f9f7 34 #include <assert.h>
<> 144:ef7eb2e8f9f7 35 #include <stdbool.h>
<> 144:ef7eb2e8f9f7 36 #include <stdint.h>
<> 144:ef7eb2e8f9f7 37 #include <string.h>
<> 144:ef7eb2e8f9f7 38 #include "fsl_device_registers.h"
<> 144:ef7eb2e8f9f7 39
<> 144:ef7eb2e8f9f7 40 /*!
<> 144:ef7eb2e8f9f7 41 * @addtogroup ksdk_common
<> 144:ef7eb2e8f9f7 42 * @{
<> 144:ef7eb2e8f9f7 43 */
<> 144:ef7eb2e8f9f7 44
<> 144:ef7eb2e8f9f7 45 /*! @file */
<> 144:ef7eb2e8f9f7 46
<> 144:ef7eb2e8f9f7 47 /*******************************************************************************
<> 144:ef7eb2e8f9f7 48 * Definitions
<> 144:ef7eb2e8f9f7 49 ******************************************************************************/
<> 144:ef7eb2e8f9f7 50
<> 144:ef7eb2e8f9f7 51 /*! @brief Construct a status code value from a group and code number. */
<> 144:ef7eb2e8f9f7 52 #define MAKE_STATUS(group, code) ((((group)*100) + (code)))
<> 144:ef7eb2e8f9f7 53
<> 144:ef7eb2e8f9f7 54 /*! @brief Construct the version number for drivers. */
<> 144:ef7eb2e8f9f7 55 #define MAKE_VERSION(major, minor, bugfix) (((major) << 16) | ((minor) << 8) | (bugfix))
<> 144:ef7eb2e8f9f7 56
<> 144:ef7eb2e8f9f7 57 /* Debug console type definition. */
<> 144:ef7eb2e8f9f7 58 #define DEBUG_CONSOLE_DEVICE_TYPE_NONE 0U /*!< No debug console. */
<> 144:ef7eb2e8f9f7 59 #define DEBUG_CONSOLE_DEVICE_TYPE_UART 1U /*!< Debug console base on UART. */
<> 144:ef7eb2e8f9f7 60 #define DEBUG_CONSOLE_DEVICE_TYPE_LPUART 2U /*!< Debug console base on LPUART. */
<> 144:ef7eb2e8f9f7 61 #define DEBUG_CONSOLE_DEVICE_TYPE_LPSCI 3U /*!< Debug console base on LPSCI. */
<> 144:ef7eb2e8f9f7 62 #define DEBUG_CONSOLE_DEVICE_TYPE_USBCDC 4U /*!< Debug console base on USBCDC. */
<> 144:ef7eb2e8f9f7 63
<> 144:ef7eb2e8f9f7 64 /*! @brief Status group numbers. */
<> 144:ef7eb2e8f9f7 65 enum _status_groups
<> 144:ef7eb2e8f9f7 66 {
<> 144:ef7eb2e8f9f7 67 kStatusGroup_Generic = 0, /*!< Group number for generic status codes. */
<> 144:ef7eb2e8f9f7 68 kStatusGroup_FLASH = 1, /*!< Group number for FLASH status codes. */
<> 144:ef7eb2e8f9f7 69 kStatusGroup_LPSPI = 4, /*!< Group number for LPSPI status codes. */
<> 144:ef7eb2e8f9f7 70 kStatusGroup_FLEXIO_SPI = 5, /*!< Group number for FLEXIO SPI status codes. */
<> 144:ef7eb2e8f9f7 71 kStatusGroup_DSPI = 6, /*!< Group number for DSPI status codes. */
<> 144:ef7eb2e8f9f7 72 kStatusGroup_FLEXIO_UART = 7, /*!< Group number for FLEXIO UART status codes. */
<> 144:ef7eb2e8f9f7 73 kStatusGroup_FLEXIO_I2C = 8, /*!< Group number for FLEXIO I2C status codes. */
<> 144:ef7eb2e8f9f7 74 kStatusGroup_LPI2C = 9, /*!< Group number for LPI2C status codes. */
<> 144:ef7eb2e8f9f7 75 kStatusGroup_UART = 10, /*!< Group number for UART status codes. */
<> 144:ef7eb2e8f9f7 76 kStatusGroup_I2C = 11, /*!< Group number for UART status codes. */
<> 144:ef7eb2e8f9f7 77 kStatusGroup_LPSCI = 12, /*!< Group number for LPSCI status codes. */
<> 144:ef7eb2e8f9f7 78 kStatusGroup_LPUART = 13, /*!< Group number for LPUART status codes. */
<> 144:ef7eb2e8f9f7 79 kStatusGroup_SPI = 14, /*!< Group number for SPI status code.*/
<> 144:ef7eb2e8f9f7 80 kStatusGroup_XRDC = 15, /*!< Group number for XRDC status code.*/
<> 144:ef7eb2e8f9f7 81 kStatusGroup_SEMA42 = 16, /*!< Group number for SEMA42 status code.*/
<> 144:ef7eb2e8f9f7 82 kStatusGroup_SDHC = 17, /*!< Group number for SDHC status code */
<> 144:ef7eb2e8f9f7 83 kStatusGroup_SDMMC = 18, /*!< Group number for SDMMC status code */
<> 144:ef7eb2e8f9f7 84 kStatusGroup_SAI = 19, /*!< Group number for SAI status code */
<> 144:ef7eb2e8f9f7 85 kStatusGroup_MCG = 20, /*!< Group number for MCG status codes. */
<> 144:ef7eb2e8f9f7 86 kStatusGroup_SCG = 21, /*!< Group number for SCG status codes. */
<> 144:ef7eb2e8f9f7 87 kStatusGroup_SDSPI = 22, /*!< Group number for SDSPI status codes. */
<> 144:ef7eb2e8f9f7 88 kStatusGroup_FLEXIO_I2S = 23, /*!< Group number for FLEXIO I2S status codes */
<> 144:ef7eb2e8f9f7 89 kStatusGroup_SDRAMC = 35, /*!< Group number for SDRAMC status codes. */
<> 144:ef7eb2e8f9f7 90 kStatusGroup_POWER = 39, /*!< Group number for POWER status codes. */
<> 144:ef7eb2e8f9f7 91 kStatusGroup_ENET = 40, /*!< Group number for ENET status codes. */
<> 144:ef7eb2e8f9f7 92 kStatusGroup_PHY = 41, /*!< Group number for PHY status codes. */
<> 144:ef7eb2e8f9f7 93 kStatusGroup_TRGMUX = 42, /*!< Group number for TRGMUX status codes. */
<> 144:ef7eb2e8f9f7 94 kStatusGroup_SMARTCARD = 43, /*!< Group number for SMARTCARD status codes. */
<> 144:ef7eb2e8f9f7 95 kStatusGroup_LMEM = 44, /*!< Group number for LMEM status codes. */
<> 144:ef7eb2e8f9f7 96 kStatusGroup_QSPI = 45, /*!< Group number for QSPI status codes. */
<> 144:ef7eb2e8f9f7 97 kStatusGroup_DMA = 50, /*!< Group number for DMA status codes. */
<> 144:ef7eb2e8f9f7 98 kStatusGroup_EDMA = 51, /*!< Group number for EDMA status codes. */
<> 144:ef7eb2e8f9f7 99 kStatusGroup_DMAMGR = 52, /*!< Group number for DMAMGR status codes. */
<> 144:ef7eb2e8f9f7 100 kStatusGroup_FLEXCAN = 53, /*!< Group number for FlexCAN status codes. */
<> 144:ef7eb2e8f9f7 101 kStatusGroup_LTC = 54, /*!< Group number for LTC status codes. */
<> 144:ef7eb2e8f9f7 102 kStatusGroup_FLEXIO_CAMERA = 55, /*!< Group number for FLEXIO CAMERA status codes. */
<> 144:ef7eb2e8f9f7 103 kStatusGroup_NOTIFIER = 98, /*!< Group number for NOTIFIER status codes. */
<> 144:ef7eb2e8f9f7 104 kStatusGroup_DebugConsole = 99, /*!< Group number for debug console status codes. */
<> 144:ef7eb2e8f9f7 105 kStatusGroup_ApplicationRangeStart = 100, /*!< Starting number for application groups. */
<> 144:ef7eb2e8f9f7 106 };
<> 144:ef7eb2e8f9f7 107
<> 144:ef7eb2e8f9f7 108 /*! @brief Generic status return codes. */
<> 144:ef7eb2e8f9f7 109 enum _generic_status
<> 144:ef7eb2e8f9f7 110 {
<> 144:ef7eb2e8f9f7 111 kStatus_Success = MAKE_STATUS(kStatusGroup_Generic, 0),
<> 144:ef7eb2e8f9f7 112 kStatus_Fail = MAKE_STATUS(kStatusGroup_Generic, 1),
<> 144:ef7eb2e8f9f7 113 kStatus_ReadOnly = MAKE_STATUS(kStatusGroup_Generic, 2),
<> 144:ef7eb2e8f9f7 114 kStatus_OutOfRange = MAKE_STATUS(kStatusGroup_Generic, 3),
<> 144:ef7eb2e8f9f7 115 kStatus_InvalidArgument = MAKE_STATUS(kStatusGroup_Generic, 4),
<> 144:ef7eb2e8f9f7 116 kStatus_Timeout = MAKE_STATUS(kStatusGroup_Generic, 5),
<> 144:ef7eb2e8f9f7 117 kStatus_NoTransferInProgress = MAKE_STATUS(kStatusGroup_Generic, 6),
<> 144:ef7eb2e8f9f7 118 };
<> 144:ef7eb2e8f9f7 119
<> 144:ef7eb2e8f9f7 120 /*! @brief Type used for all status and error return values. */
<> 144:ef7eb2e8f9f7 121 typedef int32_t status_t;
<> 144:ef7eb2e8f9f7 122
<> 144:ef7eb2e8f9f7 123 /*
<> 144:ef7eb2e8f9f7 124 * The fsl_clock.h is included here because it needs MAKE_VERSION/MAKE_STATUS/status_t
<> 144:ef7eb2e8f9f7 125 * defined in previous of this file.
<> 144:ef7eb2e8f9f7 126 */
<> 144:ef7eb2e8f9f7 127 #include "fsl_clock.h"
<> 144:ef7eb2e8f9f7 128
<> 144:ef7eb2e8f9f7 129 /*! @name Min/max macros */
<> 144:ef7eb2e8f9f7 130 /* @{ */
<> 144:ef7eb2e8f9f7 131 #if !defined(MIN)
<> 144:ef7eb2e8f9f7 132 #define MIN(a, b) ((a) < (b) ? (a) : (b))
<> 144:ef7eb2e8f9f7 133 #endif
<> 144:ef7eb2e8f9f7 134
<> 144:ef7eb2e8f9f7 135 #if !defined(MAX)
<> 144:ef7eb2e8f9f7 136 #define MAX(a, b) ((a) > (b) ? (a) : (b))
<> 144:ef7eb2e8f9f7 137 #endif
<> 144:ef7eb2e8f9f7 138 /* @} */
<> 144:ef7eb2e8f9f7 139
<> 144:ef7eb2e8f9f7 140 /*! @brief Computes the number of elements in an array. */
<> 144:ef7eb2e8f9f7 141 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
<> 144:ef7eb2e8f9f7 142
<> 144:ef7eb2e8f9f7 143 /*! @name UINT16_MAX/UINT32_MAX value */
<> 144:ef7eb2e8f9f7 144 /* @{ */
<> 144:ef7eb2e8f9f7 145 #if !defined(UINT16_MAX)
<> 144:ef7eb2e8f9f7 146 #define UINT16_MAX ((uint16_t)-1)
<> 144:ef7eb2e8f9f7 147 #endif
<> 144:ef7eb2e8f9f7 148
<> 144:ef7eb2e8f9f7 149 #if !defined(UINT32_MAX)
<> 144:ef7eb2e8f9f7 150 #define UINT32_MAX ((uint32_t)-1)
<> 144:ef7eb2e8f9f7 151 #endif
<> 144:ef7eb2e8f9f7 152 /* @} */
<> 144:ef7eb2e8f9f7 153
<> 144:ef7eb2e8f9f7 154 /*! @name Timer utilities */
<> 144:ef7eb2e8f9f7 155 /* @{ */
<> 144:ef7eb2e8f9f7 156 /*! Macro to convert a microsecond period to raw count value */
<> 144:ef7eb2e8f9f7 157 #define USEC_TO_COUNT(us, clockFreqInHz) (uint64_t)((uint64_t)us * clockFreqInHz / 1000000U)
<> 144:ef7eb2e8f9f7 158 /*! Macro to convert a raw count value to microsecond */
<> 144:ef7eb2e8f9f7 159 #define COUNT_TO_USEC(count, clockFreqInHz) (uint64_t)((uint64_t)count * 1000000U / clockFreqInHz)
<> 144:ef7eb2e8f9f7 160
<> 144:ef7eb2e8f9f7 161 /*! Macro to convert a millisecond period to raw count value */
<> 144:ef7eb2e8f9f7 162 #define MSEC_TO_COUNT(ms, clockFreqInHz) (uint64_t)((uint64_t)ms * clockFreqInHz / 1000U)
<> 144:ef7eb2e8f9f7 163 /*! Macro to convert a raw count value to millisecond */
<> 144:ef7eb2e8f9f7 164 #define COUNT_TO_MSEC(count, clockFreqInHz) (uint64_t)((uint64_t)count * 1000U / clockFreqInHz)
<> 144:ef7eb2e8f9f7 165 /* @} */
<> 144:ef7eb2e8f9f7 166
<> 144:ef7eb2e8f9f7 167 /*******************************************************************************
<> 144:ef7eb2e8f9f7 168 * API
<> 144:ef7eb2e8f9f7 169 ******************************************************************************/
<> 144:ef7eb2e8f9f7 170
<> 144:ef7eb2e8f9f7 171 #if defined(__cplusplus)
<> 144:ef7eb2e8f9f7 172 extern "C" {
<> 144:ef7eb2e8f9f7 173 #endif
<> 144:ef7eb2e8f9f7 174
<> 144:ef7eb2e8f9f7 175 /*!
<> 144:ef7eb2e8f9f7 176 * @brief Enable specific interrupt.
<> 144:ef7eb2e8f9f7 177 *
<> 144:ef7eb2e8f9f7 178 * Enable the interrupt not routed from intmux.
<> 144:ef7eb2e8f9f7 179 *
<> 144:ef7eb2e8f9f7 180 * @param interrupt The IRQ number.
<> 144:ef7eb2e8f9f7 181 */
<> 144:ef7eb2e8f9f7 182 static inline void EnableIRQ(IRQn_Type interrupt)
<> 144:ef7eb2e8f9f7 183 {
<> 144:ef7eb2e8f9f7 184 #if defined(FSL_FEATURE_SOC_INTMUX_COUNT) && (FSL_FEATURE_SOC_INTMUX_COUNT > 0)
<> 144:ef7eb2e8f9f7 185 if (interrupt < FSL_FEATURE_INTMUX_IRQ_START_INDEX)
<> 144:ef7eb2e8f9f7 186 #endif
<> 144:ef7eb2e8f9f7 187 {
<> 144:ef7eb2e8f9f7 188 NVIC_EnableIRQ(interrupt);
<> 144:ef7eb2e8f9f7 189 }
<> 144:ef7eb2e8f9f7 190 }
<> 144:ef7eb2e8f9f7 191
<> 144:ef7eb2e8f9f7 192 /*!
<> 144:ef7eb2e8f9f7 193 * @brief Disable specific interrupt.
<> 144:ef7eb2e8f9f7 194 *
<> 144:ef7eb2e8f9f7 195 * Disable the interrupt not routed from intmux.
<> 144:ef7eb2e8f9f7 196 *
<> 144:ef7eb2e8f9f7 197 * @param interrupt The IRQ number.
<> 144:ef7eb2e8f9f7 198 */
<> 144:ef7eb2e8f9f7 199 static inline void DisableIRQ(IRQn_Type interrupt)
<> 144:ef7eb2e8f9f7 200 {
<> 144:ef7eb2e8f9f7 201 #if defined(FSL_FEATURE_SOC_INTMUX_COUNT) && (FSL_FEATURE_SOC_INTMUX_COUNT > 0)
<> 144:ef7eb2e8f9f7 202 if (interrupt < FSL_FEATURE_INTMUX_IRQ_START_INDEX)
<> 144:ef7eb2e8f9f7 203 #endif
<> 144:ef7eb2e8f9f7 204 {
<> 144:ef7eb2e8f9f7 205 NVIC_DisableIRQ(interrupt);
<> 144:ef7eb2e8f9f7 206 }
<> 144:ef7eb2e8f9f7 207 }
<> 144:ef7eb2e8f9f7 208
<> 144:ef7eb2e8f9f7 209 /*!
<> 144:ef7eb2e8f9f7 210 * @brief Disable the global IRQ
<> 144:ef7eb2e8f9f7 211 *
<> 144:ef7eb2e8f9f7 212 * Disable the global interrupt and return the current primask register. User is required to provided the primask
<> 144:ef7eb2e8f9f7 213 * register for the EnableGlobalIRQ().
<> 144:ef7eb2e8f9f7 214 *
<> 144:ef7eb2e8f9f7 215 * @return Current primask value.
<> 144:ef7eb2e8f9f7 216 */
<> 144:ef7eb2e8f9f7 217 static inline uint32_t DisableGlobalIRQ(void)
<> 144:ef7eb2e8f9f7 218 {
<> 144:ef7eb2e8f9f7 219 uint32_t regPrimask = __get_PRIMASK();
<> 144:ef7eb2e8f9f7 220
<> 144:ef7eb2e8f9f7 221 __disable_irq();
<> 144:ef7eb2e8f9f7 222
<> 144:ef7eb2e8f9f7 223 return regPrimask;
<> 144:ef7eb2e8f9f7 224 }
<> 144:ef7eb2e8f9f7 225
<> 144:ef7eb2e8f9f7 226 /*!
<> 144:ef7eb2e8f9f7 227 * @brief Enaable the global IRQ
<> 144:ef7eb2e8f9f7 228 *
<> 144:ef7eb2e8f9f7 229 * Set the primask register with the provided primask value but not just enable the primask. The idea is for the
<> 144:ef7eb2e8f9f7 230 * convinience of integration of RTOS. some RTOS get its own management mechanism of primask. User is required to
<> 144:ef7eb2e8f9f7 231 * use the EnableGlobalIRQ() and DisableGlobalIRQ() in pair.
<> 144:ef7eb2e8f9f7 232 *
<> 144:ef7eb2e8f9f7 233 * @param primask value of primask register to be restored. The primask value is supposed to be provided by the
<> 144:ef7eb2e8f9f7 234 * DisableGlobalIRQ().
<> 144:ef7eb2e8f9f7 235 */
<> 144:ef7eb2e8f9f7 236 static inline void EnableGlobalIRQ(uint32_t primask)
<> 144:ef7eb2e8f9f7 237 {
<> 144:ef7eb2e8f9f7 238 __set_PRIMASK(primask);
<> 144:ef7eb2e8f9f7 239 }
<> 144:ef7eb2e8f9f7 240
<> 144:ef7eb2e8f9f7 241 /*!
<> 144:ef7eb2e8f9f7 242 * @brief install IRQ handler
<> 144:ef7eb2e8f9f7 243 *
<> 144:ef7eb2e8f9f7 244 * @param irq IRQ number
<> 144:ef7eb2e8f9f7 245 * @param irqHandler IRQ handler address
<> 144:ef7eb2e8f9f7 246 */
<> 144:ef7eb2e8f9f7 247 void InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler);
<> 144:ef7eb2e8f9f7 248
<> 144:ef7eb2e8f9f7 249 #if defined(__cplusplus)
<> 144:ef7eb2e8f9f7 250 }
<> 144:ef7eb2e8f9f7 251 #endif
<> 144:ef7eb2e8f9f7 252
<> 144:ef7eb2e8f9f7 253 /*! @} */
<> 144:ef7eb2e8f9f7 254
<> 144:ef7eb2e8f9f7 255 #endif /* _FSL_COMMON_H_ */