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:: timer32.c 9190 2012-02-16 20:59:45Z nxp41306 $
alexan_e 0:05d110ee258e 3 * Project: NXP LPC11Uxx 32-bit timer example
alexan_e 0:05d110ee258e 4 *
alexan_e 0:05d110ee258e 5 * Description:
alexan_e 0:05d110ee258e 6 * This file contains 32-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 "timer32.h"
alexan_e 0:05d110ee258e 33 #include "nmi.h"
alexan_e 0:05d110ee258e 34
alexan_e 0:05d110ee258e 35 volatile uint32_t timer32_0_counter[4] = {0,0,0,0};
alexan_e 0:05d110ee258e 36 volatile uint32_t timer32_1_counter[4] = {0,0,0,0};
alexan_e 0:05d110ee258e 37 volatile uint32_t timer32_0_capture[4] = {0,0,0,0};
alexan_e 0:05d110ee258e 38 volatile uint32_t timer32_1_capture[4] = {0,0,0,0};
alexan_e 0:05d110ee258e 39 volatile uint32_t timer32_0_period = 0;
alexan_e 0:05d110ee258e 40 volatile uint32_t timer32_1_period = 0;
alexan_e 0:05d110ee258e 41
alexan_e 0:05d110ee258e 42 /*****************************************************************************
alexan_e 0:05d110ee258e 43 ** Function name: delay32Ms
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 delay32Ms(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 /* setup timer #0 for delay */
alexan_e 0:05d110ee258e 58 LPC_CT32B0->TCR = 0x02; /* reset timer */
alexan_e 0:05d110ee258e 59 LPC_CT32B0->PR = 0x00; /* set prescaler to zero */
alexan_e 0:05d110ee258e 60 LPC_CT32B0->MR0 = delayInMs * (SystemCoreClock / 1000);
alexan_e 0:05d110ee258e 61 LPC_CT32B0->IR = 0xff; /* reset all interrrupts */
alexan_e 0:05d110ee258e 62 LPC_CT32B0->MCR = 0x04; /* stop timer on match */
alexan_e 0:05d110ee258e 63 LPC_CT32B0->TCR = 0x01; /* start timer */
alexan_e 0:05d110ee258e 64
alexan_e 0:05d110ee258e 65 /* wait until delay time has elapsed */
alexan_e 0:05d110ee258e 66 while (LPC_CT32B0->TCR & 0x01);
alexan_e 0:05d110ee258e 67 }
alexan_e 0:05d110ee258e 68 else if (timer_num == 1)
alexan_e 0:05d110ee258e 69 {
alexan_e 0:05d110ee258e 70 /* setup timer #1 for delay */
alexan_e 0:05d110ee258e 71 LPC_CT32B1->TCR = 0x02; /* reset timer */
alexan_e 0:05d110ee258e 72 LPC_CT32B1->PR = 0x00; /* set prescaler to zero */
alexan_e 0:05d110ee258e 73 LPC_CT32B1->MR0 = delayInMs * (SystemCoreClock / 1000);
alexan_e 0:05d110ee258e 74 LPC_CT32B1->IR = 0xff; /* reset all interrrupts */
alexan_e 0:05d110ee258e 75 LPC_CT32B1->MCR = 0x04; /* stop timer on match */
alexan_e 0:05d110ee258e 76 LPC_CT32B1->TCR = 0x01; /* start timer */
alexan_e 0:05d110ee258e 77
alexan_e 0:05d110ee258e 78 /* wait until delay time has elapsed */
alexan_e 0:05d110ee258e 79 while (LPC_CT32B1->TCR & 0x01);
alexan_e 0:05d110ee258e 80 }
alexan_e 0:05d110ee258e 81 return;
alexan_e 0:05d110ee258e 82 }
alexan_e 0:05d110ee258e 83
alexan_e 0:05d110ee258e 84 /******************************************************************************
alexan_e 0:05d110ee258e 85 ** Function name: TIMER32_0_IRQHandler
alexan_e 0:05d110ee258e 86 **
alexan_e 0:05d110ee258e 87 ** Descriptions: Timer/CounterX and captureX interrupt handler
alexan_e 0:05d110ee258e 88 **
alexan_e 0:05d110ee258e 89 ** parameters: None
alexan_e 0:05d110ee258e 90 ** Returned value: None
alexan_e 0:05d110ee258e 91 **
alexan_e 0:05d110ee258e 92 ******************************************************************************/
alexan_e 0:05d110ee258e 93 void TIMER32_0_IRQHandler(void)
alexan_e 0:05d110ee258e 94 {
alexan_e 0:05d110ee258e 95 if ( LPC_CT32B0->IR & (0x01<<0) )
alexan_e 0:05d110ee258e 96 {
alexan_e 0:05d110ee258e 97 LPC_CT32B0->IR = 0x1<<0; /* clear interrupt flag */
alexan_e 0:05d110ee258e 98 timer32_0_counter[0]++;
alexan_e 0:05d110ee258e 99 }
alexan_e 0:05d110ee258e 100 if ( LPC_CT32B0->IR & (0x01<<1) )
alexan_e 0:05d110ee258e 101 {
alexan_e 0:05d110ee258e 102 LPC_CT32B0->IR = 0x1<<1; /* clear interrupt flag */
alexan_e 0:05d110ee258e 103 timer32_0_counter[1]++;
alexan_e 0:05d110ee258e 104 }
alexan_e 0:05d110ee258e 105 if ( LPC_CT32B0->IR & (0x01<<2) )
alexan_e 0:05d110ee258e 106 {
alexan_e 0:05d110ee258e 107 LPC_CT32B0->IR = 0x1<<2; /* clear interrupt flag */
alexan_e 0:05d110ee258e 108 timer32_0_counter[2]++;
alexan_e 0:05d110ee258e 109 }
alexan_e 0:05d110ee258e 110 if ( LPC_CT32B0->IR & (0x01<<3) )
alexan_e 0:05d110ee258e 111 {
alexan_e 0:05d110ee258e 112 LPC_CT32B0->IR = 0x1<<3; /* clear interrupt flag */
alexan_e 0:05d110ee258e 113 timer32_0_counter[3]++;
alexan_e 0:05d110ee258e 114 }
alexan_e 0:05d110ee258e 115 if ( LPC_CT32B0->IR & (0x1<<4) )
alexan_e 0:05d110ee258e 116 {
alexan_e 0:05d110ee258e 117 LPC_CT32B0->IR = 0x1<<4; /* clear interrupt flag */
alexan_e 0:05d110ee258e 118 timer32_0_capture[0]++;
alexan_e 0:05d110ee258e 119 }
alexan_e 0:05d110ee258e 120 if ( LPC_CT32B0->IR & (0x1<<5) )
alexan_e 0:05d110ee258e 121 {
alexan_e 0:05d110ee258e 122 LPC_CT32B0->IR = 0x1<<5; /* clear interrupt flag */
alexan_e 0:05d110ee258e 123 timer32_0_capture[1]++;
alexan_e 0:05d110ee258e 124 }
alexan_e 0:05d110ee258e 125 if ( LPC_CT32B0->IR & (0x1<<6) )
alexan_e 0:05d110ee258e 126 {
alexan_e 0:05d110ee258e 127 LPC_CT32B0->IR = 0x1<<6; /* clear interrupt flag */
alexan_e 0:05d110ee258e 128 timer32_0_capture[2]++;
alexan_e 0:05d110ee258e 129 }
alexan_e 0:05d110ee258e 130 if ( LPC_CT32B0->IR & (0x1<<7) )
alexan_e 0:05d110ee258e 131 {
alexan_e 0:05d110ee258e 132 LPC_CT32B0->IR = 0x1<<7; /* clear interrupt flag */
alexan_e 0:05d110ee258e 133 timer32_0_capture[3]++;
alexan_e 0:05d110ee258e 134 }
alexan_e 0:05d110ee258e 135 return;
alexan_e 0:05d110ee258e 136 }
alexan_e 0:05d110ee258e 137
alexan_e 0:05d110ee258e 138 /******************************************************************************
alexan_e 0:05d110ee258e 139 ** Function name: TIMER32_1_IRQHandler
alexan_e 0:05d110ee258e 140 **
alexan_e 0:05d110ee258e 141 ** Descriptions: Timer/CounterX and captureX interrupt handler
alexan_e 0:05d110ee258e 142 **
alexan_e 0:05d110ee258e 143 ** parameters: None
alexan_e 0:05d110ee258e 144 ** Returned value: None
alexan_e 0:05d110ee258e 145 **
alexan_e 0:05d110ee258e 146 ******************************************************************************/
alexan_e 0:05d110ee258e 147 void TIMER32_1_IRQHandler(void)
alexan_e 0:05d110ee258e 148 {
alexan_e 0:05d110ee258e 149 if ( LPC_CT32B1->IR & (0x01<<0) )
alexan_e 0:05d110ee258e 150 {
alexan_e 0:05d110ee258e 151 LPC_CT32B1->IR = 0x1<<0; /* clear interrupt flag */
alexan_e 0:05d110ee258e 152 timer32_1_counter[0]++;
alexan_e 0:05d110ee258e 153 }
alexan_e 0:05d110ee258e 154 if ( LPC_CT32B1->IR & (0x01<<1) )
alexan_e 0:05d110ee258e 155 {
alexan_e 0:05d110ee258e 156 LPC_CT32B1->IR = 0x1<<1; /* clear interrupt flag */
alexan_e 0:05d110ee258e 157 timer32_1_counter[1]++;
alexan_e 0:05d110ee258e 158 }
alexan_e 0:05d110ee258e 159 if ( LPC_CT32B1->IR & (0x01<<2) )
alexan_e 0:05d110ee258e 160 {
alexan_e 0:05d110ee258e 161 LPC_CT32B1->IR = 0x1<<2; /* clear interrupt flag */
alexan_e 0:05d110ee258e 162 timer32_1_counter[2]++;
alexan_e 0:05d110ee258e 163 }
alexan_e 0:05d110ee258e 164 if ( LPC_CT32B1->IR & (0x01<<3) )
alexan_e 0:05d110ee258e 165 {
alexan_e 0:05d110ee258e 166 LPC_CT32B1->IR = 0x1<<3; /* clear interrupt flag */
alexan_e 0:05d110ee258e 167 timer32_1_counter[3]++;
alexan_e 0:05d110ee258e 168 }
alexan_e 0:05d110ee258e 169 if ( LPC_CT32B1->IR & (0x1<<4) )
alexan_e 0:05d110ee258e 170 {
alexan_e 0:05d110ee258e 171 LPC_CT32B1->IR = 0x1<<4; /* clear interrupt flag */
alexan_e 0:05d110ee258e 172 timer32_1_capture[0]++;
alexan_e 0:05d110ee258e 173 }
alexan_e 0:05d110ee258e 174 if ( LPC_CT32B1->IR & (0x1<<5) )
alexan_e 0:05d110ee258e 175 {
alexan_e 0:05d110ee258e 176 LPC_CT32B1->IR = 0x1<<5; /* clear interrupt flag */
alexan_e 0:05d110ee258e 177 timer32_1_capture[1]++;
alexan_e 0:05d110ee258e 178 }
alexan_e 0:05d110ee258e 179 if ( LPC_CT32B1->IR & (0x1<<6) )
alexan_e 0:05d110ee258e 180 {
alexan_e 0:05d110ee258e 181 LPC_CT32B1->IR = 0x1<<6; /* clear interrupt flag */
alexan_e 0:05d110ee258e 182 timer32_1_capture[2]++;
alexan_e 0:05d110ee258e 183 }
alexan_e 0:05d110ee258e 184 if ( LPC_CT32B1->IR & (0x1<<7) )
alexan_e 0:05d110ee258e 185 {
alexan_e 0:05d110ee258e 186 LPC_CT32B1->IR = 0x1<<7; /* clear interrupt flag */
alexan_e 0:05d110ee258e 187 timer32_1_capture[3]++;
alexan_e 0:05d110ee258e 188 }
alexan_e 0:05d110ee258e 189 return;
alexan_e 0:05d110ee258e 190 }
alexan_e 0:05d110ee258e 191
alexan_e 0:05d110ee258e 192 /******************************************************************************
alexan_e 0:05d110ee258e 193 ** Function name: enable_timer
alexan_e 0:05d110ee258e 194 **
alexan_e 0:05d110ee258e 195 ** Descriptions: Enable timer
alexan_e 0:05d110ee258e 196 **
alexan_e 0:05d110ee258e 197 ** parameters: timer number: 0 or 1
alexan_e 0:05d110ee258e 198 ** Returned value: None
alexan_e 0:05d110ee258e 199 **
alexan_e 0:05d110ee258e 200 ******************************************************************************/
alexan_e 0:05d110ee258e 201 void enable_timer32(uint8_t timer_num)
alexan_e 0:05d110ee258e 202 {
alexan_e 0:05d110ee258e 203 if ( timer_num == 0 )
alexan_e 0:05d110ee258e 204 {
alexan_e 0:05d110ee258e 205 LPC_CT32B0->TCR = 1;
alexan_e 0:05d110ee258e 206 }
alexan_e 0:05d110ee258e 207 else
alexan_e 0:05d110ee258e 208 {
alexan_e 0:05d110ee258e 209 LPC_CT32B1->TCR = 1;
alexan_e 0:05d110ee258e 210 }
alexan_e 0:05d110ee258e 211 return;
alexan_e 0:05d110ee258e 212 }
alexan_e 0:05d110ee258e 213
alexan_e 0:05d110ee258e 214 /******************************************************************************
alexan_e 0:05d110ee258e 215 ** Function name: disable_timer
alexan_e 0:05d110ee258e 216 **
alexan_e 0:05d110ee258e 217 ** Descriptions: Disable timer
alexan_e 0:05d110ee258e 218 **
alexan_e 0:05d110ee258e 219 ** parameters: timer number: 0 or 1
alexan_e 0:05d110ee258e 220 ** Returned value: None
alexan_e 0:05d110ee258e 221 **
alexan_e 0:05d110ee258e 222 ******************************************************************************/
alexan_e 0:05d110ee258e 223 void disable_timer32(uint8_t timer_num)
alexan_e 0:05d110ee258e 224 {
alexan_e 0:05d110ee258e 225 if ( timer_num == 0 )
alexan_e 0:05d110ee258e 226 {
alexan_e 0:05d110ee258e 227 LPC_CT32B0->TCR = 0;
alexan_e 0:05d110ee258e 228 }
alexan_e 0:05d110ee258e 229 else
alexan_e 0:05d110ee258e 230 {
alexan_e 0:05d110ee258e 231 LPC_CT32B1->TCR = 0;
alexan_e 0:05d110ee258e 232 }
alexan_e 0:05d110ee258e 233 return;
alexan_e 0:05d110ee258e 234 }
alexan_e 0:05d110ee258e 235
alexan_e 0:05d110ee258e 236 /******************************************************************************
alexan_e 0:05d110ee258e 237 ** Function name: reset_timer
alexan_e 0:05d110ee258e 238 **
alexan_e 0:05d110ee258e 239 ** Descriptions: Reset timer
alexan_e 0:05d110ee258e 240 **
alexan_e 0:05d110ee258e 241 ** parameters: timer number: 0 or 1
alexan_e 0:05d110ee258e 242 ** Returned value: None
alexan_e 0:05d110ee258e 243 **
alexan_e 0:05d110ee258e 244 ******************************************************************************/
alexan_e 0:05d110ee258e 245 void reset_timer32(uint8_t timer_num)
alexan_e 0:05d110ee258e 246 {
alexan_e 0:05d110ee258e 247 uint32_t regVal;
alexan_e 0:05d110ee258e 248
alexan_e 0:05d110ee258e 249 if ( timer_num == 0 )
alexan_e 0:05d110ee258e 250 {
alexan_e 0:05d110ee258e 251 regVal = LPC_CT32B0->TCR;
alexan_e 0:05d110ee258e 252 regVal |= 0x02;
alexan_e 0:05d110ee258e 253 LPC_CT32B0->TCR = regVal;
alexan_e 0:05d110ee258e 254 }
alexan_e 0:05d110ee258e 255 else
alexan_e 0:05d110ee258e 256 {
alexan_e 0:05d110ee258e 257 regVal = LPC_CT32B1->TCR;
alexan_e 0:05d110ee258e 258 regVal |= 0x02;
alexan_e 0:05d110ee258e 259 LPC_CT32B1->TCR = regVal;
alexan_e 0:05d110ee258e 260 }
alexan_e 0:05d110ee258e 261 return;
alexan_e 0:05d110ee258e 262 }
alexan_e 0:05d110ee258e 263
alexan_e 0:05d110ee258e 264 /******************************************************************************
alexan_e 0:05d110ee258e 265 ** Function name: set_timer_capture
alexan_e 0:05d110ee258e 266 **
alexan_e 0:05d110ee258e 267 ** Descriptions: Set timer capture based on location
alexan_e 0:05d110ee258e 268 **
alexan_e 0:05d110ee258e 269 ** parameters: timer number: 0~1, location 0~2
alexan_e 0:05d110ee258e 270 ** Returned value: None
alexan_e 0:05d110ee258e 271 **
alexan_e 0:05d110ee258e 272 ******************************************************************************/
alexan_e 0:05d110ee258e 273 void set_timer32_capture(uint8_t timer_num, uint8_t location )
alexan_e 0:05d110ee258e 274 {
alexan_e 0:05d110ee258e 275 if ( timer_num == 0 )
alexan_e 0:05d110ee258e 276 {
alexan_e 0:05d110ee258e 277 /* Timer0_32 I/O config */
alexan_e 0:05d110ee258e 278 if ( location == 0 )
alexan_e 0:05d110ee258e 279 {
alexan_e 0:05d110ee258e 280 LPC_IOCON->PIO1_28 &= ~0x07;
alexan_e 0:05d110ee258e 281 LPC_IOCON->PIO1_28 |= 0x01; /* Timer0_32 CAP0 */
alexan_e 0:05d110ee258e 282 LPC_IOCON->PIO1_29 &= ~0x07;
alexan_e 0:05d110ee258e 283 LPC_IOCON->PIO1_29 |= 0x02; /* Timer0_32 CAP1 */
alexan_e 0:05d110ee258e 284 }
alexan_e 0:05d110ee258e 285 else if ( location == 1 )
alexan_e 0:05d110ee258e 286 {
alexan_e 0:05d110ee258e 287 LPC_IOCON->PIO0_17 &= ~0x07;
alexan_e 0:05d110ee258e 288 LPC_IOCON->PIO0_17 |= 0x02; /* Timer0_32 CAP0 */
alexan_e 0:05d110ee258e 289 }
alexan_e 0:05d110ee258e 290 else
alexan_e 0:05d110ee258e 291 {
alexan_e 0:05d110ee258e 292 while ( 1 ); /* Fatal location number error */
alexan_e 0:05d110ee258e 293 }
alexan_e 0:05d110ee258e 294 }
alexan_e 0:05d110ee258e 295 else
alexan_e 0:05d110ee258e 296 {
alexan_e 0:05d110ee258e 297 /* Timer1_32 I/O config */
alexan_e 0:05d110ee258e 298 if ( location == 0 )
alexan_e 0:05d110ee258e 299 {
alexan_e 0:05d110ee258e 300 // LPC_IOCON->PIO1_4 &= ~0x07; /* Timer1_32 I/O config */
alexan_e 0:05d110ee258e 301 // LPC_IOCON->PIO1_4 |= 0x01; /* Timer1_32 CAP0 */
alexan_e 0:05d110ee258e 302 // LPC_IOCON->PIO1_5 &= ~0x07;
alexan_e 0:05d110ee258e 303 // LPC_IOCON->PIO1_5 |= 0x01; /* Timer1_32 CAP1 */
alexan_e 0:05d110ee258e 304 }
alexan_e 0:05d110ee258e 305 else if ( location == 1 )
alexan_e 0:05d110ee258e 306 {
alexan_e 0:05d110ee258e 307 LPC_IOCON->TMS_PIO0_12 &= ~0x07;
alexan_e 0:05d110ee258e 308 LPC_IOCON->TMS_PIO0_12 |= 0x03; /* Timer1_32 CAP0 */
alexan_e 0:05d110ee258e 309 }
alexan_e 0:05d110ee258e 310 else
alexan_e 0:05d110ee258e 311 {
alexan_e 0:05d110ee258e 312 while ( 1 ); /* Fatal location number error */
alexan_e 0:05d110ee258e 313 }
alexan_e 0:05d110ee258e 314 }
alexan_e 0:05d110ee258e 315 return;
alexan_e 0:05d110ee258e 316 }
alexan_e 0:05d110ee258e 317
alexan_e 0:05d110ee258e 318 /******************************************************************************
alexan_e 0:05d110ee258e 319 ** Function name: set_timer_match
alexan_e 0:05d110ee258e 320 **
alexan_e 0:05d110ee258e 321 ** Descriptions: Set timer match based on location
alexan_e 0:05d110ee258e 322 **
alexan_e 0:05d110ee258e 323 ** parameters: timer number: 0~1, location 0~2
alexan_e 0:05d110ee258e 324 ** Returned value: None
alexan_e 0:05d110ee258e 325 **
alexan_e 0:05d110ee258e 326 ******************************************************************************/
alexan_e 0:05d110ee258e 327 void set_timer32_match(uint8_t timer_num, uint8_t match_enable, uint8_t location)
alexan_e 0:05d110ee258e 328 {
alexan_e 0:05d110ee258e 329 if ( timer_num == 0 )
alexan_e 0:05d110ee258e 330 {
alexan_e 0:05d110ee258e 331 if ( match_enable & 0x01 )
alexan_e 0:05d110ee258e 332 {
alexan_e 0:05d110ee258e 333 if ( location == 0 )
alexan_e 0:05d110ee258e 334 {
alexan_e 0:05d110ee258e 335 LPC_IOCON->PIO0_18 &= ~0x07;
alexan_e 0:05d110ee258e 336 LPC_IOCON->PIO0_18 |= 0x02; /* Timer0_32 MAT0 */
alexan_e 0:05d110ee258e 337 }
alexan_e 0:05d110ee258e 338 else if ( location == 1 )
alexan_e 0:05d110ee258e 339 {
alexan_e 0:05d110ee258e 340 LPC_IOCON->PIO1_24 &= ~0x07;
alexan_e 0:05d110ee258e 341 LPC_IOCON->PIO1_24 |= 0x01; /* Timer0_32 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 if ( location == 0 )
alexan_e 0:05d110ee258e 347 {
alexan_e 0:05d110ee258e 348 LPC_IOCON->PIO0_19 &= ~0x07;
alexan_e 0:05d110ee258e 349 LPC_IOCON->PIO0_19 |= 0x02; /* Timer0_32 MAT1 */
alexan_e 0:05d110ee258e 350 }
alexan_e 0:05d110ee258e 351 else if ( location == 1 )
alexan_e 0:05d110ee258e 352 {
alexan_e 0:05d110ee258e 353 LPC_IOCON->PIO1_25 &= ~0x07;
alexan_e 0:05d110ee258e 354 LPC_IOCON->PIO1_25 |= 0x01; /* Timer0_32 MAT1 */
alexan_e 0:05d110ee258e 355 }
alexan_e 0:05d110ee258e 356 }
alexan_e 0:05d110ee258e 357 if ( match_enable & 0x04 )
alexan_e 0:05d110ee258e 358 {
alexan_e 0:05d110ee258e 359 if ( location == 0 )
alexan_e 0:05d110ee258e 360 {
alexan_e 0:05d110ee258e 361 LPC_IOCON->PIO0_1 &= ~0x07;
alexan_e 0:05d110ee258e 362 LPC_IOCON->PIO0_1 |= 0x02; /* Timer0_32 MAT2 */
alexan_e 0:05d110ee258e 363 }
alexan_e 0:05d110ee258e 364 else if ( location == 1 )
alexan_e 0:05d110ee258e 365 {
alexan_e 0:05d110ee258e 366 LPC_IOCON->PIO1_26 &= ~0x07;
alexan_e 0:05d110ee258e 367 LPC_IOCON->PIO1_26 |= 0x01; /* Timer0_32 MAT2 */
alexan_e 0:05d110ee258e 368 }
alexan_e 0:05d110ee258e 369 }
alexan_e 0:05d110ee258e 370 if ( match_enable & 0x08 )
alexan_e 0:05d110ee258e 371 {
alexan_e 0:05d110ee258e 372 if ( location == 0 )
alexan_e 0:05d110ee258e 373 {
alexan_e 0:05d110ee258e 374 LPC_IOCON->TDI_PIO0_11 &= ~0x07;
alexan_e 0:05d110ee258e 375 LPC_IOCON->TDI_PIO0_11 |= 0x03; /* Timer0_32 MAT3 */
alexan_e 0:05d110ee258e 376 }
alexan_e 0:05d110ee258e 377 else if ( location == 1 )
alexan_e 0:05d110ee258e 378 {
alexan_e 0:05d110ee258e 379 LPC_IOCON->PIO1_27 &= ~0x07;
alexan_e 0:05d110ee258e 380 LPC_IOCON->PIO1_27 |= 0x01; /* Timer0_32 MAT3 */
alexan_e 0:05d110ee258e 381 }
alexan_e 0:05d110ee258e 382 }
alexan_e 0:05d110ee258e 383 }
alexan_e 0:05d110ee258e 384 else if ( timer_num == 1 )
alexan_e 0:05d110ee258e 385 {
alexan_e 0:05d110ee258e 386 if ( match_enable & 0x01 )
alexan_e 0:05d110ee258e 387 {
alexan_e 0:05d110ee258e 388 if ( location == 0 )
alexan_e 0:05d110ee258e 389 {
alexan_e 0:05d110ee258e 390 // LPC_IOCON->PIO1_0 &= ~0x07;
alexan_e 0:05d110ee258e 391 // LPC_IOCON->PIO1_0 |= 0x01; /* Timer1_32 MAT0 */
alexan_e 0:05d110ee258e 392 }
alexan_e 0:05d110ee258e 393 else if ( location == 1 )
alexan_e 0:05d110ee258e 394 {
alexan_e 0:05d110ee258e 395 LPC_IOCON->TDO_PIO0_13 &= ~0x07;
alexan_e 0:05d110ee258e 396 LPC_IOCON->TDO_PIO0_13 |= 0x03; /* Timer1_32 MAT0 */
alexan_e 0:05d110ee258e 397 }
alexan_e 0:05d110ee258e 398 }
alexan_e 0:05d110ee258e 399 if ( match_enable & 0x02 )
alexan_e 0:05d110ee258e 400 {
alexan_e 0:05d110ee258e 401 if ( location == 0 )
alexan_e 0:05d110ee258e 402 {
alexan_e 0:05d110ee258e 403 // LPC_IOCON->PIO1_1 &= ~0x07;
alexan_e 0:05d110ee258e 404 // LPC_IOCON->PIO1_1 |= 0x01; /* Timer1_32 MAT1 */
alexan_e 0:05d110ee258e 405 }
alexan_e 0:05d110ee258e 406 else if ( location == 1 )
alexan_e 0:05d110ee258e 407 {
alexan_e 0:05d110ee258e 408 LPC_IOCON->TRST_PIO0_14 &= ~0x07;
alexan_e 0:05d110ee258e 409 LPC_IOCON->TRST_PIO0_14 |= 0x03; /* Timer1_32 MAT1 */
alexan_e 0:05d110ee258e 410 }
alexan_e 0:05d110ee258e 411 }
alexan_e 0:05d110ee258e 412 if ( match_enable & 0x04 )
alexan_e 0:05d110ee258e 413 {
alexan_e 0:05d110ee258e 414 if ( location == 0 )
alexan_e 0:05d110ee258e 415 {
alexan_e 0:05d110ee258e 416 // LPC_IOCON->PIO1_2 &= ~0x07;
alexan_e 0:05d110ee258e 417 // LPC_IOCON->PIO1_2 |= 0x01; /* Timer1_32 MAT2 */
alexan_e 0:05d110ee258e 418 }
alexan_e 0:05d110ee258e 419 else if ( location == 1 )
alexan_e 0:05d110ee258e 420 {
alexan_e 0:05d110ee258e 421 #if __SWD_DISABLED
alexan_e 0:05d110ee258e 422 LPC_IOCON->SWDIO_PIO0_15 &= ~0x07;
alexan_e 0:05d110ee258e 423 LPC_IOCON->SWDIO_PIO0_15 |= 0x03; /* Timer1_32 MAT2 */
alexan_e 0:05d110ee258e 424 #endif
alexan_e 0:05d110ee258e 425 }
alexan_e 0:05d110ee258e 426 }
alexan_e 0:05d110ee258e 427 if ( match_enable & 0x08 )
alexan_e 0:05d110ee258e 428 {
alexan_e 0:05d110ee258e 429 if ( location == 0 )
alexan_e 0:05d110ee258e 430 {
alexan_e 0:05d110ee258e 431 // LPC_IOCON->PIO1_3 &= ~0x07;
alexan_e 0:05d110ee258e 432 // LPC_IOCON->PIO1_3 |= 0x01; /* Timer1_32 MAT3 */
alexan_e 0:05d110ee258e 433 }
alexan_e 0:05d110ee258e 434 else if ( location == 1 )
alexan_e 0:05d110ee258e 435 {
alexan_e 0:05d110ee258e 436 LPC_IOCON->PIO0_16 &= ~0x07;
alexan_e 0:05d110ee258e 437 LPC_IOCON->PIO0_16 |= 0x02; /* Timer1_32 MAT3 */
alexan_e 0:05d110ee258e 438 }
alexan_e 0:05d110ee258e 439 }
alexan_e 0:05d110ee258e 440 }
alexan_e 0:05d110ee258e 441 return;
alexan_e 0:05d110ee258e 442 }
alexan_e 0:05d110ee258e 443
alexan_e 0:05d110ee258e 444 /******************************************************************************
alexan_e 0:05d110ee258e 445 ** Function name: init_timer
alexan_e 0:05d110ee258e 446 **
alexan_e 0:05d110ee258e 447 ** Descriptions: Initialize timer, set timer interval, reset timer,
alexan_e 0:05d110ee258e 448 ** install timer interrupt handler
alexan_e 0:05d110ee258e 449 **
alexan_e 0:05d110ee258e 450 ** parameters: timer number and timer interval
alexan_e 0:05d110ee258e 451 ** Returned value: None
alexan_e 0:05d110ee258e 452 **
alexan_e 0:05d110ee258e 453 ******************************************************************************/
alexan_e 0:05d110ee258e 454 void init_timer32(uint8_t timer_num, uint32_t TimerInterval)
alexan_e 0:05d110ee258e 455 {
alexan_e 0:05d110ee258e 456 uint32_t i;
alexan_e 0:05d110ee258e 457
alexan_e 0:05d110ee258e 458 if ( timer_num == 0 )
alexan_e 0:05d110ee258e 459 {
alexan_e 0:05d110ee258e 460 /* Some of the I/O pins need to be clearfully planned if
alexan_e 0:05d110ee258e 461 you use below module because JTAG and TIMER CAP/MAT pins are muxed. */
alexan_e 0:05d110ee258e 462 LPC_SYSCON->SYSAHBCLKCTRL |= (1<<9);
alexan_e 0:05d110ee258e 463
alexan_e 0:05d110ee258e 464 LPC_CT32B0->MR0 = TimerInterval;
alexan_e 0:05d110ee258e 465 #if TIMER_MATCH
alexan_e 0:05d110ee258e 466 for ( i = 0; i < 4; i++ )
alexan_e 0:05d110ee258e 467 {
alexan_e 0:05d110ee258e 468 timer32_0_counter[i] = 0;
alexan_e 0:05d110ee258e 469 }
alexan_e 0:05d110ee258e 470 set_timer32_match(timer_num, 0x0F, 0);
alexan_e 0:05d110ee258e 471 LPC_CT32B0->EMR &= ~(0xFF<<4);
alexan_e 0:05d110ee258e 472 LPC_CT32B0->EMR |= ((0x3<<4)|(0x3<<6)|(0x3<<8)|(0x3<<10)); /* MR0/1/2/3 Toggle */
alexan_e 0:05d110ee258e 473 #else
alexan_e 0:05d110ee258e 474 for ( i = 0; i < 4; i++ )
alexan_e 0:05d110ee258e 475 {
alexan_e 0:05d110ee258e 476 timer32_0_capture[i] = 0;
alexan_e 0:05d110ee258e 477 }
alexan_e 0:05d110ee258e 478 set_timer32_capture(timer_num, 0 );
alexan_e 0:05d110ee258e 479 /* Capture 0 on rising edge, interrupt enable. */
alexan_e 0:05d110ee258e 480 LPC_CT32B0->CCR = (0x5<<0)|(0x5<<3);
alexan_e 0:05d110ee258e 481 #endif
alexan_e 0:05d110ee258e 482 LPC_CT32B0->MCR = 3; /* Interrupt and Reset on MR0 */
alexan_e 0:05d110ee258e 483
alexan_e 0:05d110ee258e 484 /* Enable the TIMER0 Interrupt */
alexan_e 0:05d110ee258e 485 #if NMI_ENABLED
alexan_e 0:05d110ee258e 486 NVIC_DisableIRQ( TIMER_32_0_IRQn );
alexan_e 0:05d110ee258e 487 NMI_Init( TIMER_32_0_IRQn );
alexan_e 0:05d110ee258e 488 #else
alexan_e 0:05d110ee258e 489 NVIC_EnableIRQ(TIMER_32_0_IRQn);
alexan_e 0:05d110ee258e 490 #endif
alexan_e 0:05d110ee258e 491 }
alexan_e 0:05d110ee258e 492 else if ( timer_num == 1 )
alexan_e 0:05d110ee258e 493 {
alexan_e 0:05d110ee258e 494 /* Some of the I/O pins need to be clearfully planned if
alexan_e 0:05d110ee258e 495 you use below module because JTAG and TIMER CAP/MAT pins are muxed. */
alexan_e 0:05d110ee258e 496 LPC_SYSCON->SYSAHBCLKCTRL |= (1<<10);
alexan_e 0:05d110ee258e 497
alexan_e 0:05d110ee258e 498 LPC_CT32B1->MR0 = TimerInterval;
alexan_e 0:05d110ee258e 499 #if TIMER_MATCH
alexan_e 0:05d110ee258e 500 for ( i = 0; i < 4; i++ )
alexan_e 0:05d110ee258e 501 {
alexan_e 0:05d110ee258e 502 timer32_1_counter[i] = 0;
alexan_e 0:05d110ee258e 503 }
alexan_e 0:05d110ee258e 504 set_timer32_match(timer_num, 0x0F, 0);
alexan_e 0:05d110ee258e 505 LPC_CT32B1->EMR &= ~(0xFF<<4);
alexan_e 0:05d110ee258e 506 LPC_CT32B1->EMR |= ((0x3<<4)|(0x3<<6)|(0x3<<8)|(0x3<<10)); /* MR0/1/2 Toggle */
alexan_e 0:05d110ee258e 507 #else
alexan_e 0:05d110ee258e 508 for ( i = 0; i < 4; i++ )
alexan_e 0:05d110ee258e 509 {
alexan_e 0:05d110ee258e 510 timer32_1_capture[i] = 0;
alexan_e 0:05d110ee258e 511 }
alexan_e 0:05d110ee258e 512 set_timer32_capture(timer_num, 0 );
alexan_e 0:05d110ee258e 513 /* Capture 0 on rising edge, interrupt enable. */
alexan_e 0:05d110ee258e 514 LPC_CT32B1->CCR = (0x5<<0)|(0x5<<3);
alexan_e 0:05d110ee258e 515 #endif
alexan_e 0:05d110ee258e 516 LPC_CT32B1->MCR = 3; /* Interrupt and Reset on MR0 */
alexan_e 0:05d110ee258e 517
alexan_e 0:05d110ee258e 518 /* Enable the TIMER1 Interrupt */
alexan_e 0:05d110ee258e 519 #if NMI_ENABLED
alexan_e 0:05d110ee258e 520 NVIC_DisableIRQ( TIMER_32_1_IRQn );
alexan_e 0:05d110ee258e 521 NMI_Init( TIMER_32_1_IRQn );
alexan_e 0:05d110ee258e 522 #else
alexan_e 0:05d110ee258e 523 NVIC_EnableIRQ(TIMER_32_1_IRQn);
alexan_e 0:05d110ee258e 524 #endif
alexan_e 0:05d110ee258e 525 }
alexan_e 0:05d110ee258e 526 return;
alexan_e 0:05d110ee258e 527 }
alexan_e 0:05d110ee258e 528 /******************************************************************************
alexan_e 0:05d110ee258e 529 ** Function name: init_timer32PWM
alexan_e 0:05d110ee258e 530 **
alexan_e 0:05d110ee258e 531 ** Descriptions: Initialize timer as PWM
alexan_e 0:05d110ee258e 532 **
alexan_e 0:05d110ee258e 533 ** parameters: timer number, period and match enable:
alexan_e 0:05d110ee258e 534 ** match_enable[0] = PWM for MAT0
alexan_e 0:05d110ee258e 535 ** match_enable[1] = PWM for MAT1
alexan_e 0:05d110ee258e 536 ** match_enable[2] = PWM for MAT2
alexan_e 0:05d110ee258e 537 ** Returned value: None
alexan_e 0:05d110ee258e 538 **
alexan_e 0:05d110ee258e 539 ******************************************************************************/
alexan_e 0:05d110ee258e 540 void init_timer32PWM(uint8_t timer_num, uint32_t period, uint8_t match_enable)
alexan_e 0:05d110ee258e 541 {
alexan_e 0:05d110ee258e 542 disable_timer32(timer_num);
alexan_e 0:05d110ee258e 543 if (timer_num == 1)
alexan_e 0:05d110ee258e 544 {
alexan_e 0:05d110ee258e 545 LPC_SYSCON->SYSAHBCLKCTRL |= (1<<10);
alexan_e 0:05d110ee258e 546
alexan_e 0:05d110ee258e 547 /* Setup the external match register */
alexan_e 0:05d110ee258e 548 LPC_CT32B1->EMR = (1<<EMC3)|(1<<EMC2)|(2<<EMC1)|(1<<EMC0)|MATCH3|(match_enable);
alexan_e 0:05d110ee258e 549
alexan_e 0:05d110ee258e 550 /* Setup the outputs */
alexan_e 0:05d110ee258e 551 /* If match0 is enabled, set the output, use location 0 for test. */
alexan_e 0:05d110ee258e 552 set_timer32_match( timer_num, match_enable, 0 );
alexan_e 0:05d110ee258e 553
alexan_e 0:05d110ee258e 554 /* Enable the selected PWMs and enable Match3 */
alexan_e 0:05d110ee258e 555 LPC_CT32B1->PWMC = MATCH3|(match_enable);
alexan_e 0:05d110ee258e 556
alexan_e 0:05d110ee258e 557 /* Setup the match registers */
alexan_e 0:05d110ee258e 558 /* set the period value to a global variable */
alexan_e 0:05d110ee258e 559 timer32_1_period = period;
alexan_e 0:05d110ee258e 560 LPC_CT32B1->MR3 = timer32_1_period;
alexan_e 0:05d110ee258e 561 LPC_CT32B1->MR0 = timer32_1_period/2;
alexan_e 0:05d110ee258e 562 LPC_CT32B1->MR1 = timer32_1_period/2;
alexan_e 0:05d110ee258e 563 LPC_CT32B1->MR2 = timer32_1_period/2;
alexan_e 0:05d110ee258e 564 LPC_CT32B1->MCR = 1<<10; /* Reset on MR3 */
alexan_e 0:05d110ee258e 565 }
alexan_e 0:05d110ee258e 566 else
alexan_e 0:05d110ee258e 567 {
alexan_e 0:05d110ee258e 568 /* Some of the I/O pins need to be clearfully planned if
alexan_e 0:05d110ee258e 569 you use below module because JTAG and TIMER CAP/MAT pins are muxed. */
alexan_e 0:05d110ee258e 570 LPC_SYSCON->SYSAHBCLKCTRL |= (1<<9);
alexan_e 0:05d110ee258e 571
alexan_e 0:05d110ee258e 572 /* Setup the external match register */
alexan_e 0:05d110ee258e 573 LPC_CT32B0->EMR = (1<<EMC3)|(2<<EMC2)|(1<<EMC1)|(1<<EMC0)|MATCH3|(match_enable);
alexan_e 0:05d110ee258e 574
alexan_e 0:05d110ee258e 575 /* Setup the outputs */
alexan_e 0:05d110ee258e 576 /* If match0 is enabled, set the output, use location 0 for test. */
alexan_e 0:05d110ee258e 577 set_timer32_match( timer_num, match_enable, 0 );
alexan_e 0:05d110ee258e 578
alexan_e 0:05d110ee258e 579 /* Enable the selected PWMs and enable Match3 */
alexan_e 0:05d110ee258e 580 LPC_CT32B0->PWMC = MATCH3|(match_enable);
alexan_e 0:05d110ee258e 581
alexan_e 0:05d110ee258e 582 /* Setup the match registers */
alexan_e 0:05d110ee258e 583 /* set the period value to a global variable */
alexan_e 0:05d110ee258e 584 timer32_0_period = period;
alexan_e 0:05d110ee258e 585 LPC_CT32B0->MR3 = timer32_0_period;
alexan_e 0:05d110ee258e 586 LPC_CT32B0->MR0 = timer32_0_period/2;
alexan_e 0:05d110ee258e 587 LPC_CT32B0->MR1 = timer32_0_period/2;
alexan_e 0:05d110ee258e 588 LPC_CT32B0->MR2 = timer32_0_period/2;
alexan_e 0:05d110ee258e 589 LPC_CT32B0->MCR = 1<<10; /* Reset on MR3 */
alexan_e 0:05d110ee258e 590 }
alexan_e 0:05d110ee258e 591 }
alexan_e 0:05d110ee258e 592
alexan_e 0:05d110ee258e 593 /******************************************************************************
alexan_e 0:05d110ee258e 594 ** Function name: pwm32_setMatch
alexan_e 0:05d110ee258e 595 **
alexan_e 0:05d110ee258e 596 ** Descriptions: Set the pwm32 match values
alexan_e 0:05d110ee258e 597 **
alexan_e 0:05d110ee258e 598 ** parameters: timer number, match numner and the value
alexan_e 0:05d110ee258e 599 **
alexan_e 0:05d110ee258e 600 ** Returned value: None
alexan_e 0:05d110ee258e 601 **
alexan_e 0:05d110ee258e 602 ******************************************************************************/
alexan_e 0:05d110ee258e 603 void setMatch_timer32PWM (uint8_t timer_num, uint8_t match_nr, uint32_t value)
alexan_e 0:05d110ee258e 604 {
alexan_e 0:05d110ee258e 605 if (timer_num)
alexan_e 0:05d110ee258e 606 {
alexan_e 0:05d110ee258e 607 switch (match_nr)
alexan_e 0:05d110ee258e 608 {
alexan_e 0:05d110ee258e 609 case 0:
alexan_e 0:05d110ee258e 610 LPC_CT32B1->MR0 = value;
alexan_e 0:05d110ee258e 611 break;
alexan_e 0:05d110ee258e 612 case 1:
alexan_e 0:05d110ee258e 613 LPC_CT32B1->MR1 = value;
alexan_e 0:05d110ee258e 614 break;
alexan_e 0:05d110ee258e 615 case 2:
alexan_e 0:05d110ee258e 616 LPC_CT32B1->MR2 = value;
alexan_e 0:05d110ee258e 617 break;
alexan_e 0:05d110ee258e 618 case 3:
alexan_e 0:05d110ee258e 619 LPC_CT32B1->MR3 = value;
alexan_e 0:05d110ee258e 620 break;
alexan_e 0:05d110ee258e 621 default:
alexan_e 0:05d110ee258e 622 break;
alexan_e 0:05d110ee258e 623 }
alexan_e 0:05d110ee258e 624 }
alexan_e 0:05d110ee258e 625 else
alexan_e 0:05d110ee258e 626 {
alexan_e 0:05d110ee258e 627 switch (match_nr)
alexan_e 0:05d110ee258e 628 {
alexan_e 0:05d110ee258e 629 case 0:
alexan_e 0:05d110ee258e 630 LPC_CT32B0->MR0 = value;
alexan_e 0:05d110ee258e 631 break;
alexan_e 0:05d110ee258e 632 case 1:
alexan_e 0:05d110ee258e 633 LPC_CT32B0->MR1 = value;
alexan_e 0:05d110ee258e 634 break;
alexan_e 0:05d110ee258e 635 case 2:
alexan_e 0:05d110ee258e 636 LPC_CT32B0->MR2 = value;
alexan_e 0:05d110ee258e 637 break;
alexan_e 0:05d110ee258e 638 case 3:
alexan_e 0:05d110ee258e 639 LPC_CT32B0->MR3 = value;
alexan_e 0:05d110ee258e 640 break;
alexan_e 0:05d110ee258e 641 default:
alexan_e 0:05d110ee258e 642 break;
alexan_e 0:05d110ee258e 643 }
alexan_e 0:05d110ee258e 644 }
alexan_e 0:05d110ee258e 645 }
alexan_e 0:05d110ee258e 646
alexan_e 0:05d110ee258e 647 /******************************************************************************
alexan_e 0:05d110ee258e 648 ** End Of File
alexan_e 0:05d110ee258e 649 ******************************************************************************/