The common folder libraries from keil LPC11Uxx code bundle
timer16.c@0:05d110ee258e, 2012-05-27 (annotated)
- Committer:
- alexan_e
- Date:
- Sun May 27 23:59:30 2012 +0000
- Revision:
- 0:05d110ee258e
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
alexan_e | 0:05d110ee258e | 1 | /**************************************************************************** |
alexan_e | 0:05d110ee258e | 2 | * $Id:: timer16.c 9190 2012-02-16 20:59:45Z nxp41306 $ |
alexan_e | 0:05d110ee258e | 3 | * Project: NXP LPC11Uxx 16-bit timer example |
alexan_e | 0:05d110ee258e | 4 | * |
alexan_e | 0:05d110ee258e | 5 | * Description: |
alexan_e | 0:05d110ee258e | 6 | * This file contains 16-bit timer code example which include timer |
alexan_e | 0:05d110ee258e | 7 | * initialization, timer interrupt handler, and related APIs for |
alexan_e | 0:05d110ee258e | 8 | * timer setup. |
alexan_e | 0:05d110ee258e | 9 | * |
alexan_e | 0:05d110ee258e | 10 | **************************************************************************** |
alexan_e | 0:05d110ee258e | 11 | * Software that is described herein is for illustrative purposes only |
alexan_e | 0:05d110ee258e | 12 | * which provides customers with programming information regarding the |
alexan_e | 0:05d110ee258e | 13 | * products. This software is supplied "AS IS" without any warranties. |
alexan_e | 0:05d110ee258e | 14 | * NXP Semiconductors assumes no responsibility or liability for the |
alexan_e | 0:05d110ee258e | 15 | * use of the software, conveys no license or title under any patent, |
alexan_e | 0:05d110ee258e | 16 | * copyright, or mask work right to the product. NXP Semiconductors |
alexan_e | 0:05d110ee258e | 17 | * reserves the right to make changes in the software without |
alexan_e | 0:05d110ee258e | 18 | * notification. NXP Semiconductors also make no representation or |
alexan_e | 0:05d110ee258e | 19 | * warranty that such application will be suitable for the specified |
alexan_e | 0:05d110ee258e | 20 | * use without further testing or modification. |
alexan_e | 0:05d110ee258e | 21 | |
alexan_e | 0:05d110ee258e | 22 | * Permission to use, copy, modify, and distribute this software and its |
alexan_e | 0:05d110ee258e | 23 | * documentation is hereby granted, under NXP Semiconductors' |
alexan_e | 0:05d110ee258e | 24 | * relevant copyright in the software, without fee, provided that it |
alexan_e | 0:05d110ee258e | 25 | * is used in conjunction with NXP Semiconductors microcontrollers. This |
alexan_e | 0:05d110ee258e | 26 | * copyright, permission, and disclaimer notice must appear in all copies of |
alexan_e | 0:05d110ee258e | 27 | * this code. |
alexan_e | 0:05d110ee258e | 28 | |
alexan_e | 0:05d110ee258e | 29 | ****************************************************************************/ |
alexan_e | 0:05d110ee258e | 30 | |
alexan_e | 0:05d110ee258e | 31 | #include "LPC11Uxx.h" |
alexan_e | 0:05d110ee258e | 32 | #include "timer16.h" |
alexan_e | 0:05d110ee258e | 33 | #include "nmi.h" |
alexan_e | 0:05d110ee258e | 34 | |
alexan_e | 0:05d110ee258e | 35 | volatile uint32_t timer16_0_counter[2] = {0,0}; |
alexan_e | 0:05d110ee258e | 36 | volatile uint32_t timer16_1_counter[2] = {0,0}; |
alexan_e | 0:05d110ee258e | 37 | volatile uint32_t timer16_0_capture[2] = {0,0}; |
alexan_e | 0:05d110ee258e | 38 | volatile uint32_t timer16_1_capture[2] = {0,0}; |
alexan_e | 0:05d110ee258e | 39 | volatile uint32_t timer16_0_period = 0; |
alexan_e | 0:05d110ee258e | 40 | volatile uint32_t timer16_1_period = 0; |
alexan_e | 0:05d110ee258e | 41 | |
alexan_e | 0:05d110ee258e | 42 | /***************************************************************************** |
alexan_e | 0:05d110ee258e | 43 | ** Function name: delayMs |
alexan_e | 0:05d110ee258e | 44 | ** |
alexan_e | 0:05d110ee258e | 45 | ** Descriptions: Start the timer delay in milo seconds |
alexan_e | 0:05d110ee258e | 46 | ** until elapsed |
alexan_e | 0:05d110ee258e | 47 | ** |
alexan_e | 0:05d110ee258e | 48 | ** parameters: timer number, Delay value in milo second |
alexan_e | 0:05d110ee258e | 49 | ** |
alexan_e | 0:05d110ee258e | 50 | ** Returned value: None |
alexan_e | 0:05d110ee258e | 51 | ** |
alexan_e | 0:05d110ee258e | 52 | *****************************************************************************/ |
alexan_e | 0:05d110ee258e | 53 | void delayMs(uint8_t timer_num, uint32_t delayInMs) |
alexan_e | 0:05d110ee258e | 54 | { |
alexan_e | 0:05d110ee258e | 55 | if (timer_num == 0) |
alexan_e | 0:05d110ee258e | 56 | { |
alexan_e | 0:05d110ee258e | 57 | /* |
alexan_e | 0:05d110ee258e | 58 | * setup timer #0 for delay |
alexan_e | 0:05d110ee258e | 59 | */ |
alexan_e | 0:05d110ee258e | 60 | LPC_CT16B0->TCR = 0x02; /* reset timer */ |
alexan_e | 0:05d110ee258e | 61 | LPC_CT16B0->PR = 0x00; /* set prescaler to zero */ |
alexan_e | 0:05d110ee258e | 62 | LPC_CT16B0->MR0 = delayInMs * (SystemCoreClock / 1000); |
alexan_e | 0:05d110ee258e | 63 | LPC_CT16B0->IR = 0xff; /* reset all interrrupts */ |
alexan_e | 0:05d110ee258e | 64 | LPC_CT16B0->MCR = 0x04; /* stop timer on match */ |
alexan_e | 0:05d110ee258e | 65 | LPC_CT16B0->TCR = 0x01; /* start timer */ |
alexan_e | 0:05d110ee258e | 66 | /* wait until delay time has elapsed */ |
alexan_e | 0:05d110ee258e | 67 | while (LPC_CT16B0->TCR & 0x01); |
alexan_e | 0:05d110ee258e | 68 | } |
alexan_e | 0:05d110ee258e | 69 | else if (timer_num == 1) |
alexan_e | 0:05d110ee258e | 70 | { |
alexan_e | 0:05d110ee258e | 71 | /* |
alexan_e | 0:05d110ee258e | 72 | * setup timer #1 for delay |
alexan_e | 0:05d110ee258e | 73 | */ |
alexan_e | 0:05d110ee258e | 74 | LPC_CT16B1->TCR = 0x02; /* reset timer */ |
alexan_e | 0:05d110ee258e | 75 | LPC_CT16B1->PR = 0x00; /* set prescaler to zero */ |
alexan_e | 0:05d110ee258e | 76 | LPC_CT16B1->MR0 = delayInMs * (SystemCoreClock / 1000); |
alexan_e | 0:05d110ee258e | 77 | LPC_CT16B1->IR = 0xff; /* reset all interrrupts */ |
alexan_e | 0:05d110ee258e | 78 | LPC_CT16B1->MCR = 0x04; /* stop timer on match */ |
alexan_e | 0:05d110ee258e | 79 | LPC_CT16B1->TCR = 0x01; /* start timer */ |
alexan_e | 0:05d110ee258e | 80 | /* wait until delay time has elapsed */ |
alexan_e | 0:05d110ee258e | 81 | while (LPC_CT16B1->TCR & 0x01); |
alexan_e | 0:05d110ee258e | 82 | } |
alexan_e | 0:05d110ee258e | 83 | return; |
alexan_e | 0:05d110ee258e | 84 | } |
alexan_e | 0:05d110ee258e | 85 | |
alexan_e | 0:05d110ee258e | 86 | /****************************************************************************** |
alexan_e | 0:05d110ee258e | 87 | ** Function name: TIMER_0_IRQHandler |
alexan_e | 0:05d110ee258e | 88 | ** |
alexan_e | 0:05d110ee258e | 89 | ** Descriptions: Timer/CounterX and CaptureX interrupt handler |
alexan_e | 0:05d110ee258e | 90 | ** |
alexan_e | 0:05d110ee258e | 91 | ** parameters: None |
alexan_e | 0:05d110ee258e | 92 | ** Returned value: None |
alexan_e | 0:05d110ee258e | 93 | ** |
alexan_e | 0:05d110ee258e | 94 | ******************************************************************************/ |
alexan_e | 0:05d110ee258e | 95 | extern "C" void TIMER16_0_IRQHandler(void) |
alexan_e | 0:05d110ee258e | 96 | { |
alexan_e | 0:05d110ee258e | 97 | if ( LPC_CT16B0->IR & (0x1<<0) ) |
alexan_e | 0:05d110ee258e | 98 | { |
alexan_e | 0:05d110ee258e | 99 | LPC_CT16B0->IR = 0x1<<0; /* clear interrupt flag */ |
alexan_e | 0:05d110ee258e | 100 | timer16_0_counter[0]++; |
alexan_e | 0:05d110ee258e | 101 | } |
alexan_e | 0:05d110ee258e | 102 | if ( LPC_CT16B0->IR & (0x1<<1) ) |
alexan_e | 0:05d110ee258e | 103 | { |
alexan_e | 0:05d110ee258e | 104 | LPC_CT16B0->IR = 0x1<<1; /* clear interrupt flag */ |
alexan_e | 0:05d110ee258e | 105 | timer16_0_counter[1]++; |
alexan_e | 0:05d110ee258e | 106 | } |
alexan_e | 0:05d110ee258e | 107 | if ( LPC_CT16B0->IR & (0x1<<4) ) |
alexan_e | 0:05d110ee258e | 108 | { |
alexan_e | 0:05d110ee258e | 109 | LPC_CT16B0->IR = 0x1<<4; /* clear interrupt flag */ |
alexan_e | 0:05d110ee258e | 110 | timer16_0_capture[0]++; |
alexan_e | 0:05d110ee258e | 111 | } |
alexan_e | 0:05d110ee258e | 112 | if ( LPC_CT16B0->IR & (0x1<<5) ) |
alexan_e | 0:05d110ee258e | 113 | { |
alexan_e | 0:05d110ee258e | 114 | LPC_CT16B0->IR = 0x1<<5; /* clear interrupt flag */ |
alexan_e | 0:05d110ee258e | 115 | timer16_0_capture[1]++; |
alexan_e | 0:05d110ee258e | 116 | } |
alexan_e | 0:05d110ee258e | 117 | return; |
alexan_e | 0:05d110ee258e | 118 | } |
alexan_e | 0:05d110ee258e | 119 | |
alexan_e | 0:05d110ee258e | 120 | /****************************************************************************** |
alexan_e | 0:05d110ee258e | 121 | ** Function name: TIMER_1_IRQHandler |
alexan_e | 0:05d110ee258e | 122 | ** |
alexan_e | 0:05d110ee258e | 123 | ** Descriptions: Timer/CounterX and CaptureX interrupt handler |
alexan_e | 0:05d110ee258e | 124 | ** |
alexan_e | 0:05d110ee258e | 125 | ** parameters: None |
alexan_e | 0:05d110ee258e | 126 | ** Returned value: None |
alexan_e | 0:05d110ee258e | 127 | ** |
alexan_e | 0:05d110ee258e | 128 | ******************************************************************************/ |
alexan_e | 0:05d110ee258e | 129 | extern "C" void TIMER16_1_IRQHandler(void) |
alexan_e | 0:05d110ee258e | 130 | { |
alexan_e | 0:05d110ee258e | 131 | if ( LPC_CT16B1->IR & (0x1<<0) ) |
alexan_e | 0:05d110ee258e | 132 | { |
alexan_e | 0:05d110ee258e | 133 | LPC_CT16B1->IR = 0x1<<0; /* clear interrupt flag */ |
alexan_e | 0:05d110ee258e | 134 | timer16_1_counter[0]++; |
alexan_e | 0:05d110ee258e | 135 | } |
alexan_e | 0:05d110ee258e | 136 | if ( LPC_CT16B1->IR & (0x1<<1) ) |
alexan_e | 0:05d110ee258e | 137 | { |
alexan_e | 0:05d110ee258e | 138 | LPC_CT16B1->IR = 0x1<<1; /* clear interrupt flag */ |
alexan_e | 0:05d110ee258e | 139 | timer16_1_counter[1]++; |
alexan_e | 0:05d110ee258e | 140 | } |
alexan_e | 0:05d110ee258e | 141 | if ( LPC_CT16B1->IR & (0x1<<4) ) |
alexan_e | 0:05d110ee258e | 142 | { |
alexan_e | 0:05d110ee258e | 143 | LPC_CT16B1->IR = 0x1<<4; /* clear interrupt flag */ |
alexan_e | 0:05d110ee258e | 144 | timer16_1_capture[0]++; |
alexan_e | 0:05d110ee258e | 145 | } |
alexan_e | 0:05d110ee258e | 146 | if ( LPC_CT16B1->IR & (0x1<<5) ) |
alexan_e | 0:05d110ee258e | 147 | { |
alexan_e | 0:05d110ee258e | 148 | LPC_CT16B1->IR = 0x1<<5; /* clear interrupt flag */ |
alexan_e | 0:05d110ee258e | 149 | timer16_1_capture[1]++; |
alexan_e | 0:05d110ee258e | 150 | } |
alexan_e | 0:05d110ee258e | 151 | return; |
alexan_e | 0:05d110ee258e | 152 | } |
alexan_e | 0:05d110ee258e | 153 | |
alexan_e | 0:05d110ee258e | 154 | /****************************************************************************** |
alexan_e | 0:05d110ee258e | 155 | ** Function name: enable_timer |
alexan_e | 0:05d110ee258e | 156 | ** |
alexan_e | 0:05d110ee258e | 157 | ** Descriptions: Enable timer |
alexan_e | 0:05d110ee258e | 158 | ** |
alexan_e | 0:05d110ee258e | 159 | ** parameters: timer number: 0 or 1 |
alexan_e | 0:05d110ee258e | 160 | ** Returned value: None |
alexan_e | 0:05d110ee258e | 161 | ** |
alexan_e | 0:05d110ee258e | 162 | ******************************************************************************/ |
alexan_e | 0:05d110ee258e | 163 | void enable_timer16(uint8_t timer_num) |
alexan_e | 0:05d110ee258e | 164 | { |
alexan_e | 0:05d110ee258e | 165 | if ( timer_num == 0 ) |
alexan_e | 0:05d110ee258e | 166 | { |
alexan_e | 0:05d110ee258e | 167 | LPC_CT16B0->TCR = 1; |
alexan_e | 0:05d110ee258e | 168 | } |
alexan_e | 0:05d110ee258e | 169 | else |
alexan_e | 0:05d110ee258e | 170 | { |
alexan_e | 0:05d110ee258e | 171 | LPC_CT16B1->TCR = 1; |
alexan_e | 0:05d110ee258e | 172 | } |
alexan_e | 0:05d110ee258e | 173 | return; |
alexan_e | 0:05d110ee258e | 174 | } |
alexan_e | 0:05d110ee258e | 175 | |
alexan_e | 0:05d110ee258e | 176 | /****************************************************************************** |
alexan_e | 0:05d110ee258e | 177 | ** Function name: disable_timer |
alexan_e | 0:05d110ee258e | 178 | ** |
alexan_e | 0:05d110ee258e | 179 | ** Descriptions: Disable timer |
alexan_e | 0:05d110ee258e | 180 | ** |
alexan_e | 0:05d110ee258e | 181 | ** parameters: timer number: 0 or 1 |
alexan_e | 0:05d110ee258e | 182 | ** Returned value: None |
alexan_e | 0:05d110ee258e | 183 | ** |
alexan_e | 0:05d110ee258e | 184 | ******************************************************************************/ |
alexan_e | 0:05d110ee258e | 185 | void disable_timer16(uint8_t timer_num) |
alexan_e | 0:05d110ee258e | 186 | { |
alexan_e | 0:05d110ee258e | 187 | if ( timer_num == 0 ) |
alexan_e | 0:05d110ee258e | 188 | { |
alexan_e | 0:05d110ee258e | 189 | LPC_CT16B0->TCR = 0; |
alexan_e | 0:05d110ee258e | 190 | } |
alexan_e | 0:05d110ee258e | 191 | else |
alexan_e | 0:05d110ee258e | 192 | { |
alexan_e | 0:05d110ee258e | 193 | LPC_CT16B1->TCR = 0; |
alexan_e | 0:05d110ee258e | 194 | } |
alexan_e | 0:05d110ee258e | 195 | return; |
alexan_e | 0:05d110ee258e | 196 | } |
alexan_e | 0:05d110ee258e | 197 | |
alexan_e | 0:05d110ee258e | 198 | /****************************************************************************** |
alexan_e | 0:05d110ee258e | 199 | ** Function name: reset_timer |
alexan_e | 0:05d110ee258e | 200 | ** |
alexan_e | 0:05d110ee258e | 201 | ** Descriptions: Reset timer |
alexan_e | 0:05d110ee258e | 202 | ** |
alexan_e | 0:05d110ee258e | 203 | ** parameters: timer number: 0 or 1 |
alexan_e | 0:05d110ee258e | 204 | ** Returned value: None |
alexan_e | 0:05d110ee258e | 205 | ** |
alexan_e | 0:05d110ee258e | 206 | ******************************************************************************/ |
alexan_e | 0:05d110ee258e | 207 | void reset_timer16(uint8_t timer_num) |
alexan_e | 0:05d110ee258e | 208 | { |
alexan_e | 0:05d110ee258e | 209 | uint32_t regVal; |
alexan_e | 0:05d110ee258e | 210 | |
alexan_e | 0:05d110ee258e | 211 | if ( timer_num == 0 ) |
alexan_e | 0:05d110ee258e | 212 | { |
alexan_e | 0:05d110ee258e | 213 | regVal = LPC_CT16B0->TCR; |
alexan_e | 0:05d110ee258e | 214 | regVal |= 0x02; |
alexan_e | 0:05d110ee258e | 215 | LPC_CT16B0->TCR = regVal; |
alexan_e | 0:05d110ee258e | 216 | } |
alexan_e | 0:05d110ee258e | 217 | else |
alexan_e | 0:05d110ee258e | 218 | { |
alexan_e | 0:05d110ee258e | 219 | regVal = LPC_CT16B1->TCR; |
alexan_e | 0:05d110ee258e | 220 | regVal |= 0x02; |
alexan_e | 0:05d110ee258e | 221 | LPC_CT16B1->TCR = regVal; |
alexan_e | 0:05d110ee258e | 222 | } |
alexan_e | 0:05d110ee258e | 223 | return; |
alexan_e | 0:05d110ee258e | 224 | } |
alexan_e | 0:05d110ee258e | 225 | |
alexan_e | 0:05d110ee258e | 226 | /****************************************************************************** |
alexan_e | 0:05d110ee258e | 227 | ** Function name: Set_timer_capture |
alexan_e | 0:05d110ee258e | 228 | ** |
alexan_e | 0:05d110ee258e | 229 | ** Descriptions: set timer capture based on LOC number. |
alexan_e | 0:05d110ee258e | 230 | ** |
alexan_e | 0:05d110ee258e | 231 | ** parameters: timer number and location number |
alexan_e | 0:05d110ee258e | 232 | ** Returned value: None |
alexan_e | 0:05d110ee258e | 233 | ** |
alexan_e | 0:05d110ee258e | 234 | ******************************************************************************/ |
alexan_e | 0:05d110ee258e | 235 | void set_timer16_capture(uint8_t timer_num, uint8_t location ) |
alexan_e | 0:05d110ee258e | 236 | { |
alexan_e | 0:05d110ee258e | 237 | if ( timer_num == 0 ) |
alexan_e | 0:05d110ee258e | 238 | { |
alexan_e | 0:05d110ee258e | 239 | /* Timer0_16 I/O config */ |
alexan_e | 0:05d110ee258e | 240 | if ( location == 0 ) |
alexan_e | 0:05d110ee258e | 241 | { |
alexan_e | 0:05d110ee258e | 242 | LPC_IOCON->PIO1_16 &= ~0x07; |
alexan_e | 0:05d110ee258e | 243 | LPC_IOCON->PIO1_16 |= 0x02; /* Timer0_16 CAP0 */ |
alexan_e | 0:05d110ee258e | 244 | // LPC_IOCON->PIO1_17 &= ~0x07; |
alexan_e | 0:05d110ee258e | 245 | // LPC_IOCON->PIO1_17 |= 0x01; /* Timer0_16 CAP1 */ |
alexan_e | 0:05d110ee258e | 246 | } |
alexan_e | 0:05d110ee258e | 247 | else if ( location == 1 ) |
alexan_e | 0:05d110ee258e | 248 | { |
alexan_e | 0:05d110ee258e | 249 | LPC_IOCON->PIO0_2 &= ~0x07; |
alexan_e | 0:05d110ee258e | 250 | LPC_IOCON->PIO0_2 |= 0x02; /* Timer0_16 CAP0 */ |
alexan_e | 0:05d110ee258e | 251 | } |
alexan_e | 0:05d110ee258e | 252 | else |
alexan_e | 0:05d110ee258e | 253 | { |
alexan_e | 0:05d110ee258e | 254 | while ( 1 ); /* Fatal location number error */ |
alexan_e | 0:05d110ee258e | 255 | } |
alexan_e | 0:05d110ee258e | 256 | } |
alexan_e | 0:05d110ee258e | 257 | else |
alexan_e | 0:05d110ee258e | 258 | { |
alexan_e | 0:05d110ee258e | 259 | /* Timer1_16 I/O config */ |
alexan_e | 0:05d110ee258e | 260 | if ( location == 0 ) |
alexan_e | 0:05d110ee258e | 261 | { |
alexan_e | 0:05d110ee258e | 262 | LPC_IOCON->PIO0_20 &= ~0x07; /* Timer1_16 I/O config */ |
alexan_e | 0:05d110ee258e | 263 | LPC_IOCON->PIO0_20 |= 0x01; /* Timer1_16 CAP0 */ |
alexan_e | 0:05d110ee258e | 264 | // LPC_IOCON->PIO1_18 &= ~0x07; |
alexan_e | 0:05d110ee258e | 265 | // LPC_IOCON->PIO1_18 |= 0x01; /* Timer1_16 CAP1 */ |
alexan_e | 0:05d110ee258e | 266 | } |
alexan_e | 0:05d110ee258e | 267 | else |
alexan_e | 0:05d110ee258e | 268 | { |
alexan_e | 0:05d110ee258e | 269 | while ( 1 ); /* Fatal location number error */ |
alexan_e | 0:05d110ee258e | 270 | } |
alexan_e | 0:05d110ee258e | 271 | } |
alexan_e | 0:05d110ee258e | 272 | return; |
alexan_e | 0:05d110ee258e | 273 | } |
alexan_e | 0:05d110ee258e | 274 | |
alexan_e | 0:05d110ee258e | 275 | /****************************************************************************** |
alexan_e | 0:05d110ee258e | 276 | ** Function name: Set_timer_match |
alexan_e | 0:05d110ee258e | 277 | ** |
alexan_e | 0:05d110ee258e | 278 | ** Descriptions: set timer match based on LOC number. |
alexan_e | 0:05d110ee258e | 279 | ** |
alexan_e | 0:05d110ee258e | 280 | ** parameters: timer number, match enable, and location number |
alexan_e | 0:05d110ee258e | 281 | ** Returned value: None |
alexan_e | 0:05d110ee258e | 282 | ** |
alexan_e | 0:05d110ee258e | 283 | ******************************************************************************/ |
alexan_e | 0:05d110ee258e | 284 | void set_timer16_match(uint8_t timer_num, uint8_t match_enable, uint8_t location) |
alexan_e | 0:05d110ee258e | 285 | { |
alexan_e | 0:05d110ee258e | 286 | if ( timer_num == 0 ) |
alexan_e | 0:05d110ee258e | 287 | { |
alexan_e | 0:05d110ee258e | 288 | if ( match_enable & 0x01 ) |
alexan_e | 0:05d110ee258e | 289 | { |
alexan_e | 0:05d110ee258e | 290 | /* Timer0_16 I/O config */ |
alexan_e | 0:05d110ee258e | 291 | if ( location == 0 ) |
alexan_e | 0:05d110ee258e | 292 | { |
alexan_e | 0:05d110ee258e | 293 | LPC_IOCON->PIO0_8 &= ~0x07; |
alexan_e | 0:05d110ee258e | 294 | LPC_IOCON->PIO0_8 |= 0x02; /* Timer0_16 MAT0 */ |
alexan_e | 0:05d110ee258e | 295 | } |
alexan_e | 0:05d110ee258e | 296 | else if ( location == 1 ) |
alexan_e | 0:05d110ee258e | 297 | { |
alexan_e | 0:05d110ee258e | 298 | LPC_IOCON->PIO1_13 &= ~0x07; |
alexan_e | 0:05d110ee258e | 299 | LPC_IOCON->PIO1_13 |= 0x02; /* Timer0_16 MAT0 */ |
alexan_e | 0:05d110ee258e | 300 | } |
alexan_e | 0:05d110ee258e | 301 | } |
alexan_e | 0:05d110ee258e | 302 | if ( match_enable & 0x02 ) |
alexan_e | 0:05d110ee258e | 303 | { |
alexan_e | 0:05d110ee258e | 304 | /* Timer0_16 I/O config */ |
alexan_e | 0:05d110ee258e | 305 | if ( location == 0 ) |
alexan_e | 0:05d110ee258e | 306 | { |
alexan_e | 0:05d110ee258e | 307 | LPC_IOCON->PIO0_9 &= ~0x07; |
alexan_e | 0:05d110ee258e | 308 | LPC_IOCON->PIO0_9 |= 0x02; /* Timer0_16 MAT1 */ |
alexan_e | 0:05d110ee258e | 309 | } |
alexan_e | 0:05d110ee258e | 310 | else if ( location == 1 ) |
alexan_e | 0:05d110ee258e | 311 | { |
alexan_e | 0:05d110ee258e | 312 | LPC_IOCON->PIO1_14 &= ~0x07; |
alexan_e | 0:05d110ee258e | 313 | LPC_IOCON->PIO1_14 |= 0x02; /* Timer0_16 MAT1 */ |
alexan_e | 0:05d110ee258e | 314 | } |
alexan_e | 0:05d110ee258e | 315 | } |
alexan_e | 0:05d110ee258e | 316 | if ( match_enable & 0x04 ) |
alexan_e | 0:05d110ee258e | 317 | { |
alexan_e | 0:05d110ee258e | 318 | /* Timer0_16 I/O config */ |
alexan_e | 0:05d110ee258e | 319 | if ( location == 0 ) |
alexan_e | 0:05d110ee258e | 320 | { |
alexan_e | 0:05d110ee258e | 321 | #ifdef __SWD_DISABLED |
alexan_e | 0:05d110ee258e | 322 | LPC_IOCON->SWCLK_PIO0_10 &= ~0x07; |
alexan_e | 0:05d110ee258e | 323 | LPC_IOCON->SWCLK_PIO0_10 |= 0x03; /* Timer0_16 MAT2 */ |
alexan_e | 0:05d110ee258e | 324 | #endif |
alexan_e | 0:05d110ee258e | 325 | } |
alexan_e | 0:05d110ee258e | 326 | else if ( location == 1 ) |
alexan_e | 0:05d110ee258e | 327 | { |
alexan_e | 0:05d110ee258e | 328 | LPC_IOCON->PIO1_15 &= ~0x07; |
alexan_e | 0:05d110ee258e | 329 | LPC_IOCON->PIO1_15 |= 0x02; /* Timer0_16 MAT0 */ |
alexan_e | 0:05d110ee258e | 330 | } |
alexan_e | 0:05d110ee258e | 331 | } |
alexan_e | 0:05d110ee258e | 332 | } |
alexan_e | 0:05d110ee258e | 333 | else if ( timer_num == 1 ) |
alexan_e | 0:05d110ee258e | 334 | { |
alexan_e | 0:05d110ee258e | 335 | if ( match_enable & 0x01 ) |
alexan_e | 0:05d110ee258e | 336 | { |
alexan_e | 0:05d110ee258e | 337 | /* Timer1_16 I/O config */ |
alexan_e | 0:05d110ee258e | 338 | if ( location == 0 ) |
alexan_e | 0:05d110ee258e | 339 | { |
alexan_e | 0:05d110ee258e | 340 | LPC_IOCON->PIO0_21 &= ~0x07; |
alexan_e | 0:05d110ee258e | 341 | LPC_IOCON->PIO0_21 |= 0x01; /* Timer1_16 MAT0 */ |
alexan_e | 0:05d110ee258e | 342 | } |
alexan_e | 0:05d110ee258e | 343 | } |
alexan_e | 0:05d110ee258e | 344 | if ( match_enable & 0x02 ) |
alexan_e | 0:05d110ee258e | 345 | { |
alexan_e | 0:05d110ee258e | 346 | /* Timer1_16 I/O config */ |
alexan_e | 0:05d110ee258e | 347 | if ( location == 0 ) |
alexan_e | 0:05d110ee258e | 348 | { |
alexan_e | 0:05d110ee258e | 349 | LPC_IOCON->PIO0_22 &= ~0x07; |
alexan_e | 0:05d110ee258e | 350 | LPC_IOCON->PIO0_22 |= 0x02; /* Timer1_16 MAT1 */ |
alexan_e | 0:05d110ee258e | 351 | } |
alexan_e | 0:05d110ee258e | 352 | else if ( location == 1 ) |
alexan_e | 0:05d110ee258e | 353 | { |
alexan_e | 0:05d110ee258e | 354 | LPC_IOCON->PIO1_23 &= ~0x07; |
alexan_e | 0:05d110ee258e | 355 | LPC_IOCON->PIO1_23 |= 0x01; /* Timer1_16 MAT0 */ |
alexan_e | 0:05d110ee258e | 356 | } |
alexan_e | 0:05d110ee258e | 357 | } |
alexan_e | 0:05d110ee258e | 358 | } |
alexan_e | 0:05d110ee258e | 359 | return; |
alexan_e | 0:05d110ee258e | 360 | } |
alexan_e | 0:05d110ee258e | 361 | |
alexan_e | 0:05d110ee258e | 362 | /****************************************************************************** |
alexan_e | 0:05d110ee258e | 363 | ** Function name: init_timer |
alexan_e | 0:05d110ee258e | 364 | ** |
alexan_e | 0:05d110ee258e | 365 | ** Descriptions: Initialize timer, set timer interval, reset timer, |
alexan_e | 0:05d110ee258e | 366 | ** install timer interrupt handler |
alexan_e | 0:05d110ee258e | 367 | ** |
alexan_e | 0:05d110ee258e | 368 | ** parameters: timer number and timer interval |
alexan_e | 0:05d110ee258e | 369 | ** Returned value: None |
alexan_e | 0:05d110ee258e | 370 | ** |
alexan_e | 0:05d110ee258e | 371 | ******************************************************************************/ |
alexan_e | 0:05d110ee258e | 372 | void init_timer16(uint8_t timer_num, uint32_t TimerInterval) |
alexan_e | 0:05d110ee258e | 373 | { |
alexan_e | 0:05d110ee258e | 374 | if ( timer_num == 0 ) |
alexan_e | 0:05d110ee258e | 375 | { |
alexan_e | 0:05d110ee258e | 376 | /* Some of the I/O pins need to be clearfully planned if |
alexan_e | 0:05d110ee258e | 377 | you use below module because JTAG and TIMER CAP/MAT pins are muxed. */ |
alexan_e | 0:05d110ee258e | 378 | LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7); |
alexan_e | 0:05d110ee258e | 379 | |
alexan_e | 0:05d110ee258e | 380 | LPC_CT16B0->MR0 = TimerInterval; |
alexan_e | 0:05d110ee258e | 381 | LPC_CT16B0->MR1 = TimerInterval; |
alexan_e | 0:05d110ee258e | 382 | #if TIMER_MATCH |
alexan_e | 0:05d110ee258e | 383 | timer16_0_counter[0] = 0; |
alexan_e | 0:05d110ee258e | 384 | timer16_0_counter[1] = 0; |
alexan_e | 0:05d110ee258e | 385 | set_timer16_match(timer_num, 0x07, 0); |
alexan_e | 0:05d110ee258e | 386 | LPC_CT16B0->EMR &= ~(0xFF<<4); |
alexan_e | 0:05d110ee258e | 387 | LPC_CT16B0->EMR |= ((0x3<<4)|(0x3<<6)|(0x3<<8)); |
alexan_e | 0:05d110ee258e | 388 | #else |
alexan_e | 0:05d110ee258e | 389 | timer16_0_capture[0] = 0; |
alexan_e | 0:05d110ee258e | 390 | timer16_0_capture[1] = 0; |
alexan_e | 0:05d110ee258e | 391 | set_timer16_capture(timer_num, 0); |
alexan_e | 0:05d110ee258e | 392 | /* Capture 0 and 1 on rising edge, interrupt enable. */ |
alexan_e | 0:05d110ee258e | 393 | LPC_CT16B0->CCR = (0x5<<0)|(0x5<<3); |
alexan_e | 0:05d110ee258e | 394 | #endif |
alexan_e | 0:05d110ee258e | 395 | LPC_CT16B0->MCR = (0x3<<0)|(0x3<<3); /* Interrupt and Reset on MR0 and MR1 */ |
alexan_e | 0:05d110ee258e | 396 | |
alexan_e | 0:05d110ee258e | 397 | /* Enable the TIMER0 Interrupt */ |
alexan_e | 0:05d110ee258e | 398 | #if NMI_ENABLED |
alexan_e | 0:05d110ee258e | 399 | NVIC_DisableIRQ(TIMER_16_0_IRQn); |
alexan_e | 0:05d110ee258e | 400 | NMI_Init( TIMER_16_0_IRQn ); |
alexan_e | 0:05d110ee258e | 401 | #else |
alexan_e | 0:05d110ee258e | 402 | NVIC_EnableIRQ(TIMER_16_0_IRQn); |
alexan_e | 0:05d110ee258e | 403 | #endif |
alexan_e | 0:05d110ee258e | 404 | } |
alexan_e | 0:05d110ee258e | 405 | else if ( timer_num == 1 ) |
alexan_e | 0:05d110ee258e | 406 | { |
alexan_e | 0:05d110ee258e | 407 | /* Some of the I/O pins need to be clearfully planned if |
alexan_e | 0:05d110ee258e | 408 | you use below module because JTAG and TIMER CAP/MAT pins are muxed. */ |
alexan_e | 0:05d110ee258e | 409 | LPC_SYSCON->SYSAHBCLKCTRL |= (1<<8); |
alexan_e | 0:05d110ee258e | 410 | LPC_CT16B1->MR0 = TimerInterval; |
alexan_e | 0:05d110ee258e | 411 | LPC_CT16B1->MR1 = TimerInterval; |
alexan_e | 0:05d110ee258e | 412 | #if TIMER_MATCH |
alexan_e | 0:05d110ee258e | 413 | timer16_1_counter[0] = 0; |
alexan_e | 0:05d110ee258e | 414 | timer16_1_counter[1] = 0; |
alexan_e | 0:05d110ee258e | 415 | set_timer16_match(timer_num, 0x07, 0); |
alexan_e | 0:05d110ee258e | 416 | LPC_CT16B1->EMR &= ~(0xFF<<4); |
alexan_e | 0:05d110ee258e | 417 | LPC_CT16B1->EMR |= ((0x3<<4)|(0x3<<6)|(0x3<<8)); |
alexan_e | 0:05d110ee258e | 418 | #else |
alexan_e | 0:05d110ee258e | 419 | timer16_1_capture[0] = 0; |
alexan_e | 0:05d110ee258e | 420 | timer16_1_capture[1] = 0; |
alexan_e | 0:05d110ee258e | 421 | set_timer16_capture(timer_num, 0); |
alexan_e | 0:05d110ee258e | 422 | /* Capture 0 and 1 on rising edge, interrupt enable. */ |
alexan_e | 0:05d110ee258e | 423 | LPC_CT16B1->CCR = (0x5<<0)|(0x5<<3); |
alexan_e | 0:05d110ee258e | 424 | #endif |
alexan_e | 0:05d110ee258e | 425 | LPC_CT16B1->MCR = (0x3<<0)|(0x3<<3); /* Interrupt and Reset on MR0 and MR1 */ |
alexan_e | 0:05d110ee258e | 426 | |
alexan_e | 0:05d110ee258e | 427 | /* Enable the TIMER1 Interrupt */ |
alexan_e | 0:05d110ee258e | 428 | #if NMI_ENABLED |
alexan_e | 0:05d110ee258e | 429 | NVIC_DisableIRQ(TIMER_16_1_IRQn); |
alexan_e | 0:05d110ee258e | 430 | NMI_Init( TIMER_16_1_IRQn ); |
alexan_e | 0:05d110ee258e | 431 | #else |
alexan_e | 0:05d110ee258e | 432 | NVIC_EnableIRQ(TIMER_16_1_IRQn); |
alexan_e | 0:05d110ee258e | 433 | #endif |
alexan_e | 0:05d110ee258e | 434 | } |
alexan_e | 0:05d110ee258e | 435 | return; |
alexan_e | 0:05d110ee258e | 436 | } |
alexan_e | 0:05d110ee258e | 437 | |
alexan_e | 0:05d110ee258e | 438 | /****************************************************************************** |
alexan_e | 0:05d110ee258e | 439 | ** Function name: init_timer16PWM |
alexan_e | 0:05d110ee258e | 440 | ** |
alexan_e | 0:05d110ee258e | 441 | ** Descriptions: Initialize timer as PWM |
alexan_e | 0:05d110ee258e | 442 | ** |
alexan_e | 0:05d110ee258e | 443 | ** parameters: timer number, period and match enable: |
alexan_e | 0:05d110ee258e | 444 | ** match_enable[0] = PWM for MAT0 |
alexan_e | 0:05d110ee258e | 445 | ** match_enable[1] = PWM for MAT1 |
alexan_e | 0:05d110ee258e | 446 | ** match_enable[2] = PWM for MAT2 |
alexan_e | 0:05d110ee258e | 447 | ** |
alexan_e | 0:05d110ee258e | 448 | ** Returned value: None |
alexan_e | 0:05d110ee258e | 449 | ** |
alexan_e | 0:05d110ee258e | 450 | ******************************************************************************/ |
alexan_e | 0:05d110ee258e | 451 | void init_timer16PWM(uint8_t timer_num, uint32_t period, uint8_t match_enable, uint8_t cap_enabled) |
alexan_e | 0:05d110ee258e | 452 | { |
alexan_e | 0:05d110ee258e | 453 | disable_timer16(timer_num); |
alexan_e | 0:05d110ee258e | 454 | |
alexan_e | 0:05d110ee258e | 455 | if (timer_num == 1) |
alexan_e | 0:05d110ee258e | 456 | { |
alexan_e | 0:05d110ee258e | 457 | /* Some of the I/O pins need to be clearfully planned if |
alexan_e | 0:05d110ee258e | 458 | you use below module because JTAG and TIMER CAP/MAT pins are muxed. */ |
alexan_e | 0:05d110ee258e | 459 | LPC_SYSCON->SYSAHBCLKCTRL |= (1<<8); |
alexan_e | 0:05d110ee258e | 460 | |
alexan_e | 0:05d110ee258e | 461 | /* Setup the external match register */ |
alexan_e | 0:05d110ee258e | 462 | LPC_CT16B1->EMR = (1<<EMC3)|(1<<EMC2)|(1<<EMC1)|(2<<EMC0)|(1<<3)|(match_enable); |
alexan_e | 0:05d110ee258e | 463 | |
alexan_e | 0:05d110ee258e | 464 | /* Setup the outputs */ |
alexan_e | 0:05d110ee258e | 465 | /* If match0 is enabled, set the output */ |
alexan_e | 0:05d110ee258e | 466 | set_timer16_match(timer_num, match_enable, 0 ); |
alexan_e | 0:05d110ee258e | 467 | |
alexan_e | 0:05d110ee258e | 468 | /* Enable the selected PWMs and enable Match3 */ |
alexan_e | 0:05d110ee258e | 469 | LPC_CT16B1->PWMC = (1<<3)|(match_enable); |
alexan_e | 0:05d110ee258e | 470 | |
alexan_e | 0:05d110ee258e | 471 | /* Setup the match registers */ |
alexan_e | 0:05d110ee258e | 472 | /* set the period value to a global variable */ |
alexan_e | 0:05d110ee258e | 473 | timer16_1_period = period; |
alexan_e | 0:05d110ee258e | 474 | LPC_CT16B1->MR3 = timer16_1_period; |
alexan_e | 0:05d110ee258e | 475 | LPC_CT16B1->MR0 = timer16_1_period/2; |
alexan_e | 0:05d110ee258e | 476 | LPC_CT16B1->MR1 = timer16_1_period/2; |
alexan_e | 0:05d110ee258e | 477 | LPC_CT16B1->MR2 = timer16_1_period/2; |
alexan_e | 0:05d110ee258e | 478 | |
alexan_e | 0:05d110ee258e | 479 | /* Set match control register */ |
alexan_e | 0:05d110ee258e | 480 | LPC_CT16B1->MCR = 1<<10;// | 1<<9; /* Reset on MR3 */ |
alexan_e | 0:05d110ee258e | 481 | |
alexan_e | 0:05d110ee258e | 482 | if (cap_enabled) |
alexan_e | 0:05d110ee258e | 483 | { |
alexan_e | 0:05d110ee258e | 484 | /* Use location 0 for test. */ |
alexan_e | 0:05d110ee258e | 485 | set_timer16_capture( timer_num, 0 ); |
alexan_e | 0:05d110ee258e | 486 | LPC_CT16B1->IR = 0xF; /* clear interrupt flag */ |
alexan_e | 0:05d110ee258e | 487 | |
alexan_e | 0:05d110ee258e | 488 | /* Set the capture control register */ |
alexan_e | 0:05d110ee258e | 489 | LPC_CT16B1->CCR = 7; |
alexan_e | 0:05d110ee258e | 490 | |
alexan_e | 0:05d110ee258e | 491 | } |
alexan_e | 0:05d110ee258e | 492 | /* Enable the TIMER1 Interrupt */ |
alexan_e | 0:05d110ee258e | 493 | NVIC_EnableIRQ(TIMER_16_1_IRQn); |
alexan_e | 0:05d110ee258e | 494 | } |
alexan_e | 0:05d110ee258e | 495 | else |
alexan_e | 0:05d110ee258e | 496 | { |
alexan_e | 0:05d110ee258e | 497 | LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7); |
alexan_e | 0:05d110ee258e | 498 | |
alexan_e | 0:05d110ee258e | 499 | /* Setup the external match register */ |
alexan_e | 0:05d110ee258e | 500 | LPC_CT16B0->EMR = (1<<EMC3)|(1<<EMC2)|(1<<EMC1)|(1<<EMC0)|(1<<3)|(match_enable); |
alexan_e | 0:05d110ee258e | 501 | |
alexan_e | 0:05d110ee258e | 502 | /* Setup the outputs */ |
alexan_e | 0:05d110ee258e | 503 | /* If match0 is enabled, set the output */ |
alexan_e | 0:05d110ee258e | 504 | set_timer16_match(timer_num, match_enable, 0 ); |
alexan_e | 0:05d110ee258e | 505 | |
alexan_e | 0:05d110ee258e | 506 | /* Enable the selected PWMs and enable Match3 */ |
alexan_e | 0:05d110ee258e | 507 | LPC_CT16B0->PWMC = (1<<3)|(match_enable); |
alexan_e | 0:05d110ee258e | 508 | |
alexan_e | 0:05d110ee258e | 509 | /* Setup the match registers */ |
alexan_e | 0:05d110ee258e | 510 | /* set the period value to a global variable */ |
alexan_e | 0:05d110ee258e | 511 | timer16_0_period = period; |
alexan_e | 0:05d110ee258e | 512 | LPC_CT16B0->MR3 = timer16_0_period; |
alexan_e | 0:05d110ee258e | 513 | LPC_CT16B0->MR0 = timer16_0_period/2; |
alexan_e | 0:05d110ee258e | 514 | LPC_CT16B0->MR1 = timer16_0_period/2; |
alexan_e | 0:05d110ee258e | 515 | LPC_CT16B0->MR2 = timer16_0_period/2; |
alexan_e | 0:05d110ee258e | 516 | |
alexan_e | 0:05d110ee258e | 517 | /* Set the match control register */ |
alexan_e | 0:05d110ee258e | 518 | LPC_CT16B0->MCR = 1<<10; /* Reset on MR3 */ |
alexan_e | 0:05d110ee258e | 519 | |
alexan_e | 0:05d110ee258e | 520 | /* Enable the TIMER1 Interrupt */ |
alexan_e | 0:05d110ee258e | 521 | NVIC_EnableIRQ(TIMER_16_0_IRQn); |
alexan_e | 0:05d110ee258e | 522 | } |
alexan_e | 0:05d110ee258e | 523 | } |
alexan_e | 0:05d110ee258e | 524 | |
alexan_e | 0:05d110ee258e | 525 | /****************************************************************************** |
alexan_e | 0:05d110ee258e | 526 | ** Function name: pwm16_setMatch |
alexan_e | 0:05d110ee258e | 527 | ** |
alexan_e | 0:05d110ee258e | 528 | ** Descriptions: Set the pwm16 match values |
alexan_e | 0:05d110ee258e | 529 | ** |
alexan_e | 0:05d110ee258e | 530 | ** parameters: timer number, match numner and the value |
alexan_e | 0:05d110ee258e | 531 | ** |
alexan_e | 0:05d110ee258e | 532 | ** Returned value: None |
alexan_e | 0:05d110ee258e | 533 | ** |
alexan_e | 0:05d110ee258e | 534 | ******************************************************************************/ |
alexan_e | 0:05d110ee258e | 535 | void setMatch_timer16PWM (uint8_t timer_num, uint8_t match_nr, uint32_t value) |
alexan_e | 0:05d110ee258e | 536 | { |
alexan_e | 0:05d110ee258e | 537 | if (timer_num) |
alexan_e | 0:05d110ee258e | 538 | { |
alexan_e | 0:05d110ee258e | 539 | switch (match_nr) |
alexan_e | 0:05d110ee258e | 540 | { |
alexan_e | 0:05d110ee258e | 541 | case 0: |
alexan_e | 0:05d110ee258e | 542 | LPC_CT16B1->MR0 = value; |
alexan_e | 0:05d110ee258e | 543 | break; |
alexan_e | 0:05d110ee258e | 544 | case 1: |
alexan_e | 0:05d110ee258e | 545 | LPC_CT16B1->MR1 = value; |
alexan_e | 0:05d110ee258e | 546 | break; |
alexan_e | 0:05d110ee258e | 547 | case 2: |
alexan_e | 0:05d110ee258e | 548 | LPC_CT16B1->MR2 = value; |
alexan_e | 0:05d110ee258e | 549 | break; |
alexan_e | 0:05d110ee258e | 550 | case 3: |
alexan_e | 0:05d110ee258e | 551 | LPC_CT16B1->MR3 = value; |
alexan_e | 0:05d110ee258e | 552 | break; |
alexan_e | 0:05d110ee258e | 553 | default: |
alexan_e | 0:05d110ee258e | 554 | break; |
alexan_e | 0:05d110ee258e | 555 | } |
alexan_e | 0:05d110ee258e | 556 | } |
alexan_e | 0:05d110ee258e | 557 | else |
alexan_e | 0:05d110ee258e | 558 | { |
alexan_e | 0:05d110ee258e | 559 | switch (match_nr) |
alexan_e | 0:05d110ee258e | 560 | { |
alexan_e | 0:05d110ee258e | 561 | case 0: |
alexan_e | 0:05d110ee258e | 562 | LPC_CT16B0->MR0 = value; |
alexan_e | 0:05d110ee258e | 563 | break; |
alexan_e | 0:05d110ee258e | 564 | case 1: |
alexan_e | 0:05d110ee258e | 565 | LPC_CT16B0->MR1 = value; |
alexan_e | 0:05d110ee258e | 566 | break; |
alexan_e | 0:05d110ee258e | 567 | case 2: |
alexan_e | 0:05d110ee258e | 568 | LPC_CT16B0->MR2 = value; |
alexan_e | 0:05d110ee258e | 569 | break; |
alexan_e | 0:05d110ee258e | 570 | case 3: |
alexan_e | 0:05d110ee258e | 571 | LPC_CT16B0->MR3 = value; |
alexan_e | 0:05d110ee258e | 572 | break; |
alexan_e | 0:05d110ee258e | 573 | default: |
alexan_e | 0:05d110ee258e | 574 | break; |
alexan_e | 0:05d110ee258e | 575 | } |
alexan_e | 0:05d110ee258e | 576 | } |
alexan_e | 0:05d110ee258e | 577 | } |
alexan_e | 0:05d110ee258e | 578 | |
alexan_e | 0:05d110ee258e | 579 | /****************************************************************************** |
alexan_e | 0:05d110ee258e | 580 | ** End Of File |
alexan_e | 0:05d110ee258e | 581 | ******************************************************************************/ |