The common folder libraries from keil LPC11Uxx code bundle

Committer:
alexan_e
Date:
Sun May 27 23:59:30 2012 +0000
Revision:
0:05d110ee258e

        

Who changed what in which revision?

UserRevisionLine numberNew 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 ******************************************************************************/