added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Sep 02 15:07:44 2016 +0100
Revision:
144:ef7eb2e8f9f7
This updates the lib to the mbed lib v125

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /* mbed Microcontroller Library
<> 144:ef7eb2e8f9f7 2 * Copyright (c) 2016 ARM Limited
<> 144:ef7eb2e8f9f7 3 *
<> 144:ef7eb2e8f9f7 4 * Licensed under the Apache License, Version 2.0 (the "License");
<> 144:ef7eb2e8f9f7 5 * you may not use this file except in compliance with the License.
<> 144:ef7eb2e8f9f7 6 * You may obtain a copy of the License at
<> 144:ef7eb2e8f9f7 7 *
<> 144:ef7eb2e8f9f7 8 * http://www.apache.org/licenses/LICENSE-2.0
<> 144:ef7eb2e8f9f7 9 *
<> 144:ef7eb2e8f9f7 10 * Unless required by applicable law or agreed to in writing, software
<> 144:ef7eb2e8f9f7 11 * distributed under the License is distributed on an "AS IS" BASIS,
<> 144:ef7eb2e8f9f7 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 144:ef7eb2e8f9f7 13 * See the License for the specific language governing permissions and
<> 144:ef7eb2e8f9f7 14 * limitations under the License.
<> 144:ef7eb2e8f9f7 15 */
<> 144:ef7eb2e8f9f7 16 #include "cmsis.h"
<> 144:ef7eb2e8f9f7 17 #include "apb_timer.h"
<> 144:ef7eb2e8f9f7 18
<> 144:ef7eb2e8f9f7 19 /* Timer Private Data */
<> 144:ef7eb2e8f9f7 20 typedef struct {
<> 144:ef7eb2e8f9f7 21 /* Timer Definition */
<> 144:ef7eb2e8f9f7 22 CMSDK_TIMER_TypeDef *timerN;
<> 144:ef7eb2e8f9f7 23 /* Timer IRQn */
<> 144:ef7eb2e8f9f7 24 uint32_t timerIRQn;
<> 144:ef7eb2e8f9f7 25 /* Timer Reload Value */
<> 144:ef7eb2e8f9f7 26 uint32_t timerReload;
<> 144:ef7eb2e8f9f7 27 /* Timer state */
<> 144:ef7eb2e8f9f7 28 uint32_t state;
<> 144:ef7eb2e8f9f7 29 } apb_timer_t;
<> 144:ef7eb2e8f9f7 30
<> 144:ef7eb2e8f9f7 31 /* Timer state definitions */
<> 144:ef7eb2e8f9f7 32 #define TIMER_INITIALIZED (1)
<> 144:ef7eb2e8f9f7 33 #define TIMER_ENABLED (1 << 1)
<> 144:ef7eb2e8f9f7 34
<> 144:ef7eb2e8f9f7 35 /*
<> 144:ef7eb2e8f9f7 36 * This Timer is written for MBED OS and keeps count
<> 144:ef7eb2e8f9f7 37 * of the ticks. All the elaboration logic is demanded
<> 144:ef7eb2e8f9f7 38 * to the upper layers.
<> 144:ef7eb2e8f9f7 39 */
<> 144:ef7eb2e8f9f7 40 #define TIMER_MAX_VALUE 0xFFFFFFFF
<> 144:ef7eb2e8f9f7 41 #define TIMER_TICKS_US (SystemCoreClock/1000000)
<> 144:ef7eb2e8f9f7 42
<> 144:ef7eb2e8f9f7 43 /* Timers Array */
<> 144:ef7eb2e8f9f7 44 static apb_timer_t Timers[NUM_TIMERS];
<> 144:ef7eb2e8f9f7 45
<> 144:ef7eb2e8f9f7 46 void Timer_Index_Init(uint32_t timer, uint32_t reload,
<> 144:ef7eb2e8f9f7 47 CMSDK_TIMER_TypeDef *TimerN, uint32_t IRQn)
<> 144:ef7eb2e8f9f7 48 {
<> 144:ef7eb2e8f9f7 49 Timers[timer].timerN = TimerN;
<> 144:ef7eb2e8f9f7 50 Timers[timer].timerIRQn = IRQn;
<> 144:ef7eb2e8f9f7 51 Timers[timer].timerReload = reload;
<> 144:ef7eb2e8f9f7 52 Timers[timer].state = TIMER_INITIALIZED;
<> 144:ef7eb2e8f9f7 53 }
<> 144:ef7eb2e8f9f7 54
<> 144:ef7eb2e8f9f7 55 /*
<> 144:ef7eb2e8f9f7 56 * Timer_Initialize(): Initializes an hardware timer
<> 144:ef7eb2e8f9f7 57 * timer: timer to be Initialized
<> 144:ef7eb2e8f9f7 58 * time_us: timer reload value in us - 0 to reload to timer max value
<> 144:ef7eb2e8f9f7 59 * time_us = tick_value / TIMER_TICKS_US
<> 144:ef7eb2e8f9f7 60 */
<> 144:ef7eb2e8f9f7 61 #define TIMER_INIT(index, reload) Timer_Index_Init(index, reload, CMSDK_TIMER##index, TIMER##index##_IRQn)
<> 144:ef7eb2e8f9f7 62 void Timer_Initialize(uint32_t timer, uint32_t time_us)
<> 144:ef7eb2e8f9f7 63 {
<> 144:ef7eb2e8f9f7 64 uint32_t reload = 0;
<> 144:ef7eb2e8f9f7 65
<> 144:ef7eb2e8f9f7 66 if (timer < NUM_TIMERS)
<> 144:ef7eb2e8f9f7 67 {
<> 144:ef7eb2e8f9f7 68 if (time_us == 0)
<> 144:ef7eb2e8f9f7 69 reload = TIMER_MAX_VALUE;
<> 144:ef7eb2e8f9f7 70 else
<> 144:ef7eb2e8f9f7 71 reload = (time_us) * TIMER_TICKS_US;
<> 144:ef7eb2e8f9f7 72
<> 144:ef7eb2e8f9f7 73 switch(timer) {
<> 144:ef7eb2e8f9f7 74 case 0: TIMER_INIT(0, reload);
<> 144:ef7eb2e8f9f7 75 break;
<> 144:ef7eb2e8f9f7 76 case 1: TIMER_INIT(1, reload);
<> 144:ef7eb2e8f9f7 77 break;
<> 144:ef7eb2e8f9f7 78 default: break;
<> 144:ef7eb2e8f9f7 79 }
<> 144:ef7eb2e8f9f7 80 }
<> 144:ef7eb2e8f9f7 81 }
<> 144:ef7eb2e8f9f7 82
<> 144:ef7eb2e8f9f7 83 /*
<> 144:ef7eb2e8f9f7 84 * Timer_Enable(): Enables a hardware timer
<> 144:ef7eb2e8f9f7 85 * timer: timer to be enabled
<> 144:ef7eb2e8f9f7 86 */
<> 144:ef7eb2e8f9f7 87 void Timer_Enable(uint32_t timer)
<> 144:ef7eb2e8f9f7 88 {
<> 144:ef7eb2e8f9f7 89 /* The timer has to be contained in a valid range */
<> 144:ef7eb2e8f9f7 90 if (timer < NUM_TIMERS) {
<> 144:ef7eb2e8f9f7 91 /* Timer has to be already initialized */
<> 144:ef7eb2e8f9f7 92 if (Timers[timer].state == TIMER_INITIALIZED) {
<> 144:ef7eb2e8f9f7 93 /* Disable Timer */
<> 144:ef7eb2e8f9f7 94 (Timers[timer].timerN)->CTRL = 0x0;
<> 144:ef7eb2e8f9f7 95 /* Reload Value */
<> 144:ef7eb2e8f9f7 96 (Timers[timer].timerN)->RELOAD = Timers[timer].timerReload;
<> 144:ef7eb2e8f9f7 97 /* Enable Interrupt */
<> 144:ef7eb2e8f9f7 98 (Timers[timer].timerN)->CTRL = CMSDK_TIMER_CTRL_IRQEN_Msk;
<> 144:ef7eb2e8f9f7 99 /* Enable Counter */
<> 144:ef7eb2e8f9f7 100 (Timers[timer].timerN)->CTRL |= CMSDK_TIMER_CTRL_EN_Msk;
<> 144:ef7eb2e8f9f7 101 /* Change timer state */
<> 144:ef7eb2e8f9f7 102 Timers[timer].state |= TIMER_ENABLED;
<> 144:ef7eb2e8f9f7 103 }
<> 144:ef7eb2e8f9f7 104 }
<> 144:ef7eb2e8f9f7 105 }
<> 144:ef7eb2e8f9f7 106
<> 144:ef7eb2e8f9f7 107 /*
<> 144:ef7eb2e8f9f7 108 * Timer_Disable(): Disables a hardware timer
<> 144:ef7eb2e8f9f7 109 * timer: timer to be disabled
<> 144:ef7eb2e8f9f7 110 */
<> 144:ef7eb2e8f9f7 111 void Timer_Disable(uint32_t timer)
<> 144:ef7eb2e8f9f7 112 {
<> 144:ef7eb2e8f9f7 113 /* The timer has to be contained in a valid range */
<> 144:ef7eb2e8f9f7 114 if (timer < NUM_TIMERS) {
<> 144:ef7eb2e8f9f7 115 /* Timer has to be already initialized and enabled */
<> 144:ef7eb2e8f9f7 116 if (Timers[timer].state == (TIMER_INITIALIZED | TIMER_ENABLED)) {
<> 144:ef7eb2e8f9f7 117 /* Disable Timer */
<> 144:ef7eb2e8f9f7 118 (Timers[timer].timerN)->CTRL = 0x0;
<> 144:ef7eb2e8f9f7 119 /* Change timer state */
<> 144:ef7eb2e8f9f7 120 Timers[timer].state = TIMER_INITIALIZED;
<> 144:ef7eb2e8f9f7 121 }
<> 144:ef7eb2e8f9f7 122 }
<> 144:ef7eb2e8f9f7 123 }
<> 144:ef7eb2e8f9f7 124
<> 144:ef7eb2e8f9f7 125 /*
<> 144:ef7eb2e8f9f7 126 * Timer_isEnabled(): verifies if a timer is enabled
<> 144:ef7eb2e8f9f7 127 * timer: timer to be verified
<> 144:ef7eb2e8f9f7 128 * @return: 0 disabled - 1 enabled
<> 144:ef7eb2e8f9f7 129 */
<> 144:ef7eb2e8f9f7 130 uint32_t Timer_isEnabled(uint32_t timer)
<> 144:ef7eb2e8f9f7 131 {
<> 144:ef7eb2e8f9f7 132 /* The timer has to be contained in a valid range */
<> 144:ef7eb2e8f9f7 133 if (timer < NUM_TIMERS) {
<> 144:ef7eb2e8f9f7 134 /* Timer has to be already initialized and enabled */
<> 144:ef7eb2e8f9f7 135 if (Timers[timer].state == (TIMER_INITIALIZED | TIMER_ENABLED))
<> 144:ef7eb2e8f9f7 136 return 1;
<> 144:ef7eb2e8f9f7 137 } else {
<> 144:ef7eb2e8f9f7 138 return 0;
<> 144:ef7eb2e8f9f7 139 }
<> 144:ef7eb2e8f9f7 140 return 0;
<> 144:ef7eb2e8f9f7 141 }
<> 144:ef7eb2e8f9f7 142
<> 144:ef7eb2e8f9f7 143 /*
<> 144:ef7eb2e8f9f7 144 * Timer_Read(): provides timer VALUE
<> 144:ef7eb2e8f9f7 145 * timer: timer to be read
<> 144:ef7eb2e8f9f7 146 * @return: timer VALUE us
<> 144:ef7eb2e8f9f7 147 */
<> 144:ef7eb2e8f9f7 148 uint32_t Timer_Read(uint32_t timer)
<> 144:ef7eb2e8f9f7 149 {
<> 144:ef7eb2e8f9f7 150 uint32_t return_value = 0;
<> 144:ef7eb2e8f9f7 151 /* Verify if the Timer is enabled */
<> 144:ef7eb2e8f9f7 152 if (Timer_isEnabled(timer) == 1) {
<> 144:ef7eb2e8f9f7 153 return_value = (Timers[timer].timerReload
<> 144:ef7eb2e8f9f7 154 - (Timers[timer].timerN)->VALUE)
<> 144:ef7eb2e8f9f7 155 / TIMER_TICKS_US;
<> 144:ef7eb2e8f9f7 156 }
<> 144:ef7eb2e8f9f7 157
<> 144:ef7eb2e8f9f7 158 return return_value;
<> 144:ef7eb2e8f9f7 159 }
<> 144:ef7eb2e8f9f7 160
<> 144:ef7eb2e8f9f7 161 /*
<> 144:ef7eb2e8f9f7 162 * Timer_SetInterrupt(): sets timer Interrupt
<> 144:ef7eb2e8f9f7 163 * timer: timer on which interrupt is set
<> 144:ef7eb2e8f9f7 164 * time_us: reloading time in us
<> 144:ef7eb2e8f9f7 165 */
<> 144:ef7eb2e8f9f7 166 void Timer_SetInterrupt(uint32_t timer, uint32_t time_us)
<> 144:ef7eb2e8f9f7 167 {
<> 144:ef7eb2e8f9f7 168 uint32_t load_time_us = 0;
<> 144:ef7eb2e8f9f7 169 /* Verify if the Timer is enabled */
<> 144:ef7eb2e8f9f7 170 if (Timer_isEnabled(timer) == 1) {
<> 144:ef7eb2e8f9f7 171 /* Disable Timer */
<> 144:ef7eb2e8f9f7 172 Timer_Disable(timer);
<> 144:ef7eb2e8f9f7 173 /* Enable Interrupt */
<> 144:ef7eb2e8f9f7 174 (Timers[timer].timerN)->CTRL = CMSDK_TIMER_CTRL_IRQEN_Msk;
<> 144:ef7eb2e8f9f7 175
<> 144:ef7eb2e8f9f7 176 /* Check time us condition */
<> 144:ef7eb2e8f9f7 177 if(time_us == TIMER_DEFAULT_RELOAD)
<> 144:ef7eb2e8f9f7 178 load_time_us = TIMER_MAX_VALUE;
<> 144:ef7eb2e8f9f7 179 else
<> 144:ef7eb2e8f9f7 180 load_time_us = time_us * TIMER_TICKS_US;
<> 144:ef7eb2e8f9f7 181
<> 144:ef7eb2e8f9f7 182 /* Initialize Timer Value */
<> 144:ef7eb2e8f9f7 183 Timers[timer].timerReload = load_time_us;
<> 144:ef7eb2e8f9f7 184 (Timers[timer].timerN)->RELOAD = Timers[timer].timerReload;
<> 144:ef7eb2e8f9f7 185 (Timers[timer].timerN)->VALUE = Timers[timer].timerReload;
<> 144:ef7eb2e8f9f7 186 /* Enable Counter */
<> 144:ef7eb2e8f9f7 187 (Timers[timer].timerN)->CTRL |= CMSDK_TIMER_CTRL_EN_Msk;
<> 144:ef7eb2e8f9f7 188 /* Change timer state */
<> 144:ef7eb2e8f9f7 189 Timers[timer].state |= TIMER_ENABLED;
<> 144:ef7eb2e8f9f7 190 }
<> 144:ef7eb2e8f9f7 191 }
<> 144:ef7eb2e8f9f7 192
<> 144:ef7eb2e8f9f7 193 /*
<> 144:ef7eb2e8f9f7 194 * Timer_DisableInterrupt(): disables timer interrupt
<> 144:ef7eb2e8f9f7 195 * timer: timer on which interrupt is disabled
<> 144:ef7eb2e8f9f7 196 */
<> 144:ef7eb2e8f9f7 197 void Timer_DisableInterrupt(uint32_t timer)
<> 144:ef7eb2e8f9f7 198 {
<> 144:ef7eb2e8f9f7 199 /* Verify if the Timer is enabled */
<> 144:ef7eb2e8f9f7 200 if (Timer_isEnabled(timer) == 1) {
<> 144:ef7eb2e8f9f7 201 /* Disable Interrupt */
<> 144:ef7eb2e8f9f7 202 (Timers[timer].timerN)->CTRL &= CMSDK_TIMER_CTRL_EN_Msk;
<> 144:ef7eb2e8f9f7 203 }
<> 144:ef7eb2e8f9f7 204 }
<> 144:ef7eb2e8f9f7 205
<> 144:ef7eb2e8f9f7 206 /*
<> 144:ef7eb2e8f9f7 207 * Timer_ClearInterrupt(): clear timer interrupt
<> 144:ef7eb2e8f9f7 208 * timer: timer on which interrupt needs to be cleared
<> 144:ef7eb2e8f9f7 209 */
<> 144:ef7eb2e8f9f7 210 void Timer_ClearInterrupt(uint32_t timer)
<> 144:ef7eb2e8f9f7 211 {
<> 144:ef7eb2e8f9f7 212 /* Verify if the Timer is enabled */
<> 144:ef7eb2e8f9f7 213 if (Timer_isEnabled(timer) == 1) {
<> 144:ef7eb2e8f9f7 214 /* Clear Interrupt */
<> 144:ef7eb2e8f9f7 215 (Timers[timer].timerN)->INTCLEAR = CMSDK_TIMER_INTCLEAR_Msk;
<> 144:ef7eb2e8f9f7 216 }
<> 144:ef7eb2e8f9f7 217 }
<> 144:ef7eb2e8f9f7 218
<> 144:ef7eb2e8f9f7 219 /*
<> 144:ef7eb2e8f9f7 220 * Timer_GetIRQn(): returns IRQn of a Timer
<> 144:ef7eb2e8f9f7 221 * timer: timer on which IRQn is defined - 0 if it is not defined
<> 144:ef7eb2e8f9f7 222 */
<> 144:ef7eb2e8f9f7 223 uint32_t Timer_GetIRQn(uint32_t timer)
<> 144:ef7eb2e8f9f7 224 {
<> 144:ef7eb2e8f9f7 225 /* Verify if the Timer is enabled */
<> 144:ef7eb2e8f9f7 226 if (Timer_isEnabled(timer) == 1) {
<> 144:ef7eb2e8f9f7 227 return Timers[timer].timerIRQn;
<> 144:ef7eb2e8f9f7 228 }
<> 144:ef7eb2e8f9f7 229 return 0;
<> 144:ef7eb2e8f9f7 230 }
<> 144:ef7eb2e8f9f7 231
<> 144:ef7eb2e8f9f7 232 /*
<> 144:ef7eb2e8f9f7 233 * Timer_GetTicksUS(): returns the number of Ticks per us
<> 144:ef7eb2e8f9f7 234 * timer: timer associated with the Ticks per us
<> 144:ef7eb2e8f9f7 235 * @return: Ticks per us - 0 if the timer is disables
<> 144:ef7eb2e8f9f7 236 */
<> 144:ef7eb2e8f9f7 237 uint32_t Timer_GetTicksUS(uint32_t timer)
<> 144:ef7eb2e8f9f7 238 {
<> 144:ef7eb2e8f9f7 239 /* Verify if the Timer is enabled */
<> 144:ef7eb2e8f9f7 240 if (Timer_isEnabled(timer) == 1) {
<> 144:ef7eb2e8f9f7 241 return TIMER_TICKS_US;
<> 144:ef7eb2e8f9f7 242 }
<> 144:ef7eb2e8f9f7 243 return 0;
<> 144:ef7eb2e8f9f7 244 }
<> 144:ef7eb2e8f9f7 245
<> 144:ef7eb2e8f9f7 246 /*
<> 144:ef7eb2e8f9f7 247 * Timer_GetReloadValue(): returns the load value of the selected
<> 144:ef7eb2e8f9f7 248 * timer.
<> 144:ef7eb2e8f9f7 249 * timer: timer associated with the Ticks per us
<> 144:ef7eb2e8f9f7 250 * @return: reload value of the selected singletimer
<> 144:ef7eb2e8f9f7 251 */
<> 144:ef7eb2e8f9f7 252 uint32_t Timer_GetReloadValue(uint32_t timer)
<> 144:ef7eb2e8f9f7 253 {
<> 144:ef7eb2e8f9f7 254 /* Verify if the Timer is enabled */
<> 144:ef7eb2e8f9f7 255 if (Timer_isEnabled(timer) == 1) {
<> 144:ef7eb2e8f9f7 256 if (timer == TIMER1)
<> 144:ef7eb2e8f9f7 257 return Timers[timer].timerReload / TIMER_TICKS_US;
<> 144:ef7eb2e8f9f7 258 else
<> 144:ef7eb2e8f9f7 259 return Timers[timer].timerReload / TIMER_TICKS_US;
<> 144:ef7eb2e8f9f7 260 }
<> 144:ef7eb2e8f9f7 261 return 0;
<> 144:ef7eb2e8f9f7 262 }