Chinaunix首页 | 论坛 | 博客
  • 博客访问: 161243
  • 博文数量: 171
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 1990
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-05 10:49
文章分类

全部博文(171)

文章存档

2011年(9)

2010年(162)

我的朋友

分类: 嵌入式

2010-09-08 16:58:13

 

硬件PCB完成之后,需要首先对各个单元电路进行检测调试,这一课主要讲的就是硬件系统的调试。

一、电源、晶振及复位电路
在给PCB上电之前要确保电源供电的可靠性,排除短路问题等等。对照PCB版图找到相应的测点的位置。
在Protel99SE下,选择Tools->Preferences...(快捷键T+P)下的Show/Hide选项卡,这里可以选择隐藏一些显示,以利于观察布线,一般将覆铜(Polygons)隐藏。
在Browse PCB选项卡下可以选择查找特定的元件、节点等,直接输入元件(节点)名称选择或跳转到该元件的位置上。
按快捷键S+P在出现十字手形后单击某一条线路可以高亮显示所有与其相连的通路。按X+A取消所有选择。Shift+S可以隐藏或显示除当前层外的其他层布线。
排除了短路问题之后就可以上电测试了。使用万用表电压档依次测试一些关键节点的电压值,确保电源供电正确。晶振电路需要使用示波器观测波形。复位电路通过检测nRSTOUT引脚,在正常工作下输出为高电平,按下复位键后输出低电平。

二、检查内核
接入Multi-ICE仿真器看是否能检测到内核,如果不能检测到内核,原因可能是电源供电或晶振电路不正常,一些不能随便处理的引脚(空置时必须接高或低),仿真器接口线没有正确连接等等,相应排查各个可能出错的原因。

三、SDRAM接口电路调试
到上面那一步处理器基本可以工作了,接下来是要调试存储设备。通过AXD看是否能够正确读写SDRAM所在的位置。对于一个裸板,对应于存储器的寄存器设置是未定义的,所以要调试SDRAM存储器系统,首先应配置相关的特殊功能寄存器,使系统中的SDRAM能被正确访问。主要是BWSCON总线配置,以及各个Bank的配置寄存器BANKCONn。
这里使用三星官方提供的初始化文件ADS2410boot.ini。
打开AXD->System Views->Command Line Interface(快捷键Alt+L),
在命令行下输入obey .ADS2410boot.ini。
完成配置后打开Memory窗口,定位到SDRAM所在的地址0x30000000,数据区应显示SDRAM中的内容。
双击其中的任一数据,输入新的值,若对应的存储单元能正确显示刚才输入的数据,则表明SDRAM存储器已能正常工作。

四、Flash接口电路的调试
Flash的调试直接通过烧写软件来完成,使用sjf2410和JTAG小板将程序(如流水灯)烧入Flash,看能否正常运行程序。
这里涉及了安装GiveIO将PC并口用作普通I/O口以及sjf2410的使用。
1. 安装GiveIO驱动
1).将GIVEIO.SYS拷贝到C:WINDOWSsystem32drivers目录下。
2). 依次点击控制面板->添加硬件->下一步->是,…->下一步->添加新的硬件设备->手动从…->端口 (COM/LPT)->从磁盘安装->浏览->保存文件giveio.inf的目录->完成。安装成功后可以在设备管理器端口中看到一个名为giveio端口。
2. sjf2410的使用
在命令行下进入软件所在的目录,输入sjf2410可以看到命令行格式,依次按照提示的步骤即可以完成Flash的烧写。

五、外围电路的测试
至此,一个最小系统基本可以正常工作了,其他外围电路的测试通过使用官方的测试程序来完成。
第三课主要是分析启动代码和中断处理过程

之前有分析过44b0下的这个启动代码,差别不是非常大,今天再重新看了一遍。启动代码与Bootloader不同,主要是指进入C语言之前的汇编代码,网上都称为是bootloader的stage1,一般通用的内容包括:
1. 定义程序入口点
2. 设置异常向量表
3. 初始化存储系统
4. 初始化用户程序的执行环境
5. 初始化堆栈指针寄存器,改变处理器的模式
6. 设置FIQ/IRQ中断处理程序入口
7. 进入C程序

1)编译器选择
    GBLL     THUMBCODE
     [ {CONFIG} = 16
THUMBCODE SETL   {TRUE}
         CO
DE32
          
THUMBCODE SETL   {FALSE}
         ]
因为处理器分为16位 32位两种工作状态,程序的编译器也是分16位和32两种编译方式,所以这段程序用于根据处理器工作状态确定编译器编译方式,程序不难理解,主要解释一下符号“[        ]”的意思,上面的程序是指:
if({CONFIG} = 16 )
     { THUMBCODE SETL {TRUE}
       CODE32 }
else
       THUMBCODE SETL {FALSE}
还是没有不明白CONFIG怎么区分是16位还是32位?哪里决定它的取值?应该是编译器指定的这个值。

2)宏定义
        MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
     sub     sp,sp,#4        
     stmfd     sp!,{r0}        
     ldr      r0,=$HandleLabel
     ldr      r0,[r0]         
     str      r0,[sp,#4]      
     ldmfd    sp!,{r0,pc}    
     MEND
$HandlerLabel是宏的地址标号,HANDLER是宏名,$HandleLabel是宏的参数,$标号在宏指令展开时,标号会替换为用户定义的符号。在此后,所有遇到$HandlerLabel HANDLER $HandleLabel这种形式的表达式都会被展开成$HandlerLabel到MEND之间的函数
例如:ADC_IRQ HANDLER HandleADC即代表如下函数,语句ldr pc,=ADC_IRQ的作用也就是跳转到这个函数:
ADC_IRQ
     sub     sp,sp,#4        
     stmfd     sp!,{r0}        
     ldr      r0,=HandleADC
     ldr      r0,[r0]         
     str      r0,[sp,#4]      
     ldmfd    sp!,{r0,pc}
这段程序用于把ADC中断服务程序的首地址装载到pc中,跳转到中断处理函数,称之为“加载程序”。HandleADC是一个地址标号,它的内容就是ADC中断服务程序的地址标号,即文件最后的那个表HandleADC # 4所示,将HandleADC # 4中的4换成中断服务程序的地址标号即是,程序在这里定义了一个数据区,存放各种中断服务程序的首地址。每个字空间都有一个标号,以Handle***命名。

阅读(285) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~