DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 335|回复: 0
打印 上一主题 下一主题

ARM系统代码固化的串口实现(上)

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-27 19:27:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  
         
        早期的嵌入式程序采用“编程—烧写—修改—烧写”的开发模式,大量的时间消耗在重复烧写芯片上,增加了开发成本和研发周期。之后发展到仿真器阶段,虽然简化了开发模式,但是由于仿真器与ARM芯片的兼容性等因素,经常会发生程序在仿真器上能正确运行,但是固化之后运行却出现问题的情况。
  程序的固化是软件开发过程中重要的一环,一般可通过JATG口、网口及串口等进行烧写。相比之下,串口实现更为便捷,更值得推广。笔者在开发1C1T小灵通中继站的过程中,通过编制烧写程序,利用串口将编译后的目标代码发送给ARM处理器;由ARM处理器内部的监控程序将目标代码写入片外Flash,实现程序的在线烧写。这样不仅简化了电路设计,而且降低了开发成本,缩短了开发时间。
1  烧写原理及过程
  硬件连接如图1所示,ARM开发板一方面通过串口与PC机连接,另一方面通过20针IDC宽带线与仿真器相连,再由仿真器通过25针并口插座与PC机的LPT口相连。开发板通电后即可进行烧写工作。
  如图2所示,代码固化分2个步骤进行。第1步,如虚线一所示,监控程序的映像通过仿真器下载到ARM的内部RAM中运行,用户可以在主机端用超级终端或者其他串口调试工具与开发板通信。第2步,将应用程序的可执行代码通过串口发送,如虚线二所示,此时内部RAM里的监控程序就会接收并把它烧写到Flash中。




740)this.width=740" border=undefined>
2  监控程序的设计
2.1  启动代码设计
  实现串口烧写的监控程序包括ARM启动代码、串口通信代码和Flash烧写代码3部分。ARM启动代码是整个程序运行的入口点,完成ARM系统正常运行所必需的简单初始化,然后把系统控制权交给操作系统或者高级语言编写的监控程序。由于启动代码直接对SoC内核和硬件控制器进行编程,因此必须采用汇编语言。
  启动代码包括异常向量表的定义、各种模式的堆栈初始化、系统硬件初始化、程序运行环境初始化,最后跳转到用户C语言主程序。当系统上电或复位后首先会从逻辑地址0x0处执行。
  ARM处理器有7种运行模式,如表1所列。每一种模式都有独立的堆栈指针寄存器(SP),因此对使用的模式都要给堆栈指针寄存器SP定义堆栈地址。改变状态寄存器(CPSR)内的状态位,使处理器切换到不同模式,然后给SP赋值就可以实现堆栈的初始化。当然,堆栈的大小视需要而定。


740)this.width=740" border=undefined>

  堆栈初始化程序如下:
InitStack
  MOVr0,lr;保存返回地址
  MOV r1,#Mode_SVC:OR:I_Bit:OR:F_Bit;设置管理模式堆栈
  MSRcpsr_c, r1
  LDRr13, =SVC_STACK
  MOVpc,r0;子程序返回
  系统硬件初始化包括设置外部存储器的类型、数据位宽度等,完成之后即可通过“B Main”语句跳转到C语言主程序。与LDR指令相比,虽然跳转范围小,但是32 MB的地址空间跳转足以满足程序需要,而且运行得更快。[1]
         
          [/td]
        [/tr]
      
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-11-16 21:51 , 耗时 0.090305 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表