blinky example from NXP code bundle for LPC11Uxx. No mbed library used

Dependencies:   mbed

Committer:
alexan_e
Date:
Mon May 28 00:13:23 2012 +0000
Revision:
1:0f1be4e75668

        

Who changed what in which revision?

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