• ARM9中断调试(1)


    /***************************************************
     *作    者:温子祺
     *联系方式:wenziqi@hotmail.com
     *说   明 :ARM9中断调试(1)   
     ***************************************************/
       

        一般情况下,在ARM9调试程序都是下载到RAM中执行的,当然,只要没有中断产生程序看似能够正常执行,但是一旦中断发生,程序必然会跑飞,原因在于程序中断后,PC默认指向0x00-0x1C处,但是RAM的起始地址是0x30000000,中断向量表默认在0x30000018处,很明显,中断服务程序是不能够正常执行的,同时ARM内核会通过串口打印"Dummy_isr error........"信息。

    解决办法:
    (1)直接烧写到nand第0块(如果代码大于4K,启动代码中必须要有拷贝到SDRAM功能)
    (2)改写自己的程序,在初始化中断之前将中断向量表拷贝到内部SRAM.
    (3)利用MMU的重定向功能

     

       本代码是采用MMU的重定向功能的,将内存基址映射为0.MMU引入了存储保护机制,增强系统安全性

     

    按键中断示例代码:

     

    代码
    #include "S3C244x.h"
    #include
    "UART.h"
    #include
    "Global.h"
    #include
    "MMU.h"

    /******************************************************
    *文件名称:PORTInit
    *输 入:无
    *输 出:无
    *功能说明:I/O初始化
    ******************************************************
    */
    void PORTInit(void)
    {

    rGPACON
    = 0x7fffff;
    rGPDCON
    = 0xaaaaaaaa;
    rGPDUP
    = 0xffff; // The pull up function is disabled GPD[15:0]
    rGPECON = 0xaaaaaaaa;
    rGPEUP
    = 0xffff;

    rGPFUP
    = 0xff;

    rGPGCON
    = 0xFD000000;
    rGPGUP
    = 0xffff;

    rGPHCON
    = 0x02faaa;

    rGPHUP
    = 0x7ff;

    rEXTINT0
    = 0x22222222; // EINT[7:0]
    rEXTINT1 = 0x22222222; // EINT[15:8]
    rEXTINT2 = 0x22222222; // EINT[23:16]

    }
    /******************************************************
    *文件名称:KEYISR
    *输 入:无
    *输 出:无
    *功能说明:按键中断服务程序
    ******************************************************
    */
    void __irq KEYISR(void)
    {
    UINT32 r;

    EnterCritical(
    &r);

    DelayNus(
    500000);
    if(rINTPND==BIT_EINT8_23)
    {
    ClearPending(BIT_EINT8_23);

    if(rEINTPEND&(1<<8))
    {
    DEBUGMSG(
    "eint8\n");
    rEINTPEND
    |= 1<< 8;
    }
    if(rEINTPEND&(1<<11))
    {
    DEBUGMSG(
    "eint11\n");
    rEINTPEND
    |= 1<< 11;
    }
    if(rEINTPEND&(1<<13))
    {
    DEBUGMSG(
    "eint13\n");
    rEINTPEND
    |= 1<< 13;
    }
    if(rEINTPEND&(1<<14))
    {
    DEBUGMSG(
    "eint14\n");
    rEINTPEND
    |= 1<< 14;
    }
    if(rEINTPEND&(1<<15)) {
    DEBUGMSG(
    "eint15\n");
    rEINTPEND
    |= 1<< 15;
    }
    if(rEINTPEND&(1<<19)) {
    DEBUGMSG(
    "eint19\n");
    rEINTPEND
    |= 1<< 19;
    }
    }

    ExitCritical(
    &r);
    }
    /******************************************************
    *文件名称:KEYScanTest
    *输 入:无
    *输 出:无
    *功能说明:按键扫描测试
    ******************************************************
    */
    void KEYScanTest(void)
    {
    rGPGCON
    = rGPGCON & (~((3<<22)|(3<<6)|(3<<0)|(3<<10)|(3<<12)|(3<<14))) |
    ((
    2<<22)|(2<<6)|(2<<0)|(2<<10)|(2<<12)|(2<<14)) ; //GPG11,3 set EINT

    rEXTINT1
    &= ~(7|(7<<0));
    rEXTINT1
    |= (0|(0<<0)); //set eint8 falling edge int

    rEXTINT1
    &= ~(7<<12);
    rEXTINT1
    |= (0<<12); //set eint11 falling edge int

    rEXTINT1
    &= ~(7<<20);
    rEXTINT1
    |= (0<<20); //set eint13 falling edge int

    rEXTINT1
    &= ~(7<<24);
    rEXTINT1
    |= (0<<24); //set eint14 falling edge int

    rEXTINT1
    &= ~(7<<28);
    rEXTINT1
    |= (0<<28); //set eint15 falling edge int

    rEXTINT2
    &= ~(0xf<<12);
    rEXTINT2
    |= (0<<12); //set eint19 falling edge int


    rEINTPEND
    |= (1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19); //clear eint 11,19
    rEINTMASK &= ~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19)); //enable eint11,19
    ClearPending(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);
    pISR_EINT0
    = pISR_EINT2 = pISR_EINT8_23 = (U32)KEYISR;
    EnableIrq(BIT_EINT0
    |BIT_EINT2|BIT_EINT8_23);
    }
    /******************************************************
    *文件名称:Main
    *输 入:无
    *输 出:无
    *功能说明:函数主体
    ******************************************************
    */
    int Main(void)
    {

    MMUInit();
    //IRQDisable();
    IRQEnable();

    /*
    大家可以尝试通过使能MMU观察中断是否能够正常响应
    */
    MMUEnableICache();
    MMUEnableDCache();


    PORTInit();
    //IO口一定要初始化,否则串口不能正常工作
    rINTMOD=0x0; //所有为IRQ模式
    rINTMSK=BIT_ALLMSK; //屏蔽所有中断
    UARTInit(S3C2440PCLK,115200);

    DEBUGMSG(
    "\r\n\r\nKey Interrupt Test\r\n");
    KEYScanTest();

    while(1);

    return 0;
    }
  • 相关阅读:
    YYHSOI模拟赛题解(T6围栏问题)
    取水
    Spring.Net实现跨数据库服务层事务管理
    使用node.js + jsonserver + mock.js 搭建本地开发mock数据服务
    [转]SQL SERVER整理索引碎片测试
    asp.net mvc 安全测试漏洞 " HTTP 动词篡改的认证旁路" 问题解决
    JavaScript中子类调用父类方法的实现
    asp.net mvc 安全测试漏洞 "跨站点请求伪造" 问题解决
    C#学习记录3下——类的封装,继承,多态
    C#学习记录8——XAML
  • 原文地址:https://www.cnblogs.com/wenziqi/p/1769414.html
Copyright © 2020-2023  润新知