fs2410调试笔记

Fs2410调试笔记

FS2410开发板基本情况:Norflash:2M字节,地址0x0000 0000 ------0x0020 0000

                       内存:64M字节, 地址0x3000 0000------0x3400 0000

在nor flash的0x0000 0000已经有引导程序u-boot,所以采用它进行引导,超级终端通过串口输出和控制,u-boot 启动以后通过命令tftp将应用程序加载到0x3010 0000,然后使用命令go 0x3010 0000 启动应用程序。应用程序也有一段自己的引导程序,以下是对引导程序的配置。

一.中断调试

中断向量映射有两个地址0x0000 0000和0xffff 0000。由于以下引导程序被

ResetEntry

       b     ResetHandler 

    b     HandlerUndef ;handler for Undefined mode

       b     HandlerSWI   ;handler for SWI interrupt

       b     HandlerPabort ;handler for PAbort

       b     HandlerDabort       ;handler for DAbort

       b     .             ;reserved

       b     HandlerIRQ    ;handler for IRQ interrupt

       b     HandlerFIQ    ;handler for FIQ interrupt

 

加载到0x3010 0000,所以实际上ResetEntry是处在0x3010 0000,所以当中断发生时,不管是0x0000 0000,还是0xffff 0000都无法跳转到0x3010 0000; 所以采用MMU虚拟内存映射的方式,将地址0x0000 0000 -------0x00200000映射到0x3010 0000;当中断发生时实际执行0x3010 0000向量处的代码,实现跳转。

 

定义如下的数据地址:

AREA RamData, DATA, READWRITE

       ^   _ISR_STARTADDRESS

HandleReset   #   4

HandleUndef #   4

HandleSWI        #   4

HandlePabort    #   4

HandleDabort    #   4

HandleReserved  #   4

HandleIRQ         #   4

HandleFIQ         #   4

 

SDRAM_END                     EQU       0x33000000     

_ISR_STARTADDRESS       EQU (SDRAM_END-0x1000)

pISR_RESET     EQU (_ISR_STARTADDRESS+0x0)

pISR_UNDEF     EQU (_ISR_STARTADDRESS+0x4)

pISR_SWI       EQU (_ISR_STARTADDRESS+0x8)

pISR_PABORT    EQU (_ISR_STARTADDRESS+0xc)

pISR_DABORT    EQU (_ISR_STARTADDRESS+0x10)

pISR_RESERVED  EQU (_ISR_STARTADDRESS+0x14)

pISR_IRQ       EQU (_ISR_STARTADDRESS+0x18)

pISR_FIQ       EQU (_ISR_STARTADDRESS+0x1c)

 

只要配置类似pISR_RESET

            pISR_IRQ的函数,即可实现中断函数的安装,

pISR_IRQ =(U32)HaltIrq;

 

二.虚拟内存映射

2.1虚拟内存映射要解决的一个问题时上文的中断映射问题,刚开始考虑采用高端地址    0xffff 0000,设置协处理器

 

R1_V   EQU (1<<13)

 

;void MMU_EnableHighInterrupt(void) ;

EXPORT MMU_EnableHighInterrupt

MMU_EnableHighInterrupt

  mrc p15,0,r0,c1,c0,0

  orr r0,r0,#R1_V

  mcr p15,0,r0,c1,c0,0

  MOV_PC_LR

 

但是内存映射问题解决不了。最后采用映射低端地址。

2.2MMU映射基地址:

SDRAM_END                     EQU       0x33000000  

#define _MMUTT_STARTADDRESS          (SDRAM_END-0x100000)

 

;void MMU_SetTTBase(int base)

  EXPORT MMU_SetTTBase

MMU_SetTTBase

  ;ro=TTBase

  mcr p15,0,r0,c2,c0,0

  MOV_PC_LR

 

2.3MMU映射表

void MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr);

   MMU_SetMTT(0x00000000,0x07f00000,0x30100000,RW_NCNB);  //bank0

   MMU_SetMTT(0x08000000,0x0ff00000,0x08000000,RW_NCNB);  //bank1

   MMU_SetMTT(0x10000000,0x17f00000,0x10000000,RW_NCNB);//bank2

   MMU_SetMTT(0x18000000,0x1ff00000,0x18000000,RW_NCNB); //bank3

   MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_NCNB);//bank4

   MMU_SetMTT(0x28000000,0x2ff00000,0x28000000,RW_NCNB); //bank5

   

   MMU_SetMTT(0x30000000,0x30100000,0x30000000,RW_CB);       //bank6-1

   MMU_SetMTT(0x31000000,0x33e00000,0x31000000,RW_CB); //bank6-2             原来的

   MMU_SetMTT(0x33f00000,0x37f00000,0x33f00000,RW_CB);  //bank6-3          原来的

 

   MMU_SetMTT(0x38000000,0x3ff00000,0x38000000,RW_NCNB); //bank7

   MMU_SetMTT(0x40000000,0x47f00000,0x40000000,RW_NCNB);//SFR

   MMU_SetMTT(0x48000000,0x5af00000,0x48000000,RW_NCNB);

MMU_SetMTT(0x5b000000,0xfff00000,0x5b000000,RW_FAULT);//notused

 

 

voidMMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr)//page 1 M

{

    U32 *pTT;

    int i,nSec;

    pTT=(U32*)_MMUTT_STARTADDRESS+(vaddrStart>>20);

   nSec=(vaddrEnd>>20)-(vaddrStart>>20);

    for(i=0;i<=nSec;i++)*pTT++=attr|(((paddrStart>>20)+i)<<20);

}

 

三.IIC调试总结

出现的现象,超级终端乱码,重启超级终端;加入log后可以读出正确的数据,加入适当的延迟解决数据读出错误的问题。

3.1中断方式;

3.2 轮询方式;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值