主题 : 关于串口中断遇到的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 16747
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
贡献值: 0 点
综合积分: 20 分
注册时间: 2010-03-21
最后登录: 2010-09-02
楼主  发表于: 2010-03-26 16:55

 关于串口中断遇到的问题

大家好,小弟刚刚接触2440 ARM9,最近在调试底层PWM模块遇到如下问题,苦苦无法解决,夜不能寐,忘大侠们帮忙,不胜感激
本意是用PWM的TIMER1定时器功能让开发板上的灯间隔1S亮灭,我写的程序如下:
主函数main()
#include "def.h"
#include "option.h"
#include "2440addr.h"    
#include "2440lib.h"
#include "2440slib.h"      
//================================
extern void pwm_init(void);
extern void clock_init(void);
extern void IO_init(void);
extern void Timer1INT_Init(void);

void Main(void)
{
    clock_init();
    
    IO_init();
    pwm_init();
    Timer1INT_Init();
    
    while(1);
}
以下是各实现初始化和功能函数
//***************************************************
#include "def.h"
#include "option.h"
#include "2440addr.h"    
#include "2440lib.h"
#include "2440slib.h"      
//===================

void __irq Timer1_ISR(void)
{

        rGPBDAT = 0x3fffff;
        rSRCPND |= BIT_TIMER1;
           rINTPND |= BIT_TIMER1;
           rINTMSK = ~(BIT_TIMER1);

}


void pwm_init(void)
{
   // rGPGCON = rGPGCON & 0xfff0ffff | 0x00050000; //配置GPG口为信号输出
  //  rGPGDAT = rGPGDAT | 0x300;
    rTCFG0  = 255;      // Prescaler0=255
    rTCFG1  = 3 << 4;      //
    rTCNTB1 = 50000000/256/16;    // 在pclk=50MHZ下,1秒钟的记数值rTCNTB1 = 50000000 / 4 / 256 = 48828;
    rTCMPB1 = 0x00;
    rTCON   = (1 << 11) | (1 << 9) | (0 << 8); //禁用定时器1,手动加载
    rTCON   = (1 << 11) | (0 << 9) | (1 << 8); //启动定时器1,自动装载

}

void clock_init(void)
{
    rMPLLCON = 17<<12|1<<4|2;        //50MHZ  FCLK=2*(17+8)*12M/(3*2^2)
    rCLKDIVN = 0x3;//时钟分频比1:1:1;
    
}

void IO_init(void)
{
    rGPBCON = 0X55<<10;
    rGPBUP = 0X3FF;
    rGPBDAT = 5<<5;
}

//--------------------------------------------------------------------------
//      定时器中断初始化程序
//--------------------------------------------------------------------------
void Timer1INT_Init(void)                                     //定时器接口使能
{
    rINTMOD = 0X0;
     if ((rINTPND & BIT_TIMER1))
    {
        rSRCPND |= BIT_TIMER1;
    }
    pISR_TIMER1 = (unsigned)Timer1_ISR;
    rINTMSK  &= ~(BIT_TIMER1);  //开中断;    
}
//--------------------------------------------------------------------------
//     目标板初始化程序,主函数中只需调用此函数,即可完成目标板的初始化
//--------------------------------------------------------------------------
级别: 新手上路
UID: 5952
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
贡献值: 0 点
综合积分: 14 分
注册时间: 2009-05-14
最后登录: 2012-03-02
1楼  发表于: 2010-03-27 21:27
是不是不能产生中断啊?我的也是一样,调试的时候就是不行,一中断 就不知道程序跑到那里去;
级别: 新手上路
UID: 16747
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
贡献值: 0 点
综合积分: 20 分
注册时间: 2010-03-21
最后登录: 2010-09-02
2楼  发表于: 2010-03-28 00:11
尝试了很多方法,感觉PWM的TIMER1定时器的寄存器也没有设置问题,中断应该也是对的,使用单步调试的时候,在执行完打开中断语句 rINTMSK  &= ~(BIT_TIMER1);  //开中断;,程序就不知道跑到哪里去了,一个简单的底层中断就调试了2天,还没搞定,是在郁闷,希望各位哥哥姐姐们帮个忙,让咱不要花太多时间在这上面,小弟怀着期待的心情等待帮咱解决这个疙瘩...
级别: 新手上路
UID: 16747
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
贡献值: 0 点
综合积分: 20 分
注册时间: 2010-03-21
最后登录: 2010-09-02
3楼  发表于: 2010-03-29 12:46
这个问题已经解决,需要打开MMU,更改接入点
勺饮不器盛沧海,拳石频移磊泰山
级别: 侠客
UID: 15752
精华: 0
发帖: 71
金钱: 355 两
威望: 71 点
贡献值: 0 点
综合积分: 142 分
注册时间: 2010-03-09
最后登录: 2010-10-19
4楼  发表于: 2010-05-16 10:42

 回 3楼(yafwang) 的帖子

老兄您好,小弟在利用UART0的中断方式接收数据遇到了同样的问题,请您指教!
勺饮不器盛沧海,拳石频移磊泰山
向高手学习嘿嘿O(∩_∩)O~
级别: 新手上路
UID: 19433
精华: 0
发帖: 24
金钱: 120 两
威望: 24 点
贡献值: 0 点
综合积分: 48 分
注册时间: 2010-04-19
最后登录: 2010-11-06
5楼  发表于: 2010-05-16 11:35

 回 3楼(yafwang) 的帖子

楼主,能不能把调通的程序贴出来啊,我也是在调中断的时候调不通,不知哪里出问题了
向高手学习嘿嘿O(∩_∩)O~
级别: 新手上路
UID: 19433
精华: 0
发帖: 24
金钱: 120 两
威望: 24 点
贡献值: 0 点
综合积分: 48 分
注册时间: 2010-04-19
最后登录: 2010-11-06
6楼  发表于: 2010-05-18 16:47

 回 4楼(云鹤九霄) 的帖子

你好,我看到你的回帖,请问你的问题解决了么?怎么办才行啊?