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 轮询方式;