mirror of
https://github.com/hathach/tinyusb.git
synced 2025-01-17 05:32:55 +08:00
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
|
||
|
******************************************************************************/
|