629 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			629 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /****************************************************************************
 | ||
|  |  *   $Id:: timer16.c 6950 2011-03-23 22:09:44Z usb00423                     $ | ||
|  |  *   Project: NXP LPC13Uxx 16-bit timer example | ||
|  |  * | ||
|  |  *   Description: | ||
|  |  *     This file contains 16-bit timer code example which include timer  | ||
|  |  *     initialization, timer interrupt handler, and related APIs for  | ||
|  |  *     timer setup. | ||
|  |  * | ||
|  |  **************************************************************************** | ||
|  | * Software that is described herein is for illustrative purposes only | ||
|  | * which provides customers with programming information regarding the | ||
|  | * products. This software is supplied "AS IS" without any warranties. | ||
|  | * NXP Semiconductors assumes no responsibility or liability for the | ||
|  | * use of the software, conveys no license or title under any patent, | ||
|  | * copyright, or mask work right to the product. NXP Semiconductors | ||
|  | * reserves the right to make changes in the software without | ||
|  | * notification. NXP Semiconductors also make no representation or | ||
|  | * warranty that such application will be suitable for the specified | ||
|  | * use without further testing or modification. | ||
|  | * Permission to use, copy, modify, and distribute this software and its | ||
|  | * documentation is hereby granted, under NXP Semiconductors' | ||
|  | * relevant copyright in the software, without fee, provided that it | ||
|  | * is used in conjunction with NXP Semiconductors microcontrollers.  This | ||
|  | * copyright, permission, and disclaimer notice must appear in all copies of | ||
|  | * this code. | ||
|  | ****************************************************************************/ | ||
|  | #include "LPC13Uxx.h"
 | ||
|  | #include "timer16.h"
 | ||
|  | #include "nmi.h"
 | ||
|  | 
 | ||
|  | volatile uint32_t timer16_0_counter[4] = {0,0,0,0}; | ||
|  | volatile uint32_t timer16_1_counter[4] = {0,0,0,0}; | ||
|  | volatile uint32_t timer16_0_capture[4] = {0,0,0,0}; | ||
|  | volatile uint32_t timer16_1_capture[4] = {0,0,0,0}; | ||
|  | volatile uint32_t timer16_0_period = 0; | ||
|  | volatile uint32_t timer16_1_period = 0; | ||
|  | 
 | ||
|  | /*****************************************************************************
 | ||
|  | ** Function name:		delayMs | ||
|  | ** | ||
|  | ** Descriptions:		Start the timer delay in milo seconds | ||
|  | **						until elapsed | ||
|  | ** | ||
|  | ** parameters:			timer number, Delay value in milo second			  | ||
|  | ** 						 | ||
|  | ** Returned value:		None | ||
|  | **  | ||
|  | *****************************************************************************/ | ||
|  | void delayMs(uint8_t timer_num, uint32_t delayInMs) | ||
|  | { | ||
|  |   if (timer_num == 0) | ||
|  |   { | ||
|  |     /*
 | ||
|  |     * setup timer #0 for delay | ||
|  |     */ | ||
|  |     LPC_CT16B0->TCR = 0x02;		/* reset timer */ | ||
|  |     LPC_CT16B0->PR  = 0x00;		/* set prescaler to zero */ | ||
|  |     LPC_CT16B0->MR0 = delayInMs * (SystemCoreClock / 1000); | ||
|  |     LPC_CT16B0->IR  = 0xff;		/* reset all interrrupts */ | ||
|  |     LPC_CT16B0->MCR = 0x04;		/* stop timer on match */ | ||
|  |     LPC_CT16B0->TCR = 0x01;		/* start timer */ | ||
|  |     /* wait until delay time has elapsed */ | ||
|  |     while (LPC_CT16B0->TCR & 0x01); | ||
|  |   } | ||
|  |   else if (timer_num == 1) | ||
|  |   { | ||
|  |     /*
 | ||
|  |     * setup timer #1 for delay | ||
|  |     */ | ||
|  |     LPC_CT16B1->TCR = 0x02;		/* reset timer */ | ||
|  |     LPC_CT16B1->PR  = 0x00;		/* set prescaler to zero */ | ||
|  |     LPC_CT16B1->MR0 = delayInMs * (SystemCoreClock / 1000); | ||
|  |     LPC_CT16B1->IR  = 0xff;		/* reset all interrrupts */ | ||
|  |     LPC_CT16B1->MCR = 0x04;		/* stop timer on match */ | ||
|  |     LPC_CT16B1->TCR = 0x01;		/* start timer */ | ||
|  |     /* wait until delay time has elapsed */ | ||
|  |     while (LPC_CT16B1->TCR & 0x01); | ||
|  |   } | ||
|  |   return; | ||
|  | } | ||
|  | 
 | ||
|  | /******************************************************************************
 | ||
|  | ** Function name:		CT16B0_IRQHandler | ||
|  | ** | ||
|  | ** Descriptions:		Timer/CounterX and CaptureX interrupt handler | ||
|  | ** | ||
|  | ** parameters:			None | ||
|  | ** Returned value:		None | ||
|  | **  | ||
|  | ******************************************************************************/ | ||
|  | void CT16B0_IRQHandler(void) | ||
|  | { | ||
|  |   if ( LPC_CT16B0->IR & (0x1<<0) ) | ||
|  |   { | ||
|  | 	LPC_CT16B0->IR = 0x1<<0;			/* clear interrupt flag */ | ||
|  | 	timer16_0_counter[0]++; | ||
|  |   } | ||
|  |   if ( LPC_CT16B0->IR & (0x1<<1) ) | ||
|  |   { | ||
|  | 	LPC_CT16B0->IR = 0x1<<1;			/* clear interrupt flag */ | ||
|  | 	timer16_0_counter[1]++; | ||
|  |   } | ||
|  |   if ( LPC_CT16B0->IR & (0x1<<2) ) | ||
|  |   { | ||
|  | 	LPC_CT16B0->IR = 0x1<<2;			/* clear interrupt flag */ | ||
|  | 	timer16_0_counter[2]++; | ||
|  |   } | ||
|  |   if ( LPC_CT16B0->IR & (0x1<<3) ) | ||
|  |   { | ||
|  | 	LPC_CT16B0->IR = 0x1<<3;			/* clear interrupt flag */ | ||
|  | 	timer16_0_counter[3]++; | ||
|  |   } | ||
|  |   if ( LPC_CT16B0->IR & (0x1<<4) ) | ||
|  |   { | ||
|  | 	LPC_CT16B0->IR = 0x1<<4;		/* clear interrupt flag */ | ||
|  | 	timer16_0_capture[0]++; | ||
|  |   } | ||
|  |   if ( LPC_CT16B0->IR & (0x1<<5) ) | ||
|  |   { | ||
|  | 	LPC_CT16B0->IR = 0x1<<5;		/* clear interrupt flag */ | ||
|  | 	timer16_0_capture[1]++; | ||
|  |   } | ||
|  |   if ( LPC_CT16B0->IR & (0x1<<6) ) | ||
|  |   { | ||
|  | 	LPC_CT16B0->IR = 0x1<<6;		/* clear interrupt flag */ | ||
|  | 	timer16_0_capture[2]++; | ||
|  |   } | ||
|  |   if ( LPC_CT16B0->IR & (0x1<<7) ) | ||
|  |   { | ||
|  | 	LPC_CT16B0->IR = 0x1<<7;		/* clear interrupt flag */ | ||
|  | 	timer16_0_capture[3]++; | ||
|  |   } | ||
|  |   return; | ||
|  | } | ||
|  | 
 | ||
|  | /******************************************************************************
 | ||
|  | ** Function name:		CT16B1_IRQHandler | ||
|  | ** | ||
|  | ** Descriptions:		Timer/CounterX and CaptureX interrupt handler | ||
|  | ** | ||
|  | ** parameters:			None | ||
|  | ** Returned value:		None | ||
|  | **  | ||
|  | ******************************************************************************/ | ||
|  | void CT16B1_IRQHandler(void) | ||
|  | { | ||
|  |   if ( LPC_CT16B1->IR & (0x1<<0) ) | ||
|  |   {   | ||
|  | 	LPC_CT16B1->IR = 0x1<<0;			/* clear interrupt flag */ | ||
|  | 	timer16_1_counter[0]++; | ||
|  |   } | ||
|  |   if ( LPC_CT16B1->IR & (0x1<<1) ) | ||
|  |   {   | ||
|  | 	LPC_CT16B1->IR = 0x1<<1;			/* clear interrupt flag */ | ||
|  | 	timer16_1_counter[1]++; | ||
|  |   } | ||
|  |   if ( LPC_CT16B1->IR & (0x1<<2) ) | ||
|  |   {   | ||
|  | 	LPC_CT16B1->IR = 0x1<<2;			/* clear interrupt flag */ | ||
|  | 	timer16_1_counter[2]++; | ||
|  |   } | ||
|  |   if ( LPC_CT16B1->IR & (0x1<<3) ) | ||
|  |   {   | ||
|  | 	LPC_CT16B1->IR = 0x1<<3;			/* clear interrupt flag */ | ||
|  | 	timer16_1_counter[3]++; | ||
|  |   } | ||
|  |   if ( LPC_CT16B1->IR & (0x1<<4) ) | ||
|  |   { | ||
|  | 	LPC_CT16B1->IR = 0x1<<4;		/* clear interrupt flag */ | ||
|  | 	timer16_1_capture[0]++; | ||
|  |   } | ||
|  |   if ( LPC_CT16B1->IR & (0x1<<5) ) | ||
|  |   { | ||
|  | 	LPC_CT16B1->IR = 0x1<<5;		/* clear interrupt flag */ | ||
|  | 	timer16_1_capture[1]++; | ||
|  |   } | ||
|  |   if ( LPC_CT16B1->IR & (0x1<<6) ) | ||
|  |   { | ||
|  | 	LPC_CT16B1->IR = 0x1<<6;		/* clear interrupt flag */ | ||
|  | 	timer16_1_capture[2]++; | ||
|  |   } | ||
|  |   if ( LPC_CT16B1->IR & (0x1<<7) ) | ||
|  |   { | ||
|  | 	LPC_CT16B1->IR = 0x1<<7;		/* clear interrupt flag */ | ||
|  | 	timer16_1_capture[3]++; | ||
|  |   } | ||
|  |   return; | ||
|  | } | ||
|  | 
 | ||
|  | /******************************************************************************
 | ||
|  | ** Function name:		enable_timer | ||
|  | ** | ||
|  | ** Descriptions:		Enable timer | ||
|  | ** | ||
|  | ** parameters:			timer number: 0 or 1 | ||
|  | ** Returned value:		None | ||
|  | **  | ||
|  | ******************************************************************************/ | ||
|  | void enable_timer16(uint8_t timer_num) | ||
|  | { | ||
|  |   if ( timer_num == 0 ) | ||
|  |   { | ||
|  |     LPC_CT16B0->TCR = 1; | ||
|  |   } | ||
|  |   else | ||
|  |   { | ||
|  |     LPC_CT16B1->TCR = 1; | ||
|  |   } | ||
|  |   return; | ||
|  | } | ||
|  | 
 | ||
|  | /******************************************************************************
 | ||
|  | ** Function name:		disable_timer | ||
|  | ** | ||
|  | ** Descriptions:		Disable timer | ||
|  | ** | ||
|  | ** parameters:			timer number: 0 or 1 | ||
|  | ** Returned value:		None | ||
|  | **  | ||
|  | ******************************************************************************/ | ||
|  | void disable_timer16(uint8_t timer_num) | ||
|  | { | ||
|  |   if ( timer_num == 0 ) | ||
|  |   { | ||
|  |     LPC_CT16B0->TCR = 0; | ||
|  |   } | ||
|  |   else | ||
|  |   { | ||
|  |     LPC_CT16B1->TCR = 0; | ||
|  |   } | ||
|  |   return; | ||
|  | } | ||
|  | 
 | ||
|  | /******************************************************************************
 | ||
|  | ** Function name:		reset_timer | ||
|  | ** | ||
|  | ** Descriptions:		Reset timer | ||
|  | ** | ||
|  | ** parameters:			timer number: 0 or 1 | ||
|  | ** Returned value:		None | ||
|  | **  | ||
|  | ******************************************************************************/ | ||
|  | void reset_timer16(uint8_t timer_num) | ||
|  | { | ||
|  |   uint32_t regVal; | ||
|  | 
 | ||
|  |   if ( timer_num == 0 ) | ||
|  |   { | ||
|  |     regVal = LPC_CT16B0->TCR; | ||
|  |     regVal |= 0x02; | ||
|  |     LPC_CT16B0->TCR = regVal; | ||
|  |   } | ||
|  |   else | ||
|  |   { | ||
|  |     regVal = LPC_CT16B1->TCR; | ||
|  |     regVal |= 0x02; | ||
|  |     LPC_CT16B1->TCR = regVal; | ||
|  |   } | ||
|  |   return; | ||
|  | } | ||
|  | 
 | ||
|  | /******************************************************************************
 | ||
|  | ** Function name:		Set_timer_capture | ||
|  | ** | ||
|  | ** Descriptions:		set timer capture based on LOC number. | ||
|  | ** | ||
|  | ** parameters:			timer number and location number | ||
|  | ** Returned value:		None | ||
|  | **  | ||
|  | ******************************************************************************/ | ||
|  | void set_timer16_capture(uint8_t timer_num, uint8_t location ) | ||
|  | { | ||
|  |   if ( timer_num == 0 ) | ||
|  |   { | ||
|  | 	/*  Timer0_16 I/O config */ | ||
|  | 	if ( location == 0 ) | ||
|  | 	{ | ||
|  | 	  LPC_IOCON->PIO1_16           &= ~0x07; | ||
|  | 	  LPC_IOCON->PIO1_16           |= 0x02;		/* Timer0_16 CAP0 */ | ||
|  | 	  LPC_IOCON->PIO1_17           &= ~0x07; | ||
|  | 	  LPC_IOCON->PIO1_17           |= 0x01;		/* Timer0_16 CAP2 */ | ||
|  | 	} | ||
|  | 	else if ( location == 1 ) | ||
|  | 	{ | ||
|  | 	  LPC_IOCON->PIO0_2            &= ~0x07; | ||
|  | 	  LPC_IOCON->PIO0_2            |= 0x02;		/* Timer0_16 CAP0 */ | ||
|  | 	} | ||
|  | 	else | ||
|  | 	{ | ||
|  | 	  while ( 1 );				/* Fatal location number error */ | ||
|  | 	} | ||
|  |   } | ||
|  |   else | ||
|  |   { | ||
|  | 	/*  Timer1_16 I/O config */ | ||
|  | 	if ( location == 0 ) | ||
|  | 	{ | ||
|  | 	  LPC_IOCON->PIO0_20           &= ~0x07;	/*  Timer1_16 I/O config */ | ||
|  | 	  LPC_IOCON->PIO0_20           |= 0x01;		/* Timer1_16 CAP0 */ | ||
|  | 	  LPC_IOCON->PIO1_18           &= ~0x07; | ||
|  | 	  LPC_IOCON->PIO1_18           |= 0x01;		/* Timer1_16 CAP1 */ | ||
|  | 	} | ||
|  | 	else | ||
|  | 	{ | ||
|  | 	  while ( 1 );				/* Fatal location number error */ | ||
|  | 	} | ||
|  |   }	 | ||
|  |   return; | ||
|  | } | ||
|  | 
 | ||
|  | /******************************************************************************
 | ||
|  | ** Function name:		Set_timer_match | ||
|  | ** | ||
|  | ** Descriptions:		set timer match based on LOC number. | ||
|  | ** | ||
|  | ** parameters:			timer number, match enable, and location number  | ||
|  | ** Returned value:		None | ||
|  | **  | ||
|  | ******************************************************************************/ | ||
|  | void set_timer16_match(uint8_t timer_num, uint8_t match_enable, uint8_t location) | ||
|  | { | ||
|  |   if ( timer_num == 0 ) | ||
|  |   { | ||
|  | 	if ( match_enable & 0x01 ) | ||
|  | 	{ | ||
|  | 	  /*  Timer0_16 I/O config */ | ||
|  | 	  if ( location == 0 ) | ||
|  | 	  { | ||
|  | 		LPC_IOCON->PIO0_8           &= ~0x07;	 | ||
|  | 		LPC_IOCON->PIO0_8           |= 0x02;		/* Timer0_16 MAT0 */ | ||
|  | 	  } | ||
|  | 	  else if ( location == 1 ) | ||
|  | 	  { | ||
|  | 		LPC_IOCON->PIO1_13           &= ~0x07; | ||
|  | 		LPC_IOCON->PIO1_13           |= 0x02;		/* Timer0_16 MAT0 */ | ||
|  | 	  } | ||
|  | 	} | ||
|  | 	if ( match_enable & 0x02 ) | ||
|  | 	{ | ||
|  | 	  /*  Timer0_16 I/O config */ | ||
|  | 	  if ( location == 0 ) | ||
|  | 	  { | ||
|  | 		LPC_IOCON->PIO0_9           &= ~0x07; | ||
|  | 		LPC_IOCON->PIO0_9           |= 0x02;		/* Timer0_16 MAT1 */ | ||
|  | 	  } | ||
|  | 	  else if ( location == 1 ) | ||
|  | 	  { | ||
|  | 		LPC_IOCON->PIO1_14           &= ~0x07; | ||
|  | 		LPC_IOCON->PIO1_14           |= 0x02;		/* Timer0_16 MAT1 */ | ||
|  | 	  } | ||
|  | 	} | ||
|  | 	if ( match_enable & 0x04 ) | ||
|  | 	{ | ||
|  | 	  /*  Timer0_16 I/O config */ | ||
|  | 	  if ( location == 0 ) | ||
|  | 	  { | ||
|  | #ifdef __SWD_DISABLED
 | ||
|  | 		LPC_IOCON->SWCLK_PIO0_10    &= ~0x07; | ||
|  | 		LPC_IOCON->SWCLK_PIO0_10    |= 0x03;		/* Timer0_16 MAT2 */ | ||
|  | #endif	
 | ||
|  | 	  } | ||
|  | 	  else if ( location == 1 ) | ||
|  | 	  { | ||
|  | 		LPC_IOCON->PIO1_15           &= ~0x07; | ||
|  | 		LPC_IOCON->PIO1_15           |= 0x02;		/* Timer0_16 MAT2 */ | ||
|  | 	  } | ||
|  | 	} | ||
|  |   } | ||
|  |   else if ( timer_num == 1 ) | ||
|  |   { | ||
|  | 	if ( match_enable & 0x01 ) | ||
|  | 	{ | ||
|  | 	  /*  Timer1_16 I/O config */ | ||
|  | 	  if ( location == 0 ) | ||
|  | 	  { | ||
|  | 		LPC_IOCON->PIO0_21           &= ~0x07; | ||
|  | 		LPC_IOCON->PIO0_21           |= 0x01;		/* Timer1_16 MAT0 */ | ||
|  | 	  } | ||
|  | 	} | ||
|  | 	if ( match_enable & 0x02 ) | ||
|  | 	{ | ||
|  | 	  /*  Timer1_16 I/O config */ | ||
|  | 	  if ( location == 0 ) | ||
|  | 	  { | ||
|  | 		LPC_IOCON->PIO0_22           &= ~0x07; | ||
|  | 		LPC_IOCON->PIO0_22           |= 0x02;		/* Timer1_16 MAT1 */ | ||
|  | 	  } | ||
|  | 	  else if ( location == 1 ) | ||
|  | 	  { | ||
|  | 		LPC_IOCON->PIO1_23           &= ~0x07; | ||
|  | 		LPC_IOCON->PIO1_23           |= 0x01;		/* Timer1_16 MAT1 */ | ||
|  | 	  } | ||
|  | 	} | ||
|  |   } | ||
|  |   return;		 | ||
|  | } | ||
|  | 
 | ||
|  | /******************************************************************************
 | ||
|  | ** Function name:		init_timer | ||
|  | ** | ||
|  | ** Descriptions:		Initialize timer, set timer interval, reset timer, | ||
|  | **						install timer interrupt handler | ||
|  | ** | ||
|  | ** parameters:			timer number and timer interval | ||
|  | ** Returned value:		None | ||
|  | **  | ||
|  | ******************************************************************************/ | ||
|  | void init_timer16(uint8_t timer_num, uint32_t TimerInterval)  | ||
|  | { | ||
|  |   uint32_t i; | ||
|  | 
 | ||
|  |   if ( timer_num == 0 ) | ||
|  |   { | ||
|  |     /* Some of the I/O pins need to be clearfully planned if
 | ||
|  |     you use below module because JTAG and TIMER CAP/MAT pins are muxed. */ | ||
|  |     LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7); | ||
|  | 
 | ||
|  |     LPC_CT16B0->MR0 = TimerInterval; | ||
|  |     LPC_CT16B0->MR1 = TimerInterval; | ||
|  | #if TIMER_MATCH
 | ||
|  |     for ( i = 0; i < 4; i++ ) | ||
|  |     { | ||
|  |       timer16_0_counter[i] = 0; | ||
|  |     } | ||
|  |     set_timer16_match(timer_num, 0x07, 0); | ||
|  |     LPC_CT16B0->EMR &= ~(0xFF<<4); | ||
|  |     LPC_CT16B0->EMR |= ((0x3<<4)|(0x3<<6)|(0x3<<8)); | ||
|  | #else
 | ||
|  |     for ( i = 0; i < 4; i++ ) | ||
|  |     { | ||
|  |       timer16_0_capture[i] = 0; | ||
|  |     } | ||
|  |     set_timer16_capture(timer_num, 0); | ||
|  |     /* Capture 0 and 2 on rising edge, interrupt enable. */ | ||
|  |     LPC_CT16B0->CCR = (0x5<<0)|(0x5<<6); | ||
|  | #endif
 | ||
|  |     LPC_CT16B0->MCR = (0x3<<0)|(0x3<<3);  /* Interrupt and Reset on MR0 and MR1 */ | ||
|  | 		 | ||
|  |     /* Enable the TIMER0 Interrupt */ | ||
|  | #if NMI_ENABLED
 | ||
|  |     NVIC_DisableIRQ(CT16B0_IRQn); | ||
|  |     NMI_Init( CT16B0_IRQn ); | ||
|  | #else
 | ||
|  |     NVIC_EnableIRQ(CT16B0_IRQn); | ||
|  | #endif
 | ||
|  |   } | ||
|  |   else if ( timer_num == 1 ) | ||
|  |   { | ||
|  |     /* Some of the I/O pins need to be clearfully planned if
 | ||
|  |     you use below module because JTAG and TIMER CAP/MAT pins are muxed. */ | ||
|  |     LPC_SYSCON->SYSAHBCLKCTRL |= (1<<8); | ||
|  |     LPC_CT16B1->MR0 = TimerInterval; | ||
|  |     LPC_CT16B1->MR1 = TimerInterval; | ||
|  | #if TIMER_MATCH
 | ||
|  |     for ( i = 0; i < 4; i++ ) | ||
|  |     { | ||
|  |       timer16_1_counter[i] = 0; | ||
|  |     } | ||
|  |     set_timer16_match(timer_num, 0x07, 0); | ||
|  |     LPC_CT16B1->EMR &= ~(0xFF<<4); | ||
|  |     LPC_CT16B1->EMR |= ((0x3<<4)|(0x3<<6)|(0x3<<8)); | ||
|  | #else
 | ||
|  |     for ( i = 0; i < 4; i++ ) | ||
|  |     { | ||
|  |       timer16_1_capture[i] = 0; | ||
|  |     } | ||
|  |     set_timer16_capture(timer_num, 0); | ||
|  |     /* Capture 0 and 1 on rising edge, interrupt enable. */ | ||
|  |     LPC_CT16B1->CCR = (0x5<<0)|(0x5<<3); | ||
|  | #endif
 | ||
|  |     LPC_CT16B1->MCR = (0x3<<0)|(0x3<<3);  /* Interrupt and Reset on MR0 and MR1 */ | ||
|  | 
 | ||
|  |     /* Enable the TIMER1 Interrupt */ | ||
|  | #if NMI_ENABLED
 | ||
|  |     NVIC_DisableIRQ(CT16B1_IRQn); | ||
|  |     NMI_Init( CT16B1_IRQn ); | ||
|  | #else
 | ||
|  |     NVIC_EnableIRQ(CT16B1_IRQn); | ||
|  | #endif
 | ||
|  |   } | ||
|  |   return; | ||
|  | } | ||
|  | 
 | ||
|  | /******************************************************************************
 | ||
|  | ** Function name:		init_timer16PWM | ||
|  | ** | ||
|  | ** Descriptions:		Initialize timer as PWM | ||
|  | ** | ||
|  | ** parameters:			timer number, period and match enable: | ||
|  | **						match_enable[0] = PWM for MAT0  | ||
|  | **						match_enable[1] = PWM for MAT1 | ||
|  | **						match_enable[2] = PWM for MAT2 | ||
|  | **			 | ||
|  | ** Returned value:	None | ||
|  | **  | ||
|  | ******************************************************************************/ | ||
|  | void init_timer16PWM(uint8_t timer_num, uint32_t period, uint8_t match_enable, uint8_t cap_enabled) | ||
|  | {	 | ||
|  |   disable_timer16(timer_num); | ||
|  | 
 | ||
|  |   if (timer_num == 1) | ||
|  |   { | ||
|  |     /* Some of the I/O pins need to be clearfully planned if
 | ||
|  |     you use below module because JTAG and TIMER CAP/MAT pins are muxed. */ | ||
|  |     LPC_SYSCON->SYSAHBCLKCTRL |= (1<<8); | ||
|  | 		 | ||
|  |     /* Setup the external match register */ | ||
|  |     LPC_CT16B1->EMR = (1<<EMC3)|(1<<EMC2)|(1<<EMC1)|(2<<EMC0)|(1<<3)|(match_enable); | ||
|  | 		 | ||
|  |     /* Setup the outputs */ | ||
|  |     /* If match0 is enabled, set the output */ | ||
|  |     set_timer16_match(timer_num, match_enable, 0 ); | ||
|  | 		 | ||
|  |     /* Enable the selected PWMs and enable Match3 */ | ||
|  |     LPC_CT16B1->PWMC = (1<<3)|(match_enable); | ||
|  | 		 | ||
|  |     /* Setup the match registers */ | ||
|  |     /* set the period value to a global variable */ | ||
|  |     timer16_1_period 	= period; | ||
|  |     LPC_CT16B1->MR3 	= timer16_1_period; | ||
|  |     LPC_CT16B1->MR0	= timer16_1_period/2; | ||
|  |     LPC_CT16B1->MR1	= timer16_1_period/2; | ||
|  |     LPC_CT16B1->MR2	= timer16_1_period/2; | ||
|  | 		 | ||
|  |     /* Set match control register */ | ||
|  |     LPC_CT16B1->MCR = 1<<10;// | 1<<9;				/* Reset on MR3 */
 | ||
|  | 		 | ||
|  |     if (cap_enabled) | ||
|  |     { | ||
|  | 	  /* Use location 0 for test. */ | ||
|  | 	  set_timer16_capture( timer_num, 0 ); | ||
|  |       LPC_CT16B1->IR = 0xF;							/* clear interrupt flag */ | ||
|  | 			 | ||
|  |       /* Set the capture control register */ | ||
|  |       LPC_CT16B1->CCR = 7; | ||
|  | 			 | ||
|  |     } | ||
|  |     /* Enable the TIMER1 Interrupt */ | ||
|  |     NVIC_EnableIRQ(CT16B1_IRQn); | ||
|  |   } | ||
|  |   else | ||
|  |   { | ||
|  |     LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7); | ||
|  | 		 | ||
|  |     /* Setup the external match register */ | ||
|  |     LPC_CT16B0->EMR = (1<<EMC3)|(1<<EMC2)|(1<<EMC1)|(1<<EMC0)|(1<<3)|(match_enable); | ||
|  | 		 | ||
|  |     /* Setup the outputs */ | ||
|  |     /* If match0 is enabled, set the output */ | ||
|  |     set_timer16_match(timer_num, match_enable, 0 ); | ||
|  | 			 | ||
|  |     /* Enable the selected PWMs and enable Match3 */ | ||
|  |     LPC_CT16B0->PWMC = (1<<3)|(match_enable); | ||
|  | 		 | ||
|  |     /* Setup the match registers */ | ||
|  |     /* set the period value to a global variable */ | ||
|  |     timer16_0_period = period; | ||
|  |     LPC_CT16B0->MR3 = timer16_0_period; | ||
|  |     LPC_CT16B0->MR0 = timer16_0_period/2; | ||
|  |     LPC_CT16B0->MR1 = timer16_0_period/2; | ||
|  |     LPC_CT16B0->MR2 = timer16_0_period/2; | ||
|  | 		 | ||
|  |     /* Set the match control register */ | ||
|  |     LPC_CT16B0->MCR = 1<<10;				/* Reset on MR3 */ | ||
|  | 		 | ||
|  |     /* Enable the TIMER1 Interrupt */ | ||
|  |     NVIC_EnableIRQ(CT16B0_IRQn); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | /******************************************************************************
 | ||
|  | ** Function name:		pwm16_setMatch | ||
|  | ** | ||
|  | ** Descriptions:		Set the pwm16 match values | ||
|  | ** | ||
|  | ** parameters:			timer number, match numner and the value | ||
|  | ** | ||
|  | ** Returned value:		None | ||
|  | **  | ||
|  | ******************************************************************************/ | ||
|  | void setMatch_timer16PWM (uint8_t timer_num, uint8_t match_nr, uint32_t value) | ||
|  | { | ||
|  |   if (timer_num) | ||
|  |   { | ||
|  |     switch (match_nr) | ||
|  |     { | ||
|  |       case 0: | ||
|  |         LPC_CT16B1->MR0 = value; | ||
|  |       break; | ||
|  |       case 1:  | ||
|  |         LPC_CT16B1->MR1 = value; | ||
|  |       break; | ||
|  |       case 2: | ||
|  |         LPC_CT16B1->MR2 = value; | ||
|  |       break; | ||
|  |       case 3:  | ||
|  |         LPC_CT16B1->MR3 = value; | ||
|  |       break; | ||
|  |       default: | ||
|  |         break; | ||
|  |     }	 | ||
|  |   } | ||
|  |   else  | ||
|  |   { | ||
|  |     switch (match_nr) | ||
|  |     { | ||
|  |       case 0: | ||
|  |         LPC_CT16B0->MR0 = value; | ||
|  |       break; | ||
|  |       case 1:  | ||
|  |         LPC_CT16B0->MR1 = value; | ||
|  |       break; | ||
|  |       case 2: | ||
|  |         LPC_CT16B0->MR2 = value; | ||
|  |       break; | ||
|  |       case 3:  | ||
|  |         LPC_CT16B0->MR3 = value; | ||
|  |       break; | ||
|  |       default: | ||
|  |       break; | ||
|  |     }	 | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | /******************************************************************************
 | ||
|  | **                            End Of File | ||
|  | ******************************************************************************/ |