打印
[ZLG-MCU]

为什么中断处理会出错呢

[复制链接]
1620|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Andy1990zx|  楼主 | 2008-3-14 12:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include  "hw_types.h"
#include  "hw_memmap.h"
#include  "hw_ints.h"
#include  "hw_sysctl.h"
#include  "hw_gpio.h"
#include  "hw_timer.h"
#include  "interrupt.h"
#include  "sysctl.h"
#include  "gpio.h"
#include  "timer.h"

#define KEY4 GPIO_PIN_4  //PA4 按键后转为软件输出低频
#define LED4 GPIO_PIN_5  //PD5 CCP2/TIMER1A输出,连接上LED4来查看波形
#define KEY1 GPIO_PIN_4  //PD4 调整频率
#define KEY3 GPIO_PIN_5  //PB5 调整频率
void  waitJTAG ( void ) //KEY4 PA.4
{
    SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOA) ;                /* 使能GPIOA端口*/
    GPIOPinTypeGPIOInput (GPIO_PORTA_BASE,GPIO_PIN_4) ;           /* 设置按键所在的PA2管脚为输入*/
    if (GPIOPinRead (GPIO_PORTA_BASE,GPIO_PIN_4) == 0x00) {       /* 如果有键按下,则进入*/
        for (;;);                                                 /* 死循环,以等待JTAG连接*/
    }
    SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOA);                 // 禁止按键所在的GPIO端口
}

void  Timer1Init ( void )
{
    SysCtlPeripheralEnable ( SYSCTL_PERIPH_GPIOD ) ;               /* 使能CCP2所在的GPIO端口*/
    GPIOPinTypeTimer ( GPIO_PORTD_BASE , GPIO_PIN_5 ) ;            /* 配置CCP2管脚为PWM输出*/

    SysCtlPeripheralEnable ( SYSCTL_PERIPH_TIMER1 ) ;              /* 使能定时器模块*/
    TimerConfigure (TIMER1_BASE,TIMER_CFG_16_BIT_PAIR|TIMER_CFG_A_PWM) ; /* 配置定时器A为16位PWM*/
    TimerControlLevel ( TIMER1_BASE , TIMER_A , true ) ;        /* 控制PWM输出反相*/
    TimerLoadSet ( TIMER1_BASE , TIMER_A , 1);                /* 设置定时器初值*/
    TimerMatchSet ( TIMER1_BASE , TIMER_A ,0 ) ;                  /* 设置TimerA的PWM匹配值*/
    TimerEnable ( TIMER1_BASE , TIMER_A ) ;                     /* 使能定时器计数,PWM开始输出*/
}

int  main ( void )
{
    waitJTAG () ;                                                 /* 防止JTAG失效*/
    SysCtlLDOSet(SYSCTL_LDO_2_75V);                                // 内核电压设置为最高的2.75V
    SysCtlClockSet(SYSCTL_USE_PLL  |                               // 配置系统时钟,采用PLL,50MHz
                   SYSCTL_OSC_MAIN  |
                   SYSCTL_XTAL_6MHZ  |
                   SYSCTL_SYSDIV_4);
    Timer1Init ( ) ;                                              /* 定时器初始化*/

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    GPIODirModeSet (GPIO_PORTA_BASE,GPIO_PIN_4,GPIO_DIR_MODE_IN);
    while(GPIOPinRead(GPIO_PORTA_BASE,KEY4));  //等待按键KEY4
    
    TimerDisable(TIMER1_BASE,TIMER_A);  //停止输出
//下面开始软件输出PWM----------------------------------------------------    
    SysCtlLDOSet(SYSCTL_LDO_2_50V);                                // 内核电压设置回2.50V
    SysCtlClockSet( SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC|SYSCTL_OSC_MAIN |SYSCTL_XTAL_6MHZ);                              //频率改回来
    
        
    IntPrioritySet(INT_TIMER1A,0x80);
    IntPrioritySet(INT_GPIOD,0x40);
    IntPrioritySet(INT_GPIOB,0x40);  //按键优先级高于定时中断,以便随时调整频率

    GPIODirModeSet(GPIO_PORTD_BASE,LED4,GPIO_DIR_MODE_OUT);
    TimerConfigure (TIMER1_BASE,TIMER_CFG_32_BIT_PER) ;
    TimerLoadSet ( TIMER1_BASE , TIMER_A , SysCtlClockGet()/2);
    TimerMatchSet ( TIMER1_BASE , TIMER_A , 0 );
    TimerIntEnable(TIMER1_BASE,    TIMER_TIMA_TIMEOUT);  //定时器设置
    
//----------1--------------    
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    GPIODirModeSet(GPIO_PORTD_BASE,KEY1,GPIO_DIR_MODE_IN);       //KEY1 in
    GPIODirModeSet(GPIO_PORTB_BASE,KEY3,GPIO_DIR_MODE_IN);
    GPIOIntTypeSet(GPIO_PORTD_BASE,KEY1,GPIO_FALLING_EDGE);    
    GPIOIntTypeSet(GPIO_PORTB_BASE,KEY3,GPIO_FALLING_EDGE);
    GPIOPinIntEnable(GPIO_PORTD_BASE,KEY1);
    GPIOPinIntEnable(GPIO_PORTB_BASE,KEY3);
    IntEnable(INT_GPIOD);    
    IntEnable(INT_GPIOB);
//---------2------------------
    IntEnable(INT_TIMER1A);
    IntMasterEnable();
    while(1);
    
    
}

void TIMER1_INT(void)         //定时中断,翻转PWM
{
    TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT);
    GPIOPinWrite(GPIO_PORTD_BASE,LED4,~GPIOPinRead(GPIO_PORTD_BASE,LED4));
    TimerEnable(TIMER1_BASE, TIMER_A);
}

void INTKEY1(void)             //KEY1中断
{
  TimerLoadSet ( TIMER1_BASE , TIMER_A , TimerLoadGet(TIMER1_BASE , TIMER_A)+20);
}

void INTKEY3(void)             //KEY3中断
{
  TimerLoadSet ( TIMER1_BASE , TIMER_A , TimerLoadGet(TIMER1_BASE , TIMER_A)-20);
}

环境:615+IAR
在周公写的"定时器PWM模式发出25Mhz方波"程序上加以修改,先输出25MPWM,当按KEY4键后停止输出,改为定时器定时中断,软件翻转输出低频PWM(暂定频率为1hz)     这个已经成功实现,能看到灯一闪一闪的
后来我想利用KEY1和KEY3,分别用来增高和降低频率,于是就加了两个GPIO_INT中断,可是问题就出现了:去掉1和2之间的程序是正常的,一旦加上,调试时程序会自动进入KEY中断处理中,不按键就进入,而且灯也不闪了,好像进入中断后就出不来..........................
我还有调试另外一个看门狗程序,也是在中断中出不来........跟例程对比了,实在是没发现什么问题啊..请大虾帮我看看
(在startup.c中加入和修改了中断处理声明)

相关帖子

沙发
zlgmcu| | 2008-3-14 13:38 | 只看该作者

进入中断后要记得清除呀

使用特权

评论回复
板凳
Andy1990zx|  楼主 | 2008-3-14 13:56 | 只看该作者

自动进入

问题是他自动进入啊 我不按键他就进去了INTKEY1中.....

使用特权

评论回复
地板
Andy1990zx|  楼主 | 2008-3-14 17:46 | 只看该作者

好的

谢谢,下次有问题我会直接发邮件的~
这个问题我昨天被困扰了很久,今天下午被我解决啦 
1.进入中断后没有清除中断
2.自动进入中断是因为调试时候IAR软件的问题,后来我用按键来硬件复位,不在软件里调试,就正常跑起来了
3.IAR调试的时候我还有一点小问题,需要自己再摸索

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

37

帖子

0

粉丝