IAR 2440 初步
EA2440a新手入门V4.0

一、开箱检查Sinosys-EA2440a新用户可以按照如下步骤进行开箱检测:1、对照发货清单清点配件。
2、接好配套的5V电源。
3、将FLASH选择开关打到Nand FLASH端(右边)。
4、打开电源开关。
5、出厂默认启动Windows CE 6.0系统。
6、如用户想启动Linux系统,可按照恢复到出厂设置的“烧写Linux”进行操作。
7、完成开箱检查。
上海张江高科技园区毕升路299弄3号楼202室二、如何恢复到出厂程序!!!!注意:恢复时,将完全删除Nand Flash和Nor Flash中的原有文件,取而代之的是出厂默认文件。
将Nor Flash恢复到出厂程序(一般情况下不需要将Nor Flash恢复到出厂设置) 详见光盘Tools\H-JTAG\ H-JTAG烧写NOR方法.pdf。
将Nand Flash恢复到出厂程序1、准备将实验箱“串口”、USB和PC连接好,将FLASH选择开关打到Nor Flash端(左边),打开DNW(DNW使用方法详见“ARM嵌入式系统设计及接口编程实验教程.pdf 实验四”)按空格键进入下载菜单。
2、烧写Linux系统选择[5],用USB下载光盘\6-BurnFlash\Linux 下的u-boot.bin文件。
选择[6],用USB下载光盘\6-BurnFlash\Linux 下的zImage文件。
选择[7],用USB下载光盘\6-BurnFlash\Linux 下的rootfs.cramfs文件。
3、烧写Windows CE 6.0系统。
请参照ARM & Windows CE嵌入式系统实验教程V4.0.pdf文档实验四的内容上海张江高科技园区毕升路299弄3号楼202室三、FAQs1、Q:开箱检查的时候没有正常看到WinCE系统桌面怎么办?A:这个问题一般是运输过程中震动引起核心板松动引起的。
把核心板拆下再重新安装上去即可。
2、Q:接上电源,核心板灯不亮怎么办?A:1、检查接入的电源适配器是否为5V电压输出2、检查核心板是否安装正确3、Q:Nor Flash启动方式,发现四盏流水灯不跑是什么原因?A:这种情况一般是以下两种原因造成的:1、核心板没装好2、Nor Flash程序(U2440amon.bin)没烧好4、Q:485实验不成功是什么原因?A:458的两条线没接对2、跳线没接对5、Q:LCD没有背光怎么办?A:先拿另外一块好的LCD板接上去看能否正常背光,如果没有在说明是LCD的逆变器坏了,请和我们联系更换。
RealviewMDK4.0进行2440开发快速入门

Realview MDK4.0 进行2440开发快速入门----苑臣芒(光芒)RealView MDK在中国推出已经有一段时间了,而且作为未来发展的趋势必将取代ADS1.2,成为工程师广泛应用的开发平台。
但是好多工程师还习惯于用ads环境来调试,编译,我以前也是,但毕竟ads软件已经没有技术支持了,这势必会在以后对开发工作有一定影响,ARM将Keil公司收购之后,正式推出了针对ARM微控制器的开发工具RealView Microcontroller Development Kit (简称RealView MDK 或者MDK),它将ARM开发工具RealView Development Suite(简称RVDS)的编译器RVCT与Keil的工程管理、调试仿真工具集成在一起,是一款非常强大的ARM微控制器开发工具。
所以将ads工程转成rvmdk工程势必会成为开发道路上的难题。
第一步:分析一下ads工程及环境。
这是我的工程文件,看一下ads的设置,首先是target setting选项,选择arm from elf接下来编译器选项总平台都选择arm920t,其余不需要修改。
如图其余几个编译器(c,c++)也相应都设置为arm920t,其他地方不需要动。
接下来就是关键的link选项了,最关键的是ro,这个是程序运行地址,也就是在ram的哪个地址运行,tq2440和mini2440都可以设置为0x30000000,也可以比这个数值稍微大些,看实际需要吧,我们设置为0x30000000.在option标签页中添加程序入口点,这个入口点就是主程序运行的第一条指令的地方,在2440init.s中可以找到是entry,所以这里填写“__ENTRY”接下来看lay out选项卡,设置如下:到这里,设置基本完工了,但还不能生成文件,在arm fromELF中我们选择plain binary,接可以生成与工程名字同名的bin文件了。
星S3C2440微处理器

应用实例一:嵌入式系统开发
嵌入式系统开发
星S3C2440微处理器适用于嵌入 式系统开发,其强大的处理能力 和丰富的外设接口使其成为嵌入 式领域的理想选择。
实时操作系统
星S3C2440微处理器支持实时操 作系统(RTOS)的开发,RTOS 能够提供实时任务调度和多任务 处理能力,满足实时系统的需求。
3
APB和ASB总线
APB和ASB总线用于连接低速外设,如GPIO、 UART等。
03
星S3C244ห้องสมุดไป่ตู้微处理器的指令集 架构
指令集架构概述
ARM架构
01
S3C2440微处理器采用ARM架构,属于精简指令集(RISC)的
范畴。
指令集发展历程
02
ARM架构的指令集经过多年的发展,已成为移动设备和嵌入式
指令集功能
数据处理指令
用于执行算术、逻辑、移位等基本操 作。
控制流程指令
用于控制程序的执行流程,如条件判 断、跳转等。
内存访问指令
用于读写内存和访问外部存储器。
协处理器指令
用于执行特定功能,如浮点运算、加 密等。
指令集实现方式
汇编语言
使用汇编语言编写程序,通过汇编器将汇编代码转换 为机器码。
C/C语言
星S3C2440微处理器
• 星S3C2440微处理器概述 • 星S3C2440微处理器的体系结构 • 星S3C2440微处理器的指令集架构
• 星S3C2440微处理器的编程模型 • 星S3C2440微处理器的应用实例
01
星S3C2440微处理器概述
定义与特点
定义
S3C2440是一款由三星公司开发的 ARM920T核的微处理器。
ARM--2440

最後,打開S3C2440開發平台的電源,此時,剛剛燒 進NAND FLASH的BIOS程式就會啟動執行。
嵌入式系統概論-以S3C2440核心為架構 copyright @ 許永和
6.5 用sjf2440工具將BIOS燒錄至Nor Flash
6.1 2440開發平台的配置與連接 6.2 開發平台連接至PC主機 6.3 S3C2440開發平台初步測試 6.4 BIOS 燒錄測試 6.5 用sjf2440工具將BIOS燒錄至Nor Flash
嵌入式系統概論-以S3C2440核心為架構 copyright @ 許永和
燒錄完畢後注意事項
燒錄後該做的動作
關閉電源,拔掉JTAG插頭,將J21(OM0)的JUMP接上, 將PC的UART串列介面和實驗板UART串列介面2透過 UART串列介面線連接好。 在PC主機上啟動DNW程式,設定DNW初始化動作,並執 行Connect 。
嵌入式系統概論-以S3C2440核心為架構 copyright @ 許永和
確認燒錄驅動程式安裝
圖6.30 GIVEIO驅動安裝成功畫面
先選“InStall Parallel Port Driver”欄下的“Remove” 按紐,然後再點選該項目下的“Install”按紐。 如圖6.30則顯示出“Service is installed and run”,表 示GIVEIO驅動程式已安裝成功。
實驗板相關跳線設定
啟動模式的選擇,是透過J21(OM0)跳線來決定的。
J21接上JUMP,從NAND FLASH啟動。 J21接上JUMP,從NOR FLASH啟動。
J21處於短路狀態。
出廠時實驗板的起動代碼置於NAND FLASH中。
2440中断处理文档

这个 2440test里面的中断写的向量有些隐蔽,兜了很多个圈,也难怪这么难理解,下面就对这个东西抽丝剥茧,看清楚这究竟是一个怎么样的过程。
中断向量b HandlerIRQ ;handler for IRQ interrupt很自然,因为所有的单片机都是那样,中断向量一般放在开头,用过单片机的人都会很熟悉那就不多说了。
异常服务程序这里不用中断(interrupt)而用异常(exception),毕竟中断只是异常的一种情况,呵呵下面主要分析的是“中断异常”说白了,就是我们平时单片机里面用的中断!!!所有有器件引起的中断,例如TIMER中断,UART中断,外部中断等等,都有一个统一的入口,那就是中断异常 IRQ ! 然后从IRQ的服务函数里面分辨出,当前究竟是什么中断,再跳转到相应的中断服务程序。
这样看来,ARM比单片机要复杂一些了,不过原理是不变的。
上面说的就是思路,跟着这个思路来接着分析。
HandlerIRQ 很明显是一个标号,我们找到了HandlerIRQ HANDLER HandleIRQ这里是一个宏定义,我们再找到这个宏,看他是怎么定义的:MACRO$HandlerLabel HANDLER $HandleLabel$HandlerLabelsub sp,sp,#4 ;decrement sp(to store jump address)stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to origin al address)ldr r0,=$HandleLabel ;load the address of HandleXXX to r0ldr r0,[r0] ;load the contents(service routine start address) of HandleXXXstr r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stackldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)MEND用 HandlerIRQ 将这个宏展开之后得到的结果实际是这样的HandlerIRQsub sp,sp,#4 ;decrement sp(to store jump address)stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to origin aladdress)ldr r0,=HandleIRQ ;load the address of HandleXXX to r0ldr r0,[r0] ;load the contents(service routine start address) of HandleXXXstr r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stackldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)至于具体的跳转原理下面再说好了,这样的话就容易看的多了,很明显, HandlerIRQ 还是一个标号,IRQ异常向量就是跳转到这里执行的,这里粗略看一下,应该是保存现场,然后跳转到真正的处理函数,那么很容易发现了这么一句 ldr r0,=HandleIRQ ,没错,我们又找到了一个标号 HandleIRQ ,看来真正的处理函数应该是这个 HandleIRQ ,继续寻找AREA RamData, DA TA, READWRITE^ _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00HandleReset # 4HandleUndef # 4HandleSWI # 4HandlePabort # 4HandleDabort # 4HandleReserved # 4HandleIRQ # 4最后我们发现在这里找到了 HandleIRQ ,^ 其实就是 MAP ,这段程序的意思是,从 _ISR_STARTADDRESS开始,预留一个变量,每个变量一个标号,预留的空间为 4个字节,也就是 32BIT,其实这里放的是真正的C写的处理函数的地址,说白了,就是函数指针 - -这样做的话就很灵活了接着,我们需要安装IRQ处理句柄,说白了,就是设置处理函数的地址,让PC指针可以正确的跳转。
2440裸机学习心得上

2440裸机学习心得(上)哎,以前总想裸机加系统一齐学,学着学着发现好混乱,D驱动~~然后又重新斋跑2440的裸机。
以下系少少心得,记录下学习过程。
里面有三个地方还没弄好:1、硬盘的文件系统 FAT部分(后面有空补补)2、 NORFLASH中的读写有点问题3、 USB主机中对U盘的UFI命令有什么问题欢迎一起交流。
以下是部分心得:LEDGPXCON中每两位控制一个引脚:00输入,01输出,10特殊功能初始化rGPBCON , rGPBUP , rGPBDAT三个寄存器关于ADS配置的解释:在Target Settings中的Post-linker中选择ARM fromELF,因为我们需要把ELF文件格式转化为下载到flash中所必须的二进制文件。
在Language Settings中的所有语言的Target下的Architecture or Processor,选择ARM920T,因为s3c2440是ARM920T内核。
在ARM Linker中的Output中的RO Base填写0x30000000,因为在开发板上SDRAM是从0x30000000地址开始。
在Layout中的Object/Symbol中填写2440init.o,它是启动文件的目标文件,在Section中填写Init,它是在启动文件中我们所定义的入口代码段的名称。
外部中断我们要打开某一中断的屏蔽,这样才能响应该中断,相对应的寄存器为INTMSK;还要设置外部中断的触发方式,如低电平、高电平、上升沿、下降沿等,相对应的寄存器为EXTINTn。
另外由于EINT4到EINT7共用一个中断向量,EINT8到EINT23也共用一个中断向量,而INTMSK只负责总的中断向量的屏蔽,要具体打开某一具体的中断屏蔽,还需要设置EINTMASK。
有一些中断是共用一个中断向量的,而一个中断向量只能有一个中断执行函数,因此具体是哪个外部中断,还需要EINTPEND或rINTOFFSET来判断使用__irq这个关键词来定义中断处理函数,这样系统会为我们自动保存一些必要的变量,并能够在中断处理函数执行完后正确地返回这种形式:void __irq key();pISR_EINT0=(int)key;定时器使用主要配置:外部时钟源→通过寄存器MPLLCON得到FCLK→再通过寄存器CLKDIVN得到HCLK和PCLK->;再得到定时器的工作频率PWM定时器使用:蜂鸣器=GPB0=TOUT0=定时器0蜂鸣器高电平响,低电平不响关键是设置寄存器TCNTBn和TCMPBn,前者可以确定一个计数周期的时间长度,而后者可以确定方波的占空比定时器中断使用:不需要配置TCMPBn,只需TCNTBn,TCNTBn*1/定时器的工作频率=定时的时间但要记住中断要:void __irq timer0_sever();pISR_TIMER0=(int)timer0_sever;rINTMSK =~BIT_TIMER0;Uart主要配置以下寄存器:UBRDIVn,UCONn,UTRSTATn收发寄存器:UTXHn,URXHn注意几点:1.对于s3c2440来说,接收数据是被动的,发送数据是主动的,因此一般来说,接收数据用中断方式,发送数据用查询方式较好;2.在中断方式下,当接收到数据时,尽管可能该数据无用,但也一定要读取它,否则下次再接收数据时,不会再引起中断,因为接收数据缓存器被上次接收到的数据所霸占,只要没有读取它,它就永远在那里;3.由于UART中断涉及到SUBSRCPND寄存器,因此在中断处理程序中不仅要清SRCPND寄存器,还要清SUBSRCPND 寄存器,它们的顺序一定是先清SUBSRCPND寄存器,再清SRCPND寄存器,否则就会引起一个中断两次响应的问题。
ARMS3C2440A讲解
以下程序在Keil4中建立项目,芯片选S3C 2410A无论是S3C2410A还是S3C2440A,其IO口B都是11位二进制数,xxx xxxx xxxx,现在控制第5、6、7、8为做输出点亮LED灯(共阳极,输出0点亮),即xx8 765x xxxx,GPBCON equ 0x56000010GPBDAT equ 0x56000014GPBUP equ 0x56000018xport xmainarea Init,code,readonlyentryexportxmainldr r0,=GPBCONldr r1,[r0]bic r1,#0x3fC00 ;r1=xx00 0000 00xx xxxx xxxxorr r1,#0x15400 ;r1=xx01 0101 01xx xxxx xxxxstr r1,[r0] ;r1传给GPBCON设置8765位为输出ldr r0,=GPBUPldr r1,[r0]orr r1,#0x1e0 ;r1=xx1 111x xxxxstr r1,[r0] ;开B口第8、7、6、5位上拉电阻ldr r0,=GPBDATldr r2,[r0] ;把B口最初状态保存在R2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;LOOP dr r1,[r2]orr r1,#0x1c0str r1,[r0]bl delay;BL跳转时将PC+4值自动保存在R14即LR中,也就是将程序的下一个语句地址保存在lr中在跳;转后执行mov pc,lr相当于返回,这样BL相当于调用子程序,pc=lr相当于子程序返回;;;;;;;;;;;;;;;;;;dr r1,[r2]orr r1,#0x1a0str r1,[r0]bl delay;;;;;;;;;;;;;;;;;;;;;ldr r1,[r2]orr r1,#0x160str r1,[r0]bl delay;;;;;;;;;;;;;;;;;;;;;;;;ldr r1,[r2]orr r1,#0x0e0str r1,[r0]bl delay;;;;;;;;;;;;;;;;;;;;;;;;b LOOPdelaymov r3,#3delay1 sub r3,r3,#1cmp r3,#0x0bne delay1mov pc,lr ;这句相当于子程序返回语句 end1. A(*(volatile unsigned *)0x56000010)的意思是把0x48000000强制转换成volatile unsigned long类型的指针,暂记为p,那么就是#define A *p,即A为P指针指向位置的内容了。
2440硬件使用说明
一、中心简介...................................................................................................................................4 二、开发板硬件资源:...................................................................................................................5 1、核心板参数.........................................................................................................................5 2.1.1 尺寸:....................................................................................................................5 2.1.2 中央处理器:........................................................................................................ 5 2.1.3 SDRAM:.................................................................................................................5 2.1.4 FLASH Me
阳初 2440 开发 板说明书
阳初2440开发板使用说明书2008‐3‐20目录第一章 开发板的介绍 (6)1.1开发板简介 (6)1.1.1硬件资源特性 (6)1.1.2用户光盘资源说明 (7)1.2 Linux特性 (7)1.3开发套件配件清单 (8)第二章 开发板使用说明 (8)2.1 开发板设置及连接 (9)2.1.1 开发板外部接口连接 (9)2.1.2 设置超级终端(主机PC) (9)2.2 开发板BIOS功能及使用说明 (12)2.2.1 开机进入BIOS模式 (13)2.2.2 安装USB驱动 (14)2.2.3 vivi子菜单功能说明 (14)2.3 预装linux系统的功能简介 (14)2.3.1 设置开发板网络 (15)2.3.2 如何中止程序的运行 (15)2.3.3 挂载USB闪存盘(U盘) (16)2.3.4 使用SD卡 (17)2.3.5 如何通过串口与PC互相传送文件 (17)2.3.6 串口2 的测试 (19)2.3.7 使用ftp传递文件 (21)2.3.8 设置并保存系统实时时钟 (26)2.3.9 如何掉电保存数据到Flash (26)2.3.10 使用telnet登陆开发板 (26)2.3.11 如何设置开机自动运行程序 (27)第三章 安装嵌入式系统 (28)3.1安装启动程序 (28)3.1.1在PC上安装JTAG下载线的驱动程序 (29)3.1.2烧写Bootloader (35)3.2串口安装Linux (36)3.2.1分区并格式化闪存 (36)3.2.2下载Bootloader (37)3.2.3下载Linux的内核映象 (39)3.2.4下载文件系统映象 (40)3.2.5启动Linux系统 (41)3.3 tftp安装linux (41)3.3.1 启动TFTP服务器 (41)3.3.2 网络设置 (43)3.3.3 下载内核映象以及文件系统 (45)3.4安装WinCE系统 (47)3.4.1下载WindowsCE启动程序 (47)3.4.2下载WindowsCE映象 (49)3.4.3启动WindowsCE (54)第四章 ADS1.2 集成开发环境的使用 (54)4.1 使用ADS创建LED工程 (54)4.1.1 建立一个工程 (54)4.1.2 编译和链接工程 (58)4.2 下载和运行 (65)第五章 建立linux开发环境 (66)5.1 linux发行版本介绍 (66)5.2 完全图解安装Redhat9.0 (70)5.2.1用grub引导双操作系统 (70)5.2.2使用vmware虚拟机 (74)5.3 配置minicom终端通讯工具 (75)5.4 配置网络文件系统NFS服务 (77)5.5 通过NFS启动系统 (78)5.6 配置PC机Linux的ftp服务 (78)5.7 配置PC机的telnet服务 (79)第六章 嵌入式linux系统架构介绍 (80)6.1 Bootloader,内核镜像,文件系统 (80)6.2 Bootloader介绍 (81)6.3 内核 (82)6.4 文件系统 (82)6.4.1嵌入式系统存储设备及其管理机制分析 (82)6.4.2基于Flash的文件系统 (84)第七章 配置和编译linux (85)7.1 交叉编译环境 (85)7.1.1 交叉编译环境介绍 (85)7.1.2建立交叉编译环境 (86)7.2 bootloader (88)7.2.1编译bootloader (88)7.2.2 使用VIVI命令 (90)7.3 使用缺省配置文件编译内核 (92)7.3.1 解压内核源代码 (92)7.3.2 装载缺省配置文件 (93)7.3.3 编译内核 (96)7.4 定制linux内核 (99)7.4.1 如何配置CPU选项 (99)7.4.2 如何配置USB鼠标和键盘 (100)7.4.3 如何配置优盘的支持 (102)7.4.4 如何配置CS8900 网卡驱动 (103)7.4.5 如何配置声卡驱动 (105)7.4.6 如何配置串口驱动 (106)7.4.7 如何配置RTC实时时钟驱动 (108)7.4.8 如何配置yaffs文件系统的支持 (109)7.4.9 如何配置EXT2/VFAT/ NFS等文件系统 (110)7.5 根文件系统的制作 (112)7.5.1 根文件系统的构成 (112)7.5.2 构建根文件系统 (112)7.5.3 Yaffs根文件系统映像的制作 (114)7.5.4 Qtopia文件系统映象 (116)第八章 为目标板编写linux应用程序 (118)8.1 编辑编译示例程序 (118)8.2 如何把编译好的程序下载到开发板运行 (121)8.2.1 使用优盘 (121)8.2.2 通过串口传送文件到开发板 (123)8.2.3 通过网络文件系统NFS执行 (124)8.2.4 通过ftp下载文件执行 (126)8.3 程序驱动开发实验 (128)8.3.1 编辑编译LED灯驱动程序 (128)8.3.2 用ftp下载LED灯驱动程序 (129)8.3.3 运行LED灯驱动程序 (132)第九章 配置和编译Wince (134)9.1 安装开发环境Platform Builder 4.2 (134)9.2 Wince Image 生成简要说明 (139)9.2.1 解压缩文件 (139)9.2.2 导入CEC文件 (139)9.2.3 Image编译过程 (142)9.3 烧写Wince系统 (146)附录1 linux命令初步 (146)1.1文件列表 (146)1.2目录切换 (146)1.3复制 (147)1.4删除 (147)1.5移动 (147)1.6比较 (147)1.7回显 (147)1.8容量查看 (147)1.9文件内容查看 (147)1.10分页查看 (147)1.11时间日期 (147)1.12查找 (148)1.13搜索 (148)1.14设置环境变量 (148)1.15编辑 (148)1.16压缩与解压 (148)1.17挂接 (148)1.18启动信息显示 (148)1.19改变文件权限 (148)1.20创建节点 (148)1.21进程查看 (149)1.22杀死进程 (149)1.23设置环境变量 (149)1.24启动信息显示 (149)1.25网络设置命令 (149)1.26设置网关 (149)1.27测试网络联通 (150)1.28路由检测 (150)附录2 硬件地址空间分配 (150)2.1 地址空间分配和片选信号定义 (150)2.2 跳线说明 (151)附录3 推荐网站和下载资源 (153)3.1图书 (153)3.2网站 (156)3.2.1大陆资源 (156)3.2.2台湾资源 (157)第一章 开发板的介绍1.1开发板简介1.1.1硬件资源特性阳初2440 开发板由核心板和底板构成,更加方便客户做二次开发使用,在光盘中提供有底板的PCB 图,更利于客户出板。
2440操作步骤
操作步骤
1.将LCD背光板与LCD板相连,LCD板接入12V直流电源(用重量较轻的开关电源)。
注:背光板输入电源端子的1、2、5是连在一起的,接12V;3、4是连在一起的,接地(即1脚接正,3脚接地即可,1脚标识为金属面朝自己的最右边第一脚)。
2.用交叉串口将2440板子的串口(USB设备接口附近、下面的那个)与PC机的串口相连,起动超级终端,波特率为115200。
3.给2440板子电源接12V(用重量较重的铁心电源),按复位按钮。
4.当超级终端出现“Initiating image download in 14 seconds.”时,按“空格”键,输入“boot”回车。
5.当超级终端出现“Enter your selection: ”时,选择“L”键后,将启动WinCE。
如果无法启动时,请将2440板子与LCD连接的排线不要连接,用上述方法启动winCE。
如果LED出现闪烁,说明WinCE正常启动,再重新接上LCD 的排线,重复上述步骤。
6.关于USB鼠标和USB键盘:在双层的USB HOST接口最底层可以接USB 鼠标或者USB键盘或者U盘;当需要同时接以上设备时,请用USB HUB引出来再接在USB HUB上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
采用IAR 作为2440开发板单片机部分的开发环境不知道是否正确。
首先对IAR 开发环境做一下简要介绍对IAR开发环境并不了解,在网上查找到的资料也都是IAR 4.3的,而我所使用的IAR5.20的资料相当少。
IAR5.20 与IAR4.3的主要区别在于IAR5.20开始连接器linker开始采用ilinker,不再是以前4.30所采用的xlinker,连接生成的文件格式为标准的elf格式文件。
不要小瞧这个修改,就是这部分导致IAR5.20环境上手十分困难。
IAR5.20 EWARM支持几乎所有的ARM核CPU,包括最新的Context M3,ARM 11等,并且IAR环境为许多嵌入式CPU提供了相应的例程,当然,各个例程大多只是提供对相应CPU 的初始化,引导main函数等操作。
而对于没有在例程中出现的CPU就非常非常麻烦了,这就意味着开发环境没仅为你提供了基本的一些设置方法,所有的部分需要自己根据CPU的spec进行设置,同时由于是用IAR开发环境,你还需要了解IAR开发环境的设置方式。
为了调通第一个IAR下的2440A点灯程序费了我将近半个月的业余时间,现在把总体过程总结一下,希望能够对大家有所帮助。
首先,IAR5.20环境的基本设置我就不详细说了,网上关于这部分有很多。
CPU类型不选错就好啦,哈哈,只说几个重中之重,关键的部分,在C/C++ Compiler选项Preprocessor选项中可以添加自己的头文件路径,$PROJ_DIR$\代表工程目录,例如:$PROJ_DIR$\inc\;最重要的是Linker选项卡中,一定要在Config配置项中设置自己的icf配置文件,对该部分下面会详细说明。
在该选项卡的List选项下勾选Gererate linker map file,这个map文件非常重要,由IAR在链接是自动生成,map文件内包含的就是在链接过程中不同文件在最终二进制文件中所处的置是否正确。
在Debugger选项卡中是关于所使用的仿真器的描述选择自己的调试工具,这部分下面也会有详细说明。
下面进行详细说明:进行嵌入式开发,IAR5.20只是一个编译环境,编译生成目标CPU上可运行的二进制代码而已。
这句似乎就是废话,任何有一点嵌入式经验的人都知道。
但这句话的潜台词就是进行嵌入式开发,如果你不是运行在操作系统之上的,那么你就需要完成所有的硬件初始化,CPU 总线、flash,SDRAM,各个IO端口,等。
这样我们就需要了解CPU的启动过程,CPU启动后运行代码的过程。
而这部分是我们正常开发软件所不会接触的。
为了快速开发嵌入式、减低嵌入式开发的难度,在IAR环境中为很多CPU提供程序运行时所处内存位置的描述。
也就是我们刚才所提到的icf文件。
<.icf文件的重要性>icf 链接文件内包含对程序段各部分存放位置的描述,相当于ADS中link内文件摆放位置就是最终代码顺序的关系。
默认所使用的icf文件在IAR文件夹下\IAR Systems\Embedded Workbench 5.0 Evaluation\ARM\config文件夹下的generic.icf文件,我们可以将该文件拷贝到工程目录中,通过在Config选项卡中选择路径来配置自己的icf文件,在icf文件中需要指定interrupt vector的位置,默认的ARM处理器在启动后都是从0x0000 0000位置开始设置中断向量表的,可以查找芯片的中断向量表修改,对应几个模式的中断处理函数的地址,在Memory Region内包括对CPU内的ROM,RAM空间的地址,这里就要详细说明了,首先如果你所使用的CPU只使用CPU内部的SROM,SRAM的话,直接查找SROM,SRAM所对应的地址填入就好啦,这里的数值还涉及到你所采用的调试方式,如果采用仿真器调试的话,可以将ROM RAM地址都指定为CPU内SRAM的地址段,这样程序通过仿真器就自动的下载到CPU内SRAM运行了。
如果在CPU外有自己的SDRAM的话,就把RAM地址段指定为SDRAM在CPU内映射的位置,同时在启动程序中需要设置SDRAM内存段的配置。
同样如果采用片外的NAND FLASH/NORFLASH的话在ROM地址段就需要在启动代码段内进行相应的初始化设置。
最后需要设置各种堆栈的大小,CSTACK是C程序运行所需要的堆栈空间,下面的SVC,IRQ,FIQ,UND,ABT分别对应ARM内5种特殊运行模式的堆栈空间,在ARM下用户态与超级系统态内所使用的堆栈空间是相同的,可以根据代码量、RAM 空间的大小进行设置,HEAP/CSTACK应该设置的大一些,至少要0x1000以上。
如果不使用Linker选项卡下Config选项中Edit可以使用IAR提供的脚本进行自动的修改,我们也可以通过手动直接修改icf文件来实现。
通过阅读icf文件我们可以发现在icf文件中根据我们的设置选项生成了多个堆栈空间地址。
我们所指定的堆栈都在指定的RAM 空间中。
对icf文件的描述就到这里,完成icf文件的设置后,我们需要编写自己的startup代码,我们可以通过修改IAR5.20例子中所提供的cstartup.s文件修改为自己的CPU 启动代码。
在IAR5.2O中,程序启动以__iar_program_start段名指定,可以再Linker选项卡Library选项内进行修改,改为自己指定的启动段名。
修改cstartup的代码我就不献丑了,附上一个标准的cstartup.s代码,大家考下来看看就明白了,需要添加自己的代码就在相应的位置进行添加。
MODULE ?cstartup;; Forward declaration of sections.SECTION IRQ_STACK:DA TA:NOROOT(3)SECTION ABT_STACK:DA TA:NOROOT(3)SECTION SVC_STACK:DA TA:NOROOT(3)SECTION UND_STACK:DA TA:NOROOT(3)SECTION FIQ_STACK:DA TA:NOROOT(3)SECTION CSTACK:DA TA:NOROOT(3);; The module in this file are included in the libraries, and may be; replaced by any user-defined modules that define the PUBLIC symbol; __iar_program_start or a user defined start symbol.;; To override the cstartup defined in the library, simply add your; modified version to the workbench project.SECTION .intvec:CODE:NOROOT(2)PUBLIC __vectorPUBLIC __iar_program_startEXTERN undef_handler, prefetch_handler, data_handler,EXTERN irq_handler, fiq_handlerARM__vector:;;ldr pc,=__iar_program_start ;; ResetB . ;; Undefined instructionsB . ;; Software interrupt (SWI/SVC)B . ;; Prefetch abortB . ;; Data abortB . ;; RESERVEDldr pc,[pc,#-0xF20] ;; IRQldr pc,[pc,#-0xF20] ;; FIQ; --------------------------------------------------; ?cstartup -- low-level system initialization code.;; After a reser execution starts here, the mode is ARM, supervisor; with interrupts disabled.;SECTION .text:CODE:NOROOT(2); PUBLIC ?cstartupEXTERN ?mainREQUIRE __vectorARM__iar_program_start:?cstartup:;; Add initialization needed before setup of stackpointers here.;; Initialize the stack pointers.; The pattern below can be used for any of the exception stacks:; FIQ, IRQ, SVC, ABT, UND, SYS.; The USR mode uses the same stack as SYS.; The stack segments must be defined in the linker command file,; and be declared above.;; --------------------; Mode, correspords to bits 0-5 in CPSRMODE_BITS DEFINE 0x1F ; Bit mask for mode bits in CPSRUSR_MODE DEFINE 0x10 ; User modeFIQ_MODE DEFINE 0x11 ; Fast Interrupt Request modeIRQ_MODE DEFINE 0x12 ; Interrupt Request modeSVC_MODE DEFINE 0x13 ; Supervisor modeABT_MODE DEFINE 0x17 ; Abort modeUND_MODE DEFINE 0x1B ; Undefined Instruction modeSYS_MODE DEFINE 0x1F ; System modeMRS r0, cpsr ; Original PSR valueBIC r0, r0, #MODE_BITS ; Clear the mode bitsORR r0, r0, #ABT_MODE ; Set ABT mode bitsMSR cpsr_c, r0 ; Change the modeLDR sp, =SFE(ABT_STACK) ; End of ABT_STACKBIC r0, r0, #MODE_BITS ; Clear the mode bitsORR r0, r0, #SVC_MODE ; Set SVC mode bitsMSR cpsr_c, r0 ; Change the modeLDR sp, =SFE(SVC_STACK) ; End of SVC_STACKBIC r0, r0, #MODE_BITS ; Clear the mode bitsORR r0, r0, #UND_MODE ; Set UND mode bitsMSR cpsr_c, r0 ; Change the modeLDR sp, =SFE(UND_STACK) ; End of UND_STACKBIC r0, r0, #MODE_BITS ; Clear the mode bitsORR r0, r0, #FIQ_MODE ; Set FIQ mode bitsMSR cpsr_c, r0 ; Change the modeLDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACKBIC r0, r0, #MODE_BITS ; Clear the mode bitsORR r0, r0, #IRQ_MODE ; Set IRQ mode bitsMSR cpsr_c, r0 ; Change the modeLDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACKBIC r0 ,r0, #MODE_BITS ; Clear the mode bitsORR r0 ,r0, #SYS_MODE ; Set System mode bitsMSR cpsr_c, r0 ; Change the modeLDR sp, =SFE(CSTACK) ; End of CSTACK#ifdef __ARMVFP__;; Enable the VFP coprocessor.MOV r0, #0x40000000 ; Set EN bit in VFPFMXR fpexc, r0 ; FPEXC, clear others.;; Disable underflow exceptions by setting flush to zero mode.; For full IEEE 754 underflow compliance this code should be removed; and the appropriate exception handler installed.;MOV r0, #0x01000000 ; Set FZ bit in VFPFMXR fpscr, r0 ; FPSCR, clear others.#endif;; Add more initialization here;; Continue to ?main for C-level initialization.LDR r0, =?mainBX r0END在完成cstartup.s后我们就可以最基本的使用C代码进行编程了,大家加油啊!!其实IAR环境的选项众多,它们就是gas gar等进行编译时选项,只是IAR环境以可视化的形式进行呈现了,还有就是icf文件,icf文件在这里其实就是表现为在调用cstartup.s前所使用的一个选项文件,链接器会根据该文件进行代码段的安排,为了不造成冲突,需要在cstartup.s中根据icf文件对堆栈进行相应的设置。