嵌入式开发-第4章 ARM系统硬件设计基础.ppt_第1页
嵌入式开发-第4章 ARM系统硬件设计基础.ppt_第2页
嵌入式开发-第4章 ARM系统硬件设计基础.ppt_第3页
嵌入式开发-第4章 ARM系统硬件设计基础.ppt_第4页
嵌入式开发-第4章 ARM系统硬件设计基础.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章ARM系统硬件设计基础 主要内容 1 4 3 5 ADS1 2集成开发环境简介 基于ARM的汇编语言程序设计 基于ARM的硬件启动程序 基于ARM的C语言与汇编语言混合编程 6 印制电路板制作简介 2 RVDS2 2集成开发环境简介 4 1ADS1 2集成开发环境简介 ADS的英文全称为ARMDeveloperSuite 是ARM公司推出的新一代ARM集成开发工具 ADS由六个部分组成 分别是 代码生成工具集成开发环境调试器指令集模拟器ARM开发包ARM应用库 4 1 1ADS1 2集成开发环境下工程的创建 使用ADS创建工程的步骤 新建工程 File New 设置目标及其参数 Edit DebugSettings 向工程中添加文件 Project AddFiles 4 1 2ADS1 2集成开发环境下进行仿真和调试的方法 在Codewarrior中 如果工程编译成功 将产生一个后缀为 axf的映像文件 接下来就可以使用AXDDebugger进行调试 常用调试按钮 主要内容 1 4 3 5 ADS1 2集成开发环境简介 基于ARM的汇编语言程序设计 基于ARM的硬件启动程序 基于ARM的C语言与汇编语言混合编程 6 印制电路板制作简介 2 RVDS2 2集成开发环境简介 4 2RVDS2 2集成开发环境简介 RealView DevelopmentSuite RVDS 是ARM公司继SDT与ADS1 2之后主推的新一代开发工具 RVDS集成的RVCT是业内公认的能够支持所有ARM处理器 并提供最好的执行性能的编译器 RVD是ARM系统调试方案的核心部分 支持含嵌入式操作系统的单核和多核处理器软件开发 可以同时提供相关联的系统级模型构建功能和应用级软件开发功能 为不同用户提供最为合适的调试功效 目前全球基于ARM处理器的40亿个产品设备中 大部分的软件开发是基于RealView开发工具 安全 可靠和高性能地设计产品的最好选择就是购买ARMRealView开发工具 RVDS向下兼容以前的版本 ADSv1 2 1 1 1 1 0 1 主要内容 1 4 3 5 ADS1 2集成开发环境简介 基于ARM的汇编语言程序设计 基于ARM的硬件启动程序 基于ARM的C语言与汇编语言混合编程 6 印制电路板制作简介 2 RVDS2 2集成开发环境简介 4 3 1ARM汇编器支持的伪指令 伪指令是ARM汇编语言程序中的一些特殊指令助记符 这些助记符与指令系统的助记符不同 没有相对应的操作码 它们所完成的操作称为伪操作 伪指令在源程序中的作用是为完成汇编程序做各种准备工作的 这些伪指令仅在汇编过程中起作用 一旦汇编结束 伪指令的使命就完成了 ARM汇编器支持的伪指令包括 符号定义伪指令 数据定义伪指令 汇编控制伪指令 宏指令以及其他伪指令 ARM汇编器支持的常见伪指令 4 3 2基于ARM的汇编语言语句格式 ARM汇编语言的语句格式 标号 指令或伪指令 注释 标号是代表地址的符号 必须在一行的顶格书写 其后不能添加冒号 而所有指令均不能顶格书写 ARM汇编语言对标识符的大小写敏感 书写标号及指令时字母大小写要一致 在ARM汇编语言中 ARM指令 伪指令 寄存器名等可以全部大写或者全部小写 但不能大小写混合使用 为了使源文件易读 可以将一条长的指令通过使用反斜杠字符 将其分成几行书写 每行从第一个分号开始到本行结束为注释内容 所有的注释内容均被汇编起忽略 4 3 3ARM汇编语言程序的基本结构 在ARM汇编语言程序中 以程序段为单位来组织代码 段是相对独立的指令或数据序列 具有特定的名称 段可以分为代码段和数据段 代码段的内容为执行代码 数据段存放代码运行时所需的数据 可执行映像文件通常由以下几部分构成 一个或多个代码段 代码段为只读属性 RO 零个或多个包含初始化数据的数据段 数据段的属性为可读写 RW 零个或多个不包含初始化数据的数据段 数据段的属性为可读写 ZI 一个含有子程序调用的代码段的例子 AREAInit CODE READONLYENTRYLDRR0 0 x3FF5000LDRR1 0 x0fSTRR1 R0 LDRR0 0 x3F50008LDRR1 0 x1STRR1 R0 BLPROC 子程序调用 PROC 子程序开始 MOVPC LR 从子程序返回 END 一个数据段的例子 AREADataArea DATA NOINIT ALIGN 2DISPBUFSPACE200RCVBUFSPACE200 其中DATA为数据段的标识 4 3 4基于ARM的汇编语言程序举例 举例 连续发送128个ASCII字符的汇编语言的例子 呼叫子程序UARTbUART 子程序开始UARTldrr0 GPHCON 设置GPIO RxD0 TxD0引脚 ldrr1 0 x2afaaastrr1 r0 ldrr0 GPHUPldrr1 0 x7ffstrr1 r0 GPH 10 0 禁止上拉ldrr0 UFCON0 禁用FIFOldrr1 0 x0strr1 r0 ldrr0 UMCON0 禁用AFCldrr1 0 x0strr1 r0 ldrr0 ULCON0 设置线寄存器ldrr1 0 x3 正常模式 无奇偶校验 一个停止位 8个数据位strr1 r0 ldrr0 UCON0 设置Uart0控制器ldrr1 0 x245 RX边沿触发 TX电平触发 禁用延时中断 使用RX错误中断 正常操作模式 中断请求或表决模式strr1 r0 ldrr0 UBRDIV0 设置波特率为115200ldrr1 0 x1a int 50700000 16 115200 1 26strr1 r0 movr1 100 Delaysubr1 r1 0 x1bneDelay 开中断ldrr0 INTMSKldrr1 r0 andr1 r1 0 xefffffffstrr1 r0 MOVR5 127 设置要打印的字符的个数MOVR1 0 x0 设置要打印的字符LOOPLDRR3 UTRSTAT0LDRR2 R3 TSTR2 0 x04 判断发送缓冲区是否为空BEQLOOP 为空则执行下边的语句 不为空则跳转到LOOPLDRR0 UTXH0STRR1 R0 向数据缓冲区放置要发送的数据ADDR1 R1 1SUBR5 R5 0 x01 计数器减1CMPR5 0 x0BNELOOP 主要内容 1 4 3 5 ADS1 2集成开发环境简介 基于ARM的汇编语言程序设计 基于ARM的硬件启动程序 基于ARM的C语言与汇编语言混合编程 6 印制电路板制作简介 2 RVDS2 2集成开发环境简介 硬件启动程序的工作一般包括 1 分配中断向量表 2 初始化存储器系统 3 初始化各工作模式下的堆栈 4 初始化有特殊要求的硬件模块 5 初始化用户程序的执行环境 6 切换处理器的工作模式 7 呼叫主应用程序 4 4基于ARM的硬件启动程序 1 分配中断向量表 ARM要求中断向量表必须放置在从0 x0地址开始的连续32个字节空间内 AREAInit CODE READONLYENTRYBResetHandlerBUndefHandlerBSWIHandlerBPreAbortHandlerBDataAbortHandlerB BIRQHandlerBFIQHandler 中断向量表的程序通常如下所示 2 初始化存储器系统 对存储系统的初始化操作包括对存储器类型 存储器容量 时序以及总线宽度等的配置 通常Flash和SRAM同属于静态存储器类型 可以合用同一个存储器端口 而DRAM因为有动态刷新和地址线复用等特性 通常配有专用的存储器端口 除了存储器外 与网络芯片相关的存储器配置以及外接大容量存储卡的配置也在这里进行 3 初始化各工作模式下的堆栈 ARM有7种运行状态 每一种状态的堆栈指针寄存器 SP 都是独立的 程序需要对用到的每一种模式下的SP定义一个堆栈地址 定义的方法是改变状态寄存器内的状态位 使处理器切换到不同的状态 然后给SP赋值 预定义处理器模式常量USERMODEEQU0 x10FIQMODEEQU0 x11IRQMODEEQU0 x12SVCMODEEQU0 x13ABORTMODEEQU0 x17UNDEFMODEEQU0 x1bSYSMODEEQU0 x1fNOINTEQU0 xc0 InitStacksmrsr0 cpsrbicr0 r0 MODEMASKorrr1 r0 UNDEFMODE NOINTmsrcpsr cxsf r1 未定义模式堆栈ldrsp UndefStackorrr1 r0 ABORTMODE NOINTmsrcpsr cxsf r1 中止模式堆栈ldrsp AbortStackorrr1 r0 IRQMODE NOINTmsrcpsr cxsf r1 中断模式堆栈ldrsp IRQStackorrr1 r0 FIQMODE NOINTmsrcpsr cxsf r1 快速中断模式堆栈ldrsp FIQStackbicr0 r0 MODEMASK NOINTorrr1 r0 SVCMODEmsrcpsr cxsf r1 管理模式堆栈ldrsp SVCStackmovpc lrLTORG 4 初始化有特殊要求的硬件模块 这一部分的设置工作根据具体的系统和用户需求而定 一般外设初始化可以在系统初始化之后进行 比较典型的硬件模块有LED 时钟模块 看门狗模块等 5 初始化用户程序的执行环境 可执行程序映像的结构 LDRr0 Image RO Limit 得到RW数据源在ROM中的的起始地址LDRr1 Image RW Base RW区在RAM里的起始地址LDRr3 Image ZI Base ZI区在RAM里的起始地址CMPr0 r1 比较它们是否相等BEQ F10CMPr1 r3LDRCCr2 r0 4STRCCr2 r1 4BCC B01LDRr1 Image ZI Limit MOVr2 02CMPr3 r1STRCCr2 r3 4BCC B2 6 切换处理器的工作模式 需要注意的是 在最后阶段才能把模式转换到最终应用程序运行所需的模式 一般是用户模式 内核级的中断使能也可以考虑在这一步进行 在初始化过程中模式变化过程为 管理模式 各种特权模式 堆栈初始化阶段 用户模式 7 呼叫主应用程序 当所有的系统初始化工作完成之后 就需要把程序流程转入主应用程序 最简单的一种情况是 IMPORTMainBMain在ARMADS环境中 还另外提供了一套系统级的呼叫机制IMPORT mainB main main 是编译系统提供的一个函数 负责完成库函数的初始化和初始化应用程序执行环境 最后自动跳转到main 函数 此时要求用户主函数的名字必须是main 主要内容 1 4 3 5 ADS1 2集成开发环境简介 基于ARM的汇编语言程序设计 基于ARM的硬件启动程序 基于ARM的C语言与汇编语言混合编程 6 印制电路板制作简介 2 RVDS2 2集成开发环境简介 4 5 1C语言与汇编语言混合编程应遵守的规则 在C程序和ARM汇编程序之间相互调用时必须遵守ATPCS规则 ATPCS规定了一些子程序间调用的基本规则 比如 寄存器的使用规则子程序之间通过寄存器r0 r3来传递参数 当参数个数多于4个时 使用堆栈来传递参数 在子程序中 使用寄存器r4 r11保存局部变量 寄存器r12用于保存堆栈指针SP 当子程序返回时使用该寄存器出栈 记作IP 寄存器r13用作堆栈指针 记作SP 寄存器r14称为链接寄存器 记作LR 该寄存器用于保存子程序的返回地址 寄存器r15称为程序计数器 记作PC 堆栈的使用规则堆栈采用满递减类型 FD FullDescending 即堆栈通过减小存储器地址而向下增长 堆栈指针指向内含有效数据项的最低地址 参数的传递规则整数参数的前4个使用r0 r3传递 其他参数使用堆栈传递 浮点参数使用编号最小且能够满足需要的一组连续的FP寄存器传递参数子程序的返回结果为一个32位整数时 通过r0返回 返回结果为一个64位整数时 通过r0和r1返回 依此类推 结果为浮点数时 通过浮点运算部件的寄存器F0 D0或S0返回 4 5 2汇编程序调用C程序的方法 汇编程序调用C程序的方法为 首先在汇编程序中使用IMPORT伪指令事先声明将要调用的C语言函数 然后通过BL指令来调用C函数 例如在一个C源文件中定义了如下求和函数 intadd intx inty return x y 调用add 函数的汇编程序结构如下 IMPORTadd 声明要调用的C函数 MOVr0 1MOVr1 2BLadd 调用C函数add 4 5 3C程序调用汇编程序的方法 C程序调用汇编子程序的方法为 首先在汇编程序中使用EXPORT伪指令声明被调用的子程序 表示该子程序将在其他文件中被调用 然后在C程序中使用extern关键字声明要调用的汇编子程序为外部函数 例如在一个汇编源文件中定义了如下求和函数 EXPORTadd 声明add子程序将被外部函数调用 add 求和子程序addADDr0 r0 r1MOVpc lr 在一个C程序的main 函数中对add汇编子程序进行了调用 externintadd intx inty 声明add为外部函数voidmain inta 1 b 2 c c add a b 调用add子程序 4 5 4C程序中内嵌汇编语句 在C语言中内嵌汇编语句可以实现一些高级语言不能实现或者高级语言不容易实现的功能以及时间紧迫的功能 内嵌的汇编器支持大部分ARM指令和Thumb指令 但是不支持诸如直接修改PC实现跳转的底层功能 也不能直接引用C语言中的变量 嵌入式汇编语句在形式上表现为独立定义的函数体 其语法格式为 asm 指令 指令 指令 C程序中内嵌汇编语句举例 使能IRQ中断 inlinevoidenable IRQ void inttmp asm 嵌入汇编代码 MRStmp CPSR 读取CPSR的值BICtmp tmp 0 x80 将IRQ中断禁止位I清零 即允许IRQ中断MSRCPSR c tmp 设置CPSR的值 一个完整的例子 字符串复制 includevoidmy strcpy constchar src char dst intch asm loop ifndef thumb ARM指令版本LDRBch src 1STRBch dst 1 else Thumb指令版本LDRBch src ADDsrc 1STRBch dst ADDdst 1 endifCMPch 0BNEloop 一个完整的例子 contiuned intmain void constchar a Helloworld charb 20 my strcpy a b asm MOVR0 a 设置入口参数MOVR1 bBLmy strcpy R0 R1 调用my strcpy 函数 printf Originalstring s n a 显示my strcpy 函数字符串复制结果printf Copiedstring s n b return 0 4 5 5基于ARM的C语言与汇编语言混合编程举例 举例 一个向串口不断发送0 x55的例子 include inc config h 将有关硬件定义的头文件包含进来unsignedchardata 定义全局变量voidMain void Target Init 对目标板的硬件初始化Delay 10 延时data 0 x55 给全局变量赋值while 1 Uart Printf x data 向串口送数Delay 10 IMPORTMainAREAI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论