ma dongxue

GPT Timer interrupt  problem with MCF52235

Discussion created by ma dongxue on Jun 3, 2009
Latest reply on Feb 17, 2011 by Ke Li
I just want to use the GPT gerenal timer function,but it didn't come into Gpt_IsrHandler. I referenced the 52235_RM,I think it must be the registers are not setting correctly,but didn't find the problem.

/* * File:  main.c * Purpose:       sample program * */#include "support_common.h" /* include peripheral declarations and more */#include <stdio.h>/******************************************************************** * MCF5xxx ASM utility functions ********************************************************************/asm void asm_set_ipl(unsigned long) {  link    A6,#-8    movem.l D6-D7,(SP)    move.w  SR,D7        /* current sr    */    move.l  D7,D0        /* prepare return value  */    andi.l  #0x0700,D0   /* mask out IPL  */    lsr.l   #8,D0        /* IPL   */    move.l  8(A6),D6     /* get argument  */    andi.l  #0x07,D6        /* least significant three bits  */    lsl.l   #8,D6        /* move over to make mask    */    andi.l  #0x0000F8FF,D7  /* zero out current IPL  */    or.l    D6,D7           /* place new IPL in sr   */    move.w  D7,SR    movem.l (SP),D6-D7    lea     8(SP),SP    unlk    A6    rts }/********************************************************************/voidmcf5xxx_irq_enable (void){    asm_set_ipl(0);}/********************************************************************//* * Write new interrupt vector handler into the vector table * Return previous handler address **********************************************************/ uint32 mcf5xxx_set_handler (int vector, uint32 new_handler){    extern uint32 __VECTOR_RAM[];    uint32 old_handler;        old_handler = (uint32) __VECTOR_RAM[vector];    __VECTOR_RAM[vector] = (uint32)new_handler;    return old_handler;}/***********************************************************************************/__declspec(interrupt)void Gpt_IsrHandler(void){     MCF_GPTA_GPTFLG2 |= MCF_GPTA_GPTFLG2_TOF; // clear interrupt flag of channel 0    MCF_GPIO_PORTLD = 0x00;//light the LEDs}/***********************************************************************************/void GPT_Timer(void){          // open global Timer channel 0 interrupt of GPT      MCF_INTC0_IMRH &= ~(1 | MCF_INTC_IMRH_INT_MASK41);     // Specifies the interrupt level (1~7) and the priority within the level(0~7) for Timer channel 0 interrupt      MCF_INTC0_ICR44 = MCF_INTC_ICR_IL(3) | MCF_INTC_ICR_IP(6);         MCF_GPTA_GPTSCR2=(1                     |MCF_GPTA_GPTSCR2_TOI     //timer overflow interrupt enable                     |MCF_GPTA_GPTSCR2_PR_64); //65536/((60M/2)/64)=0.14s        MCF_GPTA_GPTPACTL = (1| MCF_GPTA_GPTPACTL_CLK_GPTPR);// Select the GPT counter input clock         MCF_GPTA_GPTFLG2 = MCF_GPTA_GPTFLG2_TOF; // clear flag of timer    MCF_GPTA_GPTSCR1 = MCF_GPTA_GPTSCR1_GPTEN;   // enable GPT }/**************************************************************************/int main(void){    mcf5xxx_irq_enable();   // setup interrupt handler of Timer Channel 0 of GPT     mcf5xxx_set_handler(64 + 41, (uint32)Gpt_IsrHandler);    GPT_Timer();    //LD port connect LED,set as GPIO function,output     MCF_GPIO_PLDPAR = 0x00;    MCF_GPIO_DDRLD = 0xff;         while(1)    {                   }     }


Message Edited by neumdx on 2009-06-03 03:22 AM