第4章,ARM系统硬件设计基础.ppt

第4章ARM系统硬件设计基础 主要内容 1 3 2 4 ARM开发环境简介 基于ARM的汇编语言程序设计 基于ARM的硬件启动程序 基于ARM的C语言与汇编语言混合编程 5 印制电路板制作简介 4 1ARM开发环境简介 目前进行ARM嵌入式系统开发常见的开发工具主要有 RealViewMDK IAREWARM ADS1 2 WinARM等 下面分别介绍RealViewMDK和IAREWARM开发工具的使用 4 1 1RealViewMDK开发工具简介 RealViewMDK MicrocontrollerDevelopmentKit 开发工具是ARM公司目前最新推出的针对各种嵌入式处理器的软件开发工具 突出的特性如下 启动代码生成向导 软件模拟器 性能分析器 支持Cortex M3内核 RealView编译器 配备ULINK2仿真器和Flash编程模块 性价比高 提供专业的本地化技术支持和服务 使用 Vision4创建一个新的工程需要以下步骤 启动 Vision4 创建一个工程文件并从器件数据库中选择一种CPU 添加和配置启动代码 设置目标硬件的工具选项 Project OptionsforTarget 创建源文件及文件组 并将其添加到工程中 编译链接工程并生成一个HEX文件 Project Buildtarget 4 1 1 1RealViewMDK下工程的创建 4 1 1 2RealViewMDK下工程的调试 Vision4调试器有两种工作模式 仿真模式高级GDI驱动器模式 执行菜单命令 Debug Start StopDebugSession 或单击工具栏上的图标将启动 Vision4的调试模式 基本的调试功能 设置断点控制程序单步 全速或停止运行Serial窗口反汇编窗口Watch窗口寄存器窗口Memory窗口 4 1 2IAREWARM集成开发环境简介 IAREmbeddedWorkbenchforARM是IARSystems公司为ARM微处理器开发的一个集成开发环境 简称IAREWARM IAREWARM的主要模块如下 高度优化的IARARMC C CompilerIARARMAssembler一个通用的IARXLINKLinkerIARXAR和XLIB建库程序和IARDLIBC C 运行库功能强大的编辑器项目管理器命令行实用程序IARC SPY调试器 先进的高级语言调试器 IARJ Link是IAR为支持仿真ARM内核芯片推出的JTAG方式仿真器 4 1 2 1IAREWARM集成开发环境下工程的创建 1 新建工作区 File New Workspace 2 新建工程 Project CreatNewProject 3 保存工作区 File New SaveWorkspace 4 参数配置 1 选择目标类型 Debug Release 2 配置相关参数 Project Option 5 向工程中添加文件6 编译 4 1 2 2IAREWARM下工程的调试 C SPY调试器是IAR集成的高级语言调试器 通过C SPY调试器用户可以查看变量 设置断点 观察反汇编代码 监视寄存器和存储器 在TerminalI O窗口打印输出等 在没有硬件目标系统的情况下 可以使用C SPY的模拟器 Simulator 对应用程序进行模拟调试 执行 Project Debug 菜单命令或者单击工具栏右侧的 DownloadandDebug 按钮 进入调试界面 可进行单步执行 运行到光标处 运行到断点 进入函数 跳出函数等调试操作 同时也可通过View菜单打开相应的窗口来查看内存 变量 寄存器等 如果希望直接在硬件目标系统上进行调试 则需要备有IAR的JTAG仿真器J Link 主要内容 1 3 2 4 ADS1 2集成开发环境简介 基于ARM的汇编语言程序设计 基于ARM的硬件启动程序 基于ARM的C语言与汇编语言混合编程 5 印制电路板制作简介 4 2 1ARM汇编器支持的伪指令 伪指令是ARM汇编语言程序中的一些特殊指令助记符 这些助记符与指令系统的助记符不同 没有相对应的操作码 它们所完成的操作称为伪操作 伪指令在源程序中的作用是为完成汇编程序做各种准备工作的 这些伪指令仅在汇编过程中起作用 一旦汇编结束 伪指令的使命就完成了 ARM汇编器支持的伪指令包括 符号定义伪指令 数据定义伪指令 汇编控制伪指令 宏指令以及其他伪指令 ARM汇编器支持的常见伪指令 4 2 2基于ARM的汇编语言语句格式 ARM汇编语言的语句格式 标号 指令或伪指令 注释 标号是代表地址的符号 必须在一行的顶格书写 其后不能添加冒号 而所有指令均不能顶格书写 ARM汇编语言对标识符的大小写敏感 书写标号及指令时字母大小写要一致 在ARM汇编语言中 ARM指令 伪指令 寄存器名等可以全部大写或者全部小写 但不能大小写混合使用 为了使源文件易读 可以将一条长的指令通过使用反斜杠字符 将其分成几行书写 每行从第一个分号开始到本行结束为注释内容 所有的注释内容均被汇编起忽略 4 2 3ARM汇编语言程序的基本结构 在ARM汇编语言程序中 以程序段为单位来组织代码 段是相对独立的指令或数据序列 具有特定的名称 段可以分为代码段和数据段 代码段的内容为执行代码 数据段存放代码运行时所需的数据 可执行映像文件通常由以下几部分构成 一个或多个代码段 代码段为只读属性 零个或多个包含初始化数据的数据段 数据段的属性为可读写 零个或多个不包含初始化数据的数据段 数据段的属性为可读写 一个含有子程序调用的代码段的例子 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 2 4基于ARM的汇编语言程序举例 举例 连续发送128个ASCII字符的汇编语言的例子 呼叫子程序UARTbUARTUART 子程序开始ldrr0 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 3 2 4 ADS1 2集成开发环境简介 基于ARM的汇编语言程序设计 基于ARM的硬件启动程序 基于ARM的C语言与汇编语言混合编程 5 印制电路板制作简介 硬件启动程序的工作一般包括 1 分配中断向量表 2 初始化存储器系统 3 初始化各工作模式下的堆栈 4 初始化有特殊要求的硬件模块 5 初始化用户程序的执行环境 6 切换处理器的工作模式 7 呼叫主应用程序 4 3基于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 呼叫主应用程序 当所有的系统初始化工作完成之后 就需要把程序流程转入主应用程序 最简单的一种情况是 IMPORTMainBM