S3C44B0 调试笔记(1)

合集下载

ARM7(sc44b0)外部中断笔记

ARM7(sc44b0)外部中断笔记

ARM7(sc44b0)外部中断笔记对于sc44b0它也是一种单片机,一种比较高级的单片机而已,所以他也跟51单片机一样有外部中断,不同51单片机的是,他有8个外部中断源,对应的是8个管脚,(51只有两个,int0和int1,P3.3和P3.4),分别是Port G八个管脚。

而对于外部中断4 \5\6\7很多都是共用寄存器,他们是通过或逻辑公用一个中断请求线。

下面就具体来说说使用外部中断的一些必要的配置。

一,对管脚的配置,因为Port G有三种功能用法,要通过对rPCONG(端口G配置寄存器)的配置来选用Port G的外部中断的功能。

其配置表如下所以应该将其配置为11(设置为中断功能状态);二,中断模式的选择,中断模式有两种,FIQ(快速中断模式)和 IRQ(中断模式)两种,一般没有特殊要求都用IRQ模式即可。

可以通过对中断模式寄存器rINTMOD配置获得。

如表下三,是否允许中断,即中断使能位。

通过对中断控制寄存器INTCON的配置即可,如表下通过对中断控制寄存器的配置即可,可以看出只要让intcon的【1】位置零即可使中断使能。

四,外部中断方式的选择,低电平或上升沿触发呢,还是别的,这就要对外部中断方式寄存器(EXTINT)的配置,其表如下由上表可知,如果要用下降沿触发,就可将EXTINT 的值给0x22222222;将所有的外部中断都设置为下降沿触发。

五,当中断捕抓到以后,要引起什么变化呢?或者说用什么来捕抓呢?在sc44b0中用了两个寄存器来捕抓,一个中断挂起寄存器(INTPND),和外部中断挂起寄存器(EXINTPND),一开始不明白挂起是什么意思,后来才懂,差不多就相当与51单片机的标志位一样,当中断发生后,就将挂起寄存器的对应的某一位置一或置零,外部中断挂起寄存器如表下中断挂起寄存器:当中断产生后,是将INTPND的【21】位置一的;所以,判断有无外部中断,就可以通过读取挂起寄存器对应的为,即可知道是否有无中断。

S3C44B0的初始化程序的理解

S3C44B0的初始化程序的理解

S3C44B0的初始化程序的理解S3C44B0的初始化程序就是初始化各个关键的寄存器,建立中断向量,然后转移到主函数去执行程序。

不过S3C44B0不支持地址映射,所以程序不COPY到RAM种执行。

S3C44B0初始化对我们广大初学者来说,比较难理解的是中断的处理和一些少见的操作符号,S3C44B0的中断子程序地址存放在初始化程序最后就是HandleADC # 4HandleRTC # 4HandleUTXD1 # 4HandleUTXD0 # 4HandleSIO # 4HandleIIC # 4HandleURXD1 # 4HandleURXD0 # 4这一段,它的其实地址是ISR_STARTADDRESS,个人写中断程序的时候,子程序地址被编译器连放在相应的位置。

初始化完成后,程序转通过BL Main 转到用户定义的主程序上执行。

以下是我个人的一些理解,有错误的地方希望大家指出来。

GBLL THUMBCODE[ {CONFIG} = 16THUMBCODE SETL {TRUE}CODE32|THUMBCODE SETL {FALSE}][ THUMBCODECODE32 ;for start-up code for Thumb mode]×××××××××××&ti mes;××××××××××&times ;其中[=IF ,|=ELSE ,]= ENDIF, CODE32 表明一下操作都在ARM状态。

S3C44B0 中文手册汇编

S3C44B0 中文手册汇编

1产品预览介绍三星的S3C44B0X 16/32位RISC处理器被设计来为手持设备等提供一个低成本高性能的方案。

S3C44B0X提供以下配置:2.5V ARM7TDMI 内核带有8Kcache ;可选的internal SRAM;LCD Controller(最大支持256色STN,使用LCD专用DMA);2-ch UART with handshake(IrDA1.0, 16-byte FIFO) / 1-ch SIO;2-ch general DMAs / 2-ch peripheral DMAs with external request pins;External memory controller (chip select logic, FP/ EDO/SDRAM controller); 5-ch PWM timers & 1-ch internal timer;Watch Dog Timer;71 general purpose I/O ports / 8-ch external interrupt source;RTC with calendar function;8-ch 10-bit ADC;1-ch multi-master IIC-BUS controller;1-ch IIS-BUS controller;Sync. SIO interface and On-chip clock generator with PLL.。

S3C44B0X采用一种新的三星ARM CPU嵌入总线结构-SAMBA2,最大达66MHZ。

电源管理支持:Normal, Slow, Idle, and Stop mode。

系统管理功能:1 Little/Big endian support.2 Address space: 32Mbytes per each bank. (Total 256Mbyte)3 Supports programmable 8/16/32-bit data bus width for each bank.4 Fixed bank start address and programmable bank size for 7 banks.5 . 8 memory banks.- 6 memory banks for ROM, SRAM etc.- 2 memory banks for ROM/SRAM/DRAM(Fast Page, EDO, and Synchronous DRAM)6. Fully Programmable access cycles for all memory banks.7 Supports external wait signal to expend the bus cycle.8. Supports self-refresh mode in DRAM/SDRAM for power-down.9. Supports asymmetric/symmetric address of DRAM.Cache 和内部存储器功能:• 4-way set associative ID(Unified)-cache with 8Kbyte.• The 0/4/8 Kbytes internal SRAM using unused cache memory.• Pseudo LRU(Least Recently Used) Replace Algorithm.• Write through policy to maintain the coherence between main memory and cache content.• Write buffer with four depth.• Request data first fill technique when cache miss occurs.时钟和电源管理• Low power• The on-chip PLL makes the clock for operating MCU at maximum 66MHz.• Clock can be fed selectively to each function block by software.• Power mode: Normal, Slow, Idle and Stop mode.Normal mode: Normal operating mode.Slow mode: Low frequency clock without PLLIdle mode: Stop the clock for only CPUStop mode: All clocks are stopped• Wake up by EINT[7:0] or RTC alarm interrupt fromidle mode.中断控制器• 30 Interrupt sources( Watch-dog timer, 6 Timer, 6 UART, 8 External interrupts, 4 DMA , 2 RTC, 1 ADC, 1 IIC, 1 SIO )• Vectored IRQ interrupt mode to reduce interrupt latency.• Level/edge mode on the external interrupt sources• Programmable polarity of edge and level• Supports FIQ (Fast Interrupt request) for very urgent interrupt request定时器功能• 5-ch 16-bit Timer with PWM / 1-ch 16-bit internal timer with DMA-based or interrupt-based operation• Programmable duty cycle, frequency, and polarity• Dead-zone generation.• Supports external clock source.RTC 功能:• Full clock feature: msec, sec, min, hour, day,week, month, year.• 32.768 KHz operation.• Alarm interrupt for CPU wake-up.• Time tick interrupt通用输入输出口功能:• 8 external interrupt ports• 71 multiplexed input/output portsUART 功能:• 2-channel UART with DMA-based or interrupt-based operation• Supports 5-bit, 6-bit, 7-bit, or 8-bit serial data transmit/receive• Supports H/W handshaking during transmit/receive• Programmable baud rate• Supports IrDA 1.0 (115.2kbps)• Loop back mode for testing• Each channel have two internal 32-byte FIFO for Rx and Tx.DMA控制器功能:• 2 channel general purpose Direct Memory Access controller without CPU intervention.• 2 channel Bridge DMA (peripheral DMA) controller.• Support IO to memory, memory to IO, IO to IO with the Bridge DMA which has 6 type's DMA requestor: Software, 4 internal function blocks (UART, SIO, Timer, IIS), andExternal pins.• Programmable priority order between DMAs (fixed or round-robin mode)• Burst transfer mode to enhance the transfer rate on the FPDRAM, EDODRAM and SDRAM.• Supports fly-by mode on the memory to external device and external device to memory t ransfer modeA/D 转换器:• 8-ch multiplexed ADC.• Max. 100KSPS/10-bit.LCD控制器:• Supports color/monochrome/gray LCD panel• Supports single scan and dual scan displays• Supports virtual screen function• System memory is used as display memory• Dedicated DMA for fetching image data from system memory• Programmable screen size• Gray level: 16 gray levels• 256 Color levels看门狗定时器:• 16-bit Watchdog Timer• Interrupt request or system reset at time-outIIC-BUS 接口• 1-ch Multi-Master IIC-Bus with interrupt-based operation.• Serial, 8-bit oriented, bi-directional data transfers can be made at up to 100 Kbit/s in the standard mode or up to 400 Kbit/s in the fast mode.IIS-BUS接口• 1-ch IIS-bus for audio interface with DMA-based operation.• Serial, 8/16bit per channel data transfers• Supports MSB-justified data formatSIO (同步串口):• 1-ch SIO with DMA-based or interrupt –based operation.• Programmable baud rates.• Supports serial data transmit/receive operations 8-bit in SIO.操作电压范围:• 核电压 : 2.5V I/O电压: 3.0 V to 3.6 V工作频率:• Up to 66 MHz封装:• 160 LQFP / 160 FBGA2管脚描述om[1:0]: 输入 om[1:0]设置S3C44B0X在测试模式和确定nGCS0的总线宽度,逻辑电平在复位期间由这些管脚的上拉下拉电阻确定.00:8-bit 01:16-bit 10:32-bit 11:Test modeADDR[24:0] 输出: 地址总线输出相应段的存储器地址.DATA[31:0] 输入输出:数据总线,总线宽度可编程为8/16/32 位nGCS[7:0] 输出:芯片选择,当存储器地址在相应段的地址区域时被激活.存取周期和段尺寸可编程.nWE 输出:写允许信号,指示当前的总线周期为写周期.nWBE[3:0] 输出: 写字节允许信号nBE[3:0] 输出:在使用SRAM情况下字节允许信号.nOE输出:读允许信号,指示当前的总线周期为读周期.nXBREQ 输入: nXBREQ 总线控制请求信号,允许另一个总线控制器请求控制本地总线,nXBACK信号激活指示已经得到总线控制权。

ARM开发板S3C44B0使用指南

ARM开发板S3C44B0使用指南

ARM开发板S3C44B0使用指南
一、关于开发板
S3C44B0是一款功能齐全的高性能ARM处理器开发板,采用ARM9内核,主频为80MHz,具备有256KBROM、32KBIRAM、128KBSRAM,其中
32KBIRAM处理器内部维持缓存,128KBSRAM处理器外部维持缓存。

它可以
简化开发过程,使用户易于掌握和熟悉该处理器的硬件结构,支持快速实
现功能。

二、开发板资源
1、主要开发板资源:
1.1、主处理器:ARM9处理器,主频80MHz。

1.2、存储器:256KBROM,32KBIRAM,128KBSRAM。

1.3、外设接口:UART,SPI,I2C,ADC,PWM,GPIO。

1.4、数字I/O端口:2个数字I/O口。

1.5、系统接口:JTAG系统接口支持调试,主频输入/输出(SIO),
复位输入/输出(RST),电源输入/输出(VIN),使能输入/输出(EN)。

1.6、外设接口:摄像头接口,LCD接口,USB,PS/2,SD卡接口,串
口打印机接口,外部存储器接口,外部中断接口,外部接口
(EINT0/EINT1/I2S)。

2、典型应用:
2.1、工业控制:采用S3C44B0的工业控制系统,可方便地实现复杂
的控制逻辑,实现连续的控制,获得快速、可靠的控制效果;
2.2、消息控制:采用S3C44B0的消息控制系统,可实现信息的广播、多用户聊天等;
2.3、办公设备:采用S3C44B0的设备。

S3C44B0功能模块

S3C44B0功能模块

输入输出参数
输入电压范围:3.3V或5V
输入频率范围:0-24MHz
添加标题
添加标题
输出电压范围:0-3.3V或0-5V
添加标题
添加标题
输出频率范围:0-24MHz
通信接口参数
UART:支持异步串行通信
SPI:支持同步串行外设接口
添加标题
添加标题
I2C:支持半双工同步串行通信
添加标题
添加标题
IrDA:支持红外通信
实际应用效果
嵌入式系统开发板 智能家居控制系统 工业自动化设备 医疗仪器仪表
应用经验分享
案例一:S3C44B0在智能 家居中的应用
案例二:S3C44B0在工业 控制中的应用
案例三:S3C44B0在医疗 设备中的应用
案例四:S3C44B0在智能 交通中的应用
07
S3C44B0模块发展与 展望
技术发展趋势
环境参数
工作温度范围:40℃~85℃
存储温度范围:50℃~100℃
湿度范围能力:符合 EIA RS-485标准
05
S3C44B0模块编程与 配置
编程语言与工具链
支持的语言:C、汇编 工具链:编译器、链接器、调试器 开发环境:Keil、SDT等 编程步骤:编写代码、编译、链接、调试
市场需求:随着物联网、智能家居等领域的快速发展,S3C44B0模块的市场需求持续增长。
技术创新:未来S3C44B0模块将不断进行技术创新,提高性能、降低成本,进一步拓展应用 领域。
竞争格局:市场竞争激烈,未来S3C44B0模块企业需要不断提高产品质量、降低成本,并积 极开拓新市场。
行业趋势:随着5G、AI等技术的普及,S3C44B0模块将迎来更多的发展机遇,未来市场前 景广阔。

基于S3C44BOX数模转换器的系统调试

基于S3C44BOX数模转换器的系统调试

基于S3C44BOX数模转换器的系统调试作者:朱璇,黄国开,源艳芬,孙周军来源:《科技资讯》 2011年第13期朱璇1 黄国开2 源艳芬1 孙周军1(1.广东省气象信息中心; 2.广东省防雷中心广州 510080)摘要:本章详细介绍了ARMSys的开发仿真调试过程。

介绍了BIOS的使用方法。

在SDT2.5下,利用一个简易的并口转JTAG口电路模块实现代码的下载与调试。

关键词:嵌入式 A/D数模转换 S3C44B0X SDT2.51中图分类号:O242 文献标识码:A 文章编号:1672-3791(2011)05(a)-0091-03嵌入式系统的应用日益广泛,可以说无处不在[1]。

完成S3C44B0X内部8路模拟信号输入的10位模/数转换器(ADC)的功能和逐次逼近式ADC的硬件电路和系统软件的编写及编译工作之后,就做硬件准备,然后在主机上运行JTAG.exe程序,通过设置ADW,开始进行系统的总体调试。

本论文主要介绍基于S3C44B0X的数模转换器的系统调试过程。

1 硬件准备在调试之前,如图1所示,先用并口电缆将PC机和ARM-Sys上的JTAG Module(模块)连接起来,用串口电缆将ARMSys核心板的UART0口和PC机连接起来。

连接好串、并口电缆线之后,就可以上电了。

电源打开之后,看到红色发光管点亮后熄灭,说明核心板启动正常。

此时JATG模块上只有指示电源的红灯点亮,说明并口已经连接好了。

2 超级终端超级终端是windows自带的一个串口调试工具,其使用较为简单,被广泛使用在串口设备的初级调试上。

超级终端是一个通用的串行交互软件,很多嵌入式应用的系统有与之交换的相应程序,通过这些程序,可以通过超级终端与嵌入式系统交互,使超级终端成为嵌入式系统的“显示器”。

在Windows操作系统下,选择“开始|程序|附件|通讯|超级终端”,建立一个超级终端项目,并命名为“ADCtest”。

按连接的串口进行相应设置:波特率:115200,数据位:8位,无奇偶校验,停止位:1位;数据流控制:无。

s3c44b0x主板启动用到的代码分析

s3c44b0x主板启动用到的代码分析

s3c44b0x主板启动用到的代码分析s3c44b0x主板启动用到的代码分析一首先从cpu/s3c44b0/start.S这个文件开始执行,这个文件主要作以下几点:1 设置处理器的工作模式。

2 初始化中断向量。

3 关闭看门狗功能。

4 允许timer5的中断(时钟中断)。

5 允许IRQ中断,进制FIQ中断。

6 设置时钟控制寄存器控制CPU的主频。

根据我自己的开发板进行了设置。

(下面介绍了时钟主频的计算公式)。

7 调用board/<your.board>/lowlevel.S对存储器进行初始化。

这个文件主要是根据开发板设置每个存储器的BANK。

我修改了这个文件使其支持我的开发板。

8 将ROM中的U-BOOT代码拷贝到RAM中。

并在RAM中设置好中断向量表。

9 设置堆栈。

10 跳到lib_arm/board.c中执行start_armboot.二执行lib_arm/board.c中的start_armboot,主要完成一下工作:1 调用cpu/<your.board>/cpu.c中的cpu_init()来刷新所有cache,将0x00000000~0x0c000000区设为非cache区。

并使用全部8K空间作为cache。

总线优先级为默认优先级。

2 调用board/<your.board>/<your.board>.c中的board_init()根据具体的开发板对PORT进行设置。

我修改这个文件使其支持我的开发板。

3 调用cpu/s3c44b0/interrupts.c 中的interrupt_init()初始化Timer1定时器使其在指定时间产生中断。

4 根据include/configs/<your.board>.h配置文件中(CFG_ENV_IS_IN_<*>)环境变量保存位置选项来调用common/env_*.c对应文件中的env_init()。

uClinux port to S3C44B0X 心得

uClinux port to S3C44B0X 心得

硬件其实可以根据你的配置在BIOS中设置好,当然用自启动版可以在解压缩前设置好。

在好几个坛子上面看到大家对uC的讨论热火朝天,但差不多都是基于4510开发板的,而基于44B0的好象很少,并且不象4510的那样成熟和清晰。

可能和4510主要是网络应用有关吧,它可以充分利用uC的网络功能。

如果在44B0上加入uC,也可以体验一下这个操作系统,再加入往卡驱动的话,也能实现网络哦!记得以前在ARM开发论坛看到一位高人写过在44B0的uC上加网卡驱动的文章,想做这个的兄弟可以去找找。

我手头有4510和44B0的板子各一块,4510是代博的,上面带的uC挺好用。

于是想在44B0上也跑跑uC,两周前我调通了8019后觉得条件差不多了,因为uC的IMAGE.RAM是非压缩的,有1M多,调试的时候如果不用到网络下载的话会很慢,即使用串口调到115.2K也要几分钟时间,而且可靠性也较低,所以有网卡芯片是移植的一个重要条件,当然有USB通讯的话也很快,不过我的板那块坏了,并考虑到以后会用到网络,还是用8019吧。

从我有板开始我就一直找可用于44B0的uC,并下载过TPU兄的源文件,上次看到TPU兄的留言可帮忙移植就马上留言联系,后来通过一封MAIL好象就没消息了,只好自己摸索着做做,所以我的移植过程可能存在很多不对的地方,大家一起参考修正.开始我想跑跑TPU的ZIMAGE,这是一个压缩后的文件,运行时需要自解压,查到它的起始运行地址是0XC300 000,KENERL运行地址是0XC008000,用自己的BIOS将数据DOWN到设定地,再RUN,运行出现结果了,开始是些乱码,调了一下串口速率,在38400,显示UCOMPRESS KERNEL...不过到START KERNEL后,再没下文了,于是用AXD反汇编调试,发现是因为进入KERNEL后没找到PROCESSER ID而停掉,可能是要在BIOS中传递过去。

后来想到一个办法,把我现在在4510板上跑的uC改动后移植到44B0上,在那一版上大家对uC的应用都做得比较熟了,编起来也比较方便。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

S3C44B0 调试笔记——BIOS部分由于调试耗费了我太多时间,所以记录下来,方便以后复习,同时也希望能给初学者一点儿启示,大家少走弯路。

我是去年开始听说ARM的,可能是本人太闭塞了吧。

看到后就有一种想玩的冲动,想从51升级ARM。

网上都说44B0比较适合初学者。

机缘巧合,21ic上看到有人叫卖44B0空板,很便宜100RMB,主板加简易JTAG小板。

做研发的都穷啊。

还不错,钱汇过去,板子第3天就回来了,就是网上流行的那个44B0 PCB。

贴个图吧,随便找了块和我那块板子一模一样的:(FIGURE - 1)拿到板子挺高兴的,检查了一下线路没问题。

就按对方提供的BOM单采购元器件。

先把电源部分焊上,测量没问题,再把必要的元器件焊上(CPU、SDRAM、FLASH、UART),同时还有JTAG小板。

量电源和地没有短路,上电!电源灯亮了,没冒烟。

下面一步就是把BIOS程序烧写到FLASH上了,对方提供的是FLUTED,按照说明操作,烧录失败!这下傻了,最怕的就是这个,对于一个初学者来说,简直是灭顶之灾啊。

首先怀疑CPU或FLSH是否虚焊,我的焊接水平一般,所以很值得怀疑,只好又搪了一遍。

但问题依旧。

又怀疑JTAG小板,仔细检查了一下没问题啊,跳线插插拔拔的也没无济于事。

怀疑并口,重启进BIOS,并口设置也没问题。

当天是没办法了,睡觉吧。

第二天就开始联系供应商,寻求帮助,但没什么结果。

也是,就100块钱,还要什么服务啊。

只好自己找问题,看到原理图上FLASH用的是SST 39VF160 ,我记得我的不一样啊?我的BOM上写的是AM29LV160,我又询问了供应商,他确认了一下说他的BOM写错了。

狂晕啊。

不过还好,终于找到问题了,但换FLASH还得周末去买啊,等不及了,看看这个能不能凑合用吧,改FLUTED的FCD文件,就是根目录那个DEFAULT.FCD。

找到2块FLASH的Datasheet对比着改,连改带调,2个晚上,终于烧录成功了。

拔下JTAG,接上串口,打开超级终端。

复位,一堆乱码,我想应该差不多了,试着更改超级终端的设置。

终于成功了,我看到BIOS的提示信息了,敲个help进去,出来一堆,当时感觉好爽,这个程序做的不错,和DOS一个感觉了,哈哈。

然后焊上网络部分,输入ap,可以ping通,网络基本正常。

随后就是下载uClinux了,按照供应商的说明文档,先把程序从0地址拷贝到0x1f0000,我运行copy命令,程序复位。

重试,依旧。

第一个想法就是,BIOS内部程序擦写FLASH的函数和我的芯片不兼容,无奈,只好对比着两块FLASH的Datasheet修改BIOS程序。

调试了一个多礼拜,依旧。

这下彻底崩溃了,感觉程序应该没有问题了。

最终不得不放弃,只好换芯片,把AM29LV160换成了SST39VF160。

用最初的BIOS,但现象还是依旧,这可是怎么回是啊?仔细想了一下,会不会因为程序代码在FLASH里,而我又去擦除和写FLASH导致的系统崩溃?擦写FLASH的底层源码都有End-Detection, 例如擦Sector的BIOS源码,在发送完命令字后,有如下一段代码进行判断:while(1){U16 i;i = *((volatile U16 *)sector)&0x40;if(i!=*((volatile U16 *)sector)&0x40) //D6 == D6continue;if(*((volatile U16 *)sector)&0x80)break; //D7 == 1}(CODE - 1)用了2种方法判断擦除操作是否成功,看芯片资料,在这个时候,你去读FLASH那个扇区地址的话,会得到擦除是否成功的信息,而不是得到那个扇区号所对应绝对地址的数据!也就是说在这个时候去读特定地址sector会出错,那么是不是必须在擦写操作完成后,CPU才能取指,运行程序代码?对于我的这块板子,我感觉是这样的。

因为它总是会DOWN在这里。

但以前碰到过其他CPU,可以在同一块FLASH存储程序,同时程序又可以擦写这块FLASH 的情况。

这种区别会不会是不同FLASH型号造成的?期待指点。

结论:S3C44B0的FLASH (39VF160)不能在自身运行程序的同时,对自己进行擦写操作。

那BIOS的源码有问题了,我该怎么做?看来现在只能把BIOS从Flash里copy到SDRAM中才行。

用move命令实现copy:move 0 0xc000000 10000。

但当我run 0xc000000 时,程序重启,为了确认程序是从哪里执行的,我写了一个读pc命令rdpc(见CODE - 2)。

读出的pc值是0x41c4,显然,程序是从0地址重启了。

这里又让人糊涂了,怎么又重启了呢?想不通了,这个疑问留在了这里,当时没有解决,后来拐了个弯才发现了问题。

int ReadPC(int argc, char *argv[]){U32 i;U16 j,k;__asm{mov i,R15}j=i/0x10000;k=i%0x10000;printf("PC V alue = 0x%x \n",i);printf("PC V alue = %d - %d \n" ,j,k);__asm{MRS i,CPSR}j=i/0x10000;k=i%0x10000;printf("CPSR V alue = 0x%x \n",i);printf("CPSR V alue = %d - %d \n" ,j,k);return 0;}(CODE - 2)我又仔细看看供应商的说明文档,需要先把BIOS代码copy到0x1f0000,然后把uClinx 的ROM文件下载到0xc000000位置运行。

怎样才能把BIOS程序从0地址搬移到0x1f0000?决定还用FLUTED,先把0地址的数据擦除,然后把初始地址设成2031616(FLUTED用十进制),烧录成功,但不能启动。

是不是因为程序从0地址进入,但不能执行到0x1f0000?可是我把前面的flash都擦了啊,都是0xff,程序应该可以跑到这里啊?看情况肯定是程序指针没有到0x1f0000了。

搞不定了,这里耽误了一些时间,不过后来还是从BIOS的源码找到了突破口,我注意到了Prog命令,这段代码让人很费解了:#define __ROM_SIZE 0x200000#define BIOS_BASE (__ROM_SIZE-0x10000)#define BIOS_LOAD (__ROM_SIZE-4)if(argc>4)if(strncmp(argv[4], "-no0", 4)==0)overwrite0 = 0;if((prog_begin==0)&&overwrite0){unsigned int ins;ins = *(unsigned int *)data_begin;if((ins>>24)==0xea) // instruction: b xxxx, now just support b instruction!!!bios_load_addr = ((ins&0xffffff)<<2)+8;elsebios_load_addr = 4; // other instruction, jump to 4bios_load_addr = (bios_load_addr-BIOS_LOAD-8)/4;bios_load_addr = (bios_load_addr&0xffffff)|0xea000000;*(unsigned int *)data_begin = 0xea000000+(BIOS_BASE-8)/4;modify_a0 = 1;}(CODE - 3)仔细分析了一下,程序的意思就是在你烧录0地址的时候,如果不选-no0参数,那么程序将会把0位置的数据通过计算转换成跳转指令的汇编码(0xeaxxxxxx)。

替换成pc跳转到BIOS_BASE(0x200000-0x10000=0x1f0000)的指令,终于对上号了。

*(unsigned int *)data_begin = 0xea000000+(BIOS_BASE-8)/4; arm指令是32位的,所以除4,-8是因为3级流水线,如过这里不清楚的话,建议直接从ADS里看b指令的汇编码。

这下搞懂了,我就在BIOS里调用了prog函数,随便烧了几个字节到0地址。

读出来看0~4分别是0xfe 0xbf 0x07 0xea。

汇编码是:0xea07bffe。

,0x7bffe是指跳转的指令数。

arm是3级流水线,即pc为取指指针,pc-1是译码指针,pc-2是执行指针。

程序复位,从地址0开始执行,跳转0x7bffe条指令。

我们算一下,(0x7bffe+2)×4 =0x1f0000,也就是说,程序跳转到了0x1f0000。

(FIGURE - 2)顺便提一下,我的BIOS里加的读函数,读指定地址的数据。

int ReadData(int argc, char *argv[]){int addr, size,i;if(argc<3){puts("Please enter move addr size\naddr = read addr, size = read size\n");return -1;}addr = strtoul(argv[1]);size = strtoul(argv[2]);if(addr==-1||size==-1){puts("Parameter error\n");return -1;}if(size>0x1000){puts("Parameter error, size must less than 1000(in hex)\n");return -1;}printf(" Address Data \n");for(i=0;i<size/2;i++){printf(" %x %x \n", addr+2*i,*((unsigned short *)addr+i));}return 0;}(CODE - 4)板子复位,居然还是没有反映。

郁闷啊。

又怎么了呢?想吧。

一时间真的搞不懂了。

后来看了一些关于ads编译的资料,发现原来RO、RW和ZI还有文章。

相关文档
最新文档