打印
[ZLG-ARM]

time1定时器中断调试问题

[复制链接]
1332|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
houn|  楼主 | 2008-8-7 20:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的周立功的ARM Executable Image for plc2200工程模板,开发板是zlg2210
#include "config.h"

#define BEEPCON    1 << 7        //控制喇叭发音
uint8 flag = 0;
//初始化定时器1
void Time1_Init(void)
{
    T1TC = 0;
    T1TCR = 0x00;            //禁止定时器1使能
    T1PR = Fpclk / 1000;
    T1MCR = 0x03;
    T1MR0 = 5000;
    T1TCR = 0x01;
}
//初始化GPIO
void GPIO_Init(void)
{
    PINSEL0 = 0x0A000000;
    IO0DIR = BEEPCON;
    IO0SET = BEEPCON;
}
//定时器1中断程序
void __irq Time1_IRQ(void)
{
    T1TCR = 0x03;
    if(flag == 0)
    {
        IO0CLR = BEEPCON; 
        flag = 1;
    }
    else
    {
        IO0SET = BEEPCON;
        flag = 0;
    }
    VICVectAddr = 0;
}
//设置定时器1中断处理初始化
void Int_Init(void)
{
    VICIntSelect = 0x00000000;
    VICIntEnable = 1 << 5;
    VICVectCntl0 = (uint32)Time1_IRQ;
}
int main (void)
{
    // add user source code 
    GPIO_Init();    
    Time1_Init();
    Int_Init();    
    while(1);    
    return 0;
}

调试时候
调试老是在
int main (void)
{
    // add user source code 
    GPIO_Init();    
    Time1_Init();
    Int_Init();    
    while(1);    
    return 0;
}

    GPIO_Init();    
    Time1_Init();
    Int_Init();
之间反复运行,while()走不到,我不知道问题出在那里,请周工看看
文件在附件里,请帮忙看看是怎么回事
相关链接:https://bbs.21ic.com/upfiles/img/20079/2007922202325731.rar

相关帖子

沙发
zlgarm| | 2008-8-8 19:06 | 只看该作者

楼主

您好!
  建议在main函数里逐一将
    GPIO_Init();    
    Time1_Init();
    Int_Init();
  函数注释掉,观察是否能跑到while(1)。此为排除法。
  若是排除法也不行,请检查代码是否确实下载到了开发板上,以及代码优化是否关闭了。
                 by ltt 

使用特权

评论回复
板凳
houn|  楼主 | 2008-8-11 08:32 | 只看该作者

问题的解决

问题如下:
1.在Int_Init()函数中,缺少VICVectCntl0 = 0x25;没有为中断控制器设置中断源通道号.
2.在中断处理程序中,中断程序处理完毕后没有中断复位即T1IR = 1;,导致定时器中断处理结束后不能继续响应中断,主要问题就是这两条.反映平时基础不牢固,不扎实.

使用特权

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

本版积分规则

11

主题

21

帖子

0

粉丝