peter@521: // ---------------------------------------------------------------------------- peter@521: // ATMEL Microcontroller Software Support - ROUSSET - peter@521: // ---------------------------------------------------------------------------- peter@521: // DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR peter@521: // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF peter@521: // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE peter@521: // DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, peter@521: // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT peter@521: // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, peter@521: // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF peter@521: // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING peter@521: // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, peter@521: // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. peter@521: // ---------------------------------------------------------------------------- peter@521: // File Name : interrupt_timer.c peter@521: // Object : Timer interrupt management peter@521: // : Use AT91B_LED7 & AT91B_LED8 for status interrupt peter@521: // Creation : JPP 08-Sep-2005 peter@521: // ---------------------------------------------------------------------------- peter@521: peter@521: // Include Standard LIB files peter@521: #include "config.h" peter@521: peter@521: //* Global variable peter@521: int timer0_interrupt = 0; peter@521: peter@521: #define TIMER0_INTERRUPT_LEVEL 1 peter@521: peter@521: /*-----------------*/ peter@521: /* Clock Selection */ peter@521: /*-----------------*/ peter@521: #define TC_CLKS 0x7 peter@521: #define TC_CLKS_MCK2 0x0 peter@521: #define TC_CLKS_MCK8 0x1 peter@521: #define TC_CLKS_MCK32 0x2 peter@521: #define TC_CLKS_MCK128 0x3 peter@521: #define TC_CLKS_MCK1024 0x4 peter@521: peter@521: //*------------------------- Internal Function -------------------------------- peter@521: //*---------------------------------------------------------------------------- peter@521: //* Function Name : AT91F_TC_Open peter@521: //* Object : Initialize Timer Counter Channel and enable is clock peter@521: //* Input Parameters : = TC Channel Descriptor Pointer peter@521: //* = Timer Counter Mode peter@521: //* : = Timer peripheral ID definitions peter@521: //* Output Parameters : None peter@521: //*---------------------------------------------------------------------------- peter@521: void AT91F_TC_Open ( AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId) peter@521: { peter@521: unsigned int dummy; peter@521: peter@521: //* First, enable the clock of the TIMER peter@521: AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<< TimerId ) ; peter@521: peter@521: //* Disable the clock and the interrupts peter@521: TC_pt->TC_CCR = AT91C_TC_CLKDIS ; peter@521: TC_pt->TC_IDR = 0xFFFFFFFF ; peter@521: peter@521: //* Clear status bit peter@521: dummy = TC_pt->TC_SR; peter@521: //* Suppress warning variable "dummy" was set but never used peter@521: dummy = dummy; peter@521: //* Set the Mode of the Timer Counter peter@521: TC_pt->TC_CMR = Mode ; peter@521: peter@521: //* Enable the clock peter@521: TC_pt->TC_CCR = AT91C_TC_CLKEN ; peter@521: } peter@521: //*------------------------- Interrupt Function ------------------------------- peter@521: peter@521: //*---------------------------------------------------------------------------- peter@521: //* Function Name : timer0_c_irq_handler peter@521: //* Object : C handler interrupt function calAT91B_LED by the interrupts peter@521: //* assembling routine peter@521: //* Output Parameters : increment count_timer0_interrupt peter@521: //*---------------------------------------------------------------------------- peter@521: void timer0_c_irq_handler(void) peter@521: { peter@521: AT91PS_TC TC_pt = AT91C_BASE_TC0; peter@521: unsigned int dummy; peter@521: //* AcknowAT91B_LEDge interrupt status peter@521: dummy = TC_pt->TC_SR; peter@521: //* Suppress warning variable "dummy" was set but never used peter@521: dummy = dummy; peter@521: timer0_interrupt = TRUE; peter@521: } peter@521: peter@521: //*-------------------------- External Function ------------------------------- peter@521: peter@521: //*---------------------------------------------------------------------------- peter@521: //* Function Name : timer_init peter@521: //* Object : Init timer counter peter@521: //* Input Parameters : none peter@521: //* Output Parameters : TRUE peter@521: //*---------------------------------------------------------------------------- peter@521: void timer_init (unsigned int time) peter@521: { peter@521: //* Open timer0 peter@521: AT91F_TC_Open(AT91C_BASE_TC0,TC_CLKS_MCK8 | AT91C_TC_WAVESEL_UP_AUTO,AT91C_ID_TC0); peter@521: peter@521: //* Open Timer 0 interrupt peter@521: AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC0, TIMER0_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, timer0_c_irq_handler); peter@521: AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS; // IRQ enable CPC peter@521: AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC0); peter@521: peter@521: AT91C_BASE_TC0->TC_RC = (unsigned int)(AT91C_MASTER_CLOCK / 8 * time / 1000); peter@521: peter@521: //* Start timer0 peter@521: AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG ; peter@521: }