6247|8

81

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于ARM s3c44b0x ISR_STARTADDRESS值的确定 [复制链接]

最近在s3c44b0x板子上跑一个中断程序,总是失败,考虑了所有情况后觉得ISR_STARTADDRESS值是个可能出错的地方。源程序上定义了ISR_STARTADDRESS=0xc77ff00,但发现自己的板子是HY57V641620,这个实际上是一个4BANK*1M*16BIT的SDRAM,那这个地方的ISR_STARTADDRESS是不是应该定义为0xc37ff00,可是还是不对,期望高手帮忙啊。
此帖出自ARM技术论坛

最新回复

是不是这么个原因: 因为板子出厂时,flash的0地址上写有厂家的BIOS程序,其中的中断向量表和自己程序的中断向量表冲突,而一个板子只能有一个中断向量表,所以要把程序烧写到flash中去,因为串口老是打印莫名其妙的字符,也就是进入了BIOS的中断服务程序里?  详情 回复 发表于 2007-10-25 20:50
点赞 关注
 

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
第一,地址的确定,要看你硬件如何接线的。44B0没有MMU,物理地址接的是多少,就是多少;
第二,如果ISR在SDRAM内,那么首先要确保SDRAM是初始化好了的。
第三,你应该尝试去读ISR_STARTADDRESS地方的代码。如果你源程序定义的ISR_STARTADDRESS是0xc77ff00,而你的接线又没有接到那个bank,那么很可能报的错误是data abort 或者预取指令错误等等exception。如果没有exception,只是进了中断就没有出来,那应该是地址可以访问,但是ISR程序有误。你可以通过硬件点灯这类的方式判断是否进入了ISR。
第四,你可以贴一部分代码上来,便于分析问题。
此帖出自ARM技术论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
先谢谢了,下面是部分程序:
void Led_Display(int LedStatus)
{
       
    rPDATC=(rPDATC&0x1f1)|((LedStatus&0x7)<<1);
}

void __irq timer0_int(void)
{
   rI_ISPC=BIT_TIMER0;
   mt0cnt++;
          
   if (mt0cnt>100)
   {
      
       mt0cnt=0;
        Led_Display(ledstatus);
        ledstatus=(~ledstatus)&0x7;
   }
   else ;
   return ;
}

void init_timer0(void)
{
   rINTMSK=BIT_GLOBAL;
   
   
    pISR_TIMER0=(int) timer0_int;
     rINTCON=0x5;
   
   
    rTCFG1=0x00000004;     
    rTCNTB0=(unsigned int)(MCLK_D/(rTCFG0&0x000000ff)/32/100 );   
    rTCON=0x00a;
    rTCON=0x009;
    Uart_Printf("begin \n");
    rINTMSK=~(BIT_GLOBAL|BIT_TIMER0);

}

void __irq eint4567_int(void)
{       
        rI_ISPC=BIT_EINT4567;
        Led_Display(ledstatus);
        ledstatus=(~ledstatus)&0x7;
       
}
void init_eint4567(void)
{       
        rINTMSK=~(BIT_GLOBAL|BIT_EINT4567);
        pISR_EINT4567=(int) eint4567_int;
        rINTCON=0x5;
}


/***************************************************************************
Function name: Main
Parameter    : void
Description  : 初始化系统时钟,串口,并调用LCD图片显示实验函数
Return             : void
Argument     :
Autor & date :
****************************************************************************/
void Main(void)
{
        int i;
        SystemClockInit();                        //系统时钟初始化
        MemCfgInit();                                //设置非Cache区
        PortInit();                                        //端口初始化
        CacheEnable();                                //Cache允许

        SerialSwitch(0);                        //切换到串口1
        SerialChgBaud(115200);            //设置串口波特率,115200
        rPCONC=0x0015;                       
        rPUPC=0xffff;
       
       
        //将中断向量和处理程序拷贝到SDRAM的起始地址
        //假设中断跳转指令已经烧写到了FLASH的起始地址!!!
        if(Image$$RO$$Base!=(char *)0x0c000000) {
                U32 *src = (U32 *)Image$$RO$$Base;
                U32 *dst = (U32 *)0x0c000000;
                for(i=0x00; i<0x400; i++)
                        dst = src;
        }

        Uart_Printf( "\nFS44B0XP Timer0 Interrupt Test!\n" );
    init_timer0();

    while((flag!=10));   //等待中断的产生,10次中断后结束
    rTCON=0x0;           //停止
    rINTMSK=BIT_GLOBAL;
    Uart_Printf("\n Timer2 Interrupt Ok\n");
}

-----------------------------------------
IsrIRQ        ;using I_ISPR register.
    sub            sp,sp,#4       ;reserved for PC
    stmfd   sp!,{r8-r9}   

        ;IMPORTANT CAUTION
        ;if I_ISPC is not used properly, I_ISPR can be 0 in this routine.

    ldr            r9,=I_ISPR
    ldr            r9,[r9]

        cmp                r9, #0x0        ;If the IDLE mode work-around is used,
                                                ;r9 may be 0 sometimes.
        beq                %F2

    mov            r8,#0x0
0
    movs    r9,r9,lsr #1
    bcs            %F1
    add            r8,r8,#4
    b            %B0

1
    ldr            r9,=HandleADC
    add            r9,r9,r8
    ldr            r9,[r9]
    str            r9,[sp,#8]
    ldmfd   sp!,{r8-r9,pc}

2
        ldmfd        sp!,{r8-r9}
        add                sp,sp,#4
        subs        pc,lr,#4

————————————————————————
此帖出自ARM技术论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
应该是没进中断服务程序,因为试着在中断服务里用串口打印数据,没有反应。先谢谢楼上了!
此帖出自ARM技术论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
-----初始化程序
SMRDATA DATA
;*****************************************************************
; Memory configuration has to be optimized for best performance  *
; The following parameter is not optimized.                      *
;*****************************************************************

;*** memory access cycle parameter strategy ***
; 1) Even FP-DRAM, EDO setting has more late fetch point by half-clock
; 2) The memory settings,here, are made the safe parameters even at 66Mhz.
; 3) FP-DRAM Parameters:tRCD=3 for tRAC, tcas=2 for pad delay, tcp=2 for bus load.
; 4) DRAM refresh rate is for 40Mhz.

;bank0        16bit BOOT ROM SST39VF160/SST39VF320
;bank1        8bit Nand Flash K9F2808U0A/K9F5608U0A
;bank2        16bit IDE & CF Card
;bank3        16bit CS8900
;bank4        8bit PDIUSBD12
;bank5        8bit SL811HST
;bank6        16bit SDRAM
;bank7        8bit SM Card & StepMotor

    [ BUSWIDTH=16
                DCD 0x01001102        ;Bank0=OM[1:0]  16bit BootRomSST39VF160/SST39VF320) :0x0
;             |||||||-         Bank1=8bit Nand Flash
;             |||||---         Bank2=16bit IDE & CF Card
;             ||||----         Bank3=16bit CS8900, Wait status is disable
;             |||-----         Bank4=8bit PDIUSBD12 , Bank5=8bit SL811HST
;             --------         Bank6=16bit SDRAM, Bank7=8bit SM Card & StepMotor

    | ;BUSWIDTH=32
                DCD 0x22222220        ;Bank0=OM[1:0], Bank1~Bank7=32bit
    ]
   
        DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))        ;GCS0
        DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))        ;GCS1
        DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))        ;GCS2
        DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))        ;GCS3
        DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))        ;GCS4
        DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))        ;GCS5
        [ BDRAMTYPE="DRAM"
            DCD ((B6_MT<<15)+(B6_Trcd<<4)+(B6_Tcas<<3)+(B6_Tcp<<2)+(B6_CAN))        ;GCS6 check the MT value in parameter.a
        | ;"SDRAM"
                DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))        ;GCS6
        ]
        DCD ((B7_Tacs<<13)+(B7_Tcos<<11)+(B7_Tacc<<8)+(B7_Toch<<6)+(B7_Tcah<<4)+(B7_Tacp<<2)+(B7_PMC))        ;GCS7

        DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)        ;REFRESH RFEN=1, TREFMD=0, trp=3clk, trc=5clk, tchr=3clk,count=1019
        DCD 0x10                        ;SCLK power down mode, BANKSIZE 32M/32M
        DCD 0x20                        ;MRSR6 CL=2clk
        DCD 0x20                        ;MRSR7
此帖出自ARM技术论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

6
 
首先,你的UART_printf函数可以工作么?如果可以,Uart_Printf( "\nFS44B0XP Timer0 Interrupt Test!\n" );
应该已经打印出来;

而你的程序,应该是没有执行到下一个打印函数的。
你可以把


void __irq timer0_int(void)
{
   rI_ISPC=BIT_TIMER0;
   mt0cnt++;
   
   if (mt0cnt >100)
   {
        
       mt0cnt=0;
Led_Display(ledstatus);
ledstatus=(~ledstatus)&0x7;
   }
   else ;
   return ;
}
这一段改为:
void __irq timer0_int(void)
{
   rI_ISPC=BIT_TIMER0;
   mt0cnt++;
   Led_Display(1);//或者是其它什么,视你的LED状态而定 不要在这里用printf  
   //没有return,中断服务程序没有返回值
}
mtOcnt应该是个全局变量,你可以用这个全局变量来判断是否进了中断服务程序。

可以把
   while((flag!=10));   //等待中断的产生,10次中断后结束
    rTCON=0x0;           //停止
    rINTMSK=BIT_GLOBAL;
    Uart_Printf("\n Timer2 Interrupt Ok\n");

改为
    mt0cnt=0;
   while((mt0cnt==0));   //等待中断的产生,1次中断后结束 没看到你的flag定义;
    rTCON=0x0;           //停止
    rINTMSK=BIT_GLOBAL;
    Uart_Printf("\n Timer2 Interrupt Ok\n");

先试试看,把打印结果也贴上来。
此帖出自ARM技术论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
先谢谢哈,晚上贴处结果
此帖出自ARM技术论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

8
 
哎,还是不行,最后一句的打印出不来,也就是说一直在循环,我的QQ是454639001,邮箱是mww.luoyn@gmail.com 一般都隐身在线,能不能请楼上帮帮忙看看完整的程序,十分感谢啊。
此帖出自ARM技术论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
是不是这么个原因:
因为板子出厂时,flash的0地址上写有厂家的BIOS程序,其中的中断向量表和自己程序的中断向量表冲突,而一个板子只能有一个中断向量表,所以要把程序烧写到flash中去,因为串口老是打印莫名其妙的字符,也就是进入了BIOS的中断服务程序里?
此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【干货上新】电源解决方案和技术第二趴 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 5

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表