ARM编程进阶之三 —— 裸机硬件的控制方法与例程

发布者:恬淡如云最新更新时间:2018-10-21 来源: eefocus关键字:ARM编程  裸机硬件  控制方法 手机看文章 扫描二维码
随时随地手机看文章

到目前为止,我们已经能够编写较复杂的ARM汇编程序了,遗憾的是这些程序是运行在ads自带的虚拟开发板ARMUL下的,(在axd界面下,单击options->configure target,可见到如下的目标板配置界面)

image

而我们最终的目的是要让程序运行在实际的硬件产品上,并能控制硬件。本文将初步介绍如何建立真实硬件的开发和调试环境,编写控制硬件的程序的方法。

第一部分内容:如何建立真实硬件的开发和调试环境

由于基于ARM的嵌入式开发板种类众多,硬件仿真器、调试代理软件也是种类繁多,使用方法各异,这就为学习编写ARM裸机程序控制硬件带来了较大的难度。为便于初学者快速入门,有必要选择一套成熟、易于学习和实践的软硬件环境。经过比较,本文(包括本系列所有与ARM硬件有关的文章)均采用友善之臂提供的带有nor flash 的qq2440(或者mini2440)嵌入式开发板(自带简易的jtag调试仿真器小板)和h-jtag调试器代理软件。以下关于开发和调试环境的搭建,均来源于友善之臂提供的qq2440用户手册(稍微修改),在此表示敬意。

1、 安装并设置H-JTAG

(1)安装H-JTAG

H-JTAG 安装文件位于 “Windows 平台工具\H-JTAG”目录,双击运行,按照其提示安装即可。

clip_image002

安装完毕,会在桌面生成H-JTAG 和H-Flasher 快捷方式,双击运行H-JTAG,程序将自动检测是否连接了JTAG 设备,因为之前我们还没有做任何设置,所以会跳出一个提示窗口:

clip_image004

点击确定,进入程序主界面,因为没有连接任何目标器件,因此显示如图所示:

clip_image006

(2)设置JTAG 端口

在H-JTAG 主界面的菜单里点Setting->Jtag Settings,作如下图所示设置,点OK 返回主界面。

clip_image008

(3)设置初始化脚本

把本文提供给你的qq2440_yangzhu.his 和H-Flasher_QQ2440_yangzhu.hfc 文件(点击下载)复制到H-JTAG 的安装目录,如图:

注:后续图及文档中的FriendlyARM2440.his都请认为是qq2440_yangzhu.his,H-Flasher_QQ2440.hfc都请认为是H-Flasher_QQ2440_yangzhu.hfc

clip_image010

在H-JTAG 的主界面,点Script->Init Script,跳出Init Script 窗口,点该窗口下面的Load 按钮,找到并选择打开刚刚复制的FriendlyARM2440.his 文件,如图:

clip_image012

这时,Init Script 窗口会被载入的脚本填充,如图,注意要点选“Enable Auto Init”,

点OK 退回H-JTAG 主界面:

clip_image014

(4)检测目标器件

使用开发板附带的JTAG 小板连接开发板的JTAG 接口,并接上打开电源。点主菜单Operations->Detect Target,或者点工具栏相应的图标也可以,这时就可以看到已经检测到目标器件了。

提示:如果没有设置初始化脚本,也可以检测到CPU,但无法进行下面的单步调试。

clip_image016

(5)设置自动下载程序到nor flash

单击Flasher,点选”Auto Download”

clip_image018

2、为H-JTAG 配置AXD DEBUGGER

(1)运行AXD Debugger

如图所示打开运行ADS1.2 软件的调试软件-AXD Debugger:

clip_image002[4]

AXD Debugger 主界面:

clip_image004[6]

(2)设置AXD Debugger

点菜单Options->Confiuguer Target…,出现如下窗口:

clip_image006[4]

在该窗口中点击Add 按钮,跳出选择文件对话框,找到H-JTAG 安装目录,选择并打开里面的H-JTAG.dll 文件,如图。

clip_image008[5]

此时会在Choose Target 窗口中多了一项H-JTAG,如图,点OK 返回AXD Debugger主界面。

clip_image010[6]

(3) 使用H-JTAG 在ADS1.2 环境下进行仿真调试

关闭AXD Debugger。在CodeWarrior中点击菜单Project->Debug,它将自动启动AXD Debugger,AXD Debugger会启动目标映象,并通过Jtag 下载至目标板,这时在AXD Debugger 底部的状态栏会出现下载过程提示,下载完毕就可以进行单步或者全速调试了,调试过程中您可以看到CPU 各个寄存器的值,也可以设置断点等,详细的用法请参考ADS 附带的英文说明手册,这基本上和常见的VisualC++等集成开发环境是类似的。

第二部分内容:编写控制裸机硬件的方法与例程

1、程序控制硬件的编程原理

每一种硬件在其控制器芯片上都会有物理的寄存器(注意这里的寄存器不是指的CPU内部的寄存器R1等等,而是指的硬件芯片上的存储单元,在ARM体系下,这些存储单元与内存进行统一编址,可以被CPU通过访存指令,像访问内存一样去访问),这些寄存器通常分为3种类型:命令寄存器、状态寄存器、数据寄存器。程序控制硬件的办法通常是:程序通过str指令向命令寄存器写入合适的内容,就可以完成对硬件进行配置的操作或者要求硬件进行某种物理操作。到此为止,软件就完成了所有它该做的事情,之后硬件会自动完成相应操作,在硬件完成操作后,程序又可以通过ldr指令从数据寄存器中获得想要的数据,或者从状态寄存器中获知硬件的状态。可见,程序控制硬件,简单地说,其实就是程序对硬件的寄存器进行读写操作,命令硬件完成操作,获取硬件状态和数据,仅此而已。这里的关键是:某个硬件寄存器的内存地址是多少?为使硬件执行某个操作,应当向哪个寄存器写入什么值?这些都是程序员需要解决的问题,而这些问题的解决,关键在于程序员能:a)理解要控制的硬件的运作机制;b)能熟练查阅硬件的手册(手册中会指明寄存器的内存地址以及寄存器各种取值的含义);c)能看懂硬件的连线原理图

2、最简单的裸机硬件控制程序(控制led灯的亮灭,点击下载示例代码

如何才能点亮led灯呢?首先必须先看硬件连接图

image

显而易见,要点亮led1,则必须在nLED_1连接线上输出低电平。

image

要在nLED_1连接线上输出低电平,就必须让CPU的GPB5为低电平。

如何才能让CPU的GPB5为低电平?通过查阅S3C2440的硬件手册(点击下载)的第9章可知,需要将地址为0x56000010的这个寄存器的bit11和10设置为01,从而将GPB5这个管脚配置为输出,然后将地址为0x56000014的这个寄存器的bit5写为0,这样CPU的GPB5管脚就会输出低电平。

这就对应于示例代码中的如下关键代码:

#define    GPBCON        (*(volatile unsigned long *)0x56000010)
#define    GPBDAT        (*(volatile unsigned long *)0x56000014)
#define LEDS   (1<<5|1<<6|1<<7|1<<8)
GPBCON     = 0x00015400;
GPBDAT=(GPBDAT&(~LEDS)) | (1<<6|1<<7|1<<8);

image

image

image

示例代码中的readme.txt中,说道:

for running on real board, you need do following 3 things:
1. Change Target from ARM7TDMI to ARM920t
2. Change load address from 0x8000 to 0x30000000
3. Change image layout for placing init.o(INIT2440) at the first

做1的原因是开发板的CPU——S3C2440是ARM920t的内核,所以编译器编译时必须匹配

image 

image

做2的原因是开发板的RAM位于0x30000000——0x34000000地址(共64M),程序必须被调试器加载到ARM才能运行。

特别说明:配置中的0x30000000被我称为“程序的期望加载地址”,简称“加载地址”。“运行地址”与“加载地址”是很重要的2个概念,请大家一定要弄清楚。“运行地址”是给编译器看的,通过看“运行地址”编译器就能计算出程序中各个标号、变量、函数等在内存中的绝对地址,从而完成涉及地址的指令的正确编译。而“加载地址”是给调试器或者操作系统看的,它的作用是让调试器或者操作系统将程序加载到正确(期望)的内存地址。通常情况下,代码的这2个地址是相等的,数据则不一定。

image

做3的原因是init.o的INIT2440段的代码是首先运行的代码,因此必须放在整个二进制程序文件的最开头

image


关键字:ARM编程  裸机硬件  控制方法 引用地址:ARM编程进阶之三 —— 裸机硬件的控制方法与例程

上一篇:ARM的寻址方式
下一篇:ARM编程进阶之二 —— ATPCS与混合编程

推荐阅读最新更新时间:2024-03-16 16:17

ARM编程模式和七种工作模式
一、编程模式:ARM CPU的基本设定、编程时遵守的规则。如CPU所使用指令大小等。 1、ARM基本设定采用32位架构 2、ARM的约定: Byte 8bits 永远不会变 Halford: 16bits (2byte) 半字 Word: 32 bits 3、大部分ARM core提供ARM指令集(32bit) Thumb指令集(16bit) Thumb2指令集(16 或 32bit) 每种汇编指令都是特定CPU的特性,ARM提供了三种指令集都可以编程。 二、ARM处理器工作模式:(7个基本工作模式) User:(用户模式)非特权模式,大部分任务执行在这种模式(除这以外都是特权模式) FIQ(快速) 当一个高优先级(fast)
[单片机]
ARM设计思想与高效C编程
一.RISC设计思想 ARM内核采用RISC体系结构。RISC是一种设计思想,其目标是设计出一套能在高时钟频率下单周期执行,简单而有效的指令集。RISC的设计重点在于由硬件执行的指令的复杂度,这是因为软件比硬件容易提供更大的灵活性和更高的智能。因此,RISC设计对编译器有更高的要求;相反,传统的复杂指令集的计算机(CISC)则更侧重于硬件执行指令的功能性,使CISC变得更复杂。 RISC设计思想主要由下面4个设计准则来实现: 指令集 RISC处理器减少了指令种类,每条指令的长度都是固定的,允许流水线在当前指令译码阶段去取其下一条指令;而CISC处理器中,指令的长度通常不固定,执行也需要多个周期。 流水线 在理想情况下,流
[单片机]
arm 裸板编程的总结(上)
一、嵌入式系统概述 1.微处理器相关 1.体系结构 a.冯诺依曼体系 特点:指令和数据公用同一条数据总线 注重:主频、缓存 b.哈佛体系 特点:指令和数据分开存储,使用不同的数据总线进行传输 注重:流水线的层级 缺点:不适用于 跳转(调度)比较频繁的场合 2.RISC与CISC a.CISC特点: 1.指令多 2.寻址方式多(甚至可以在内存和内存之间进行寻址,而不通过寄存器) 3.2/8法则 b.RISC特点: 1.指令少,好记 2.寻址方式少,一般只支持load/store两类访存指令 3.流水线 2.嵌入式系统的组成 1.软件 操作系统(可选) 应用程序 网络(可选) 2.硬件 a.嵌入式微处理器 分类: MCU MP
[单片机]
ARM编程序设计之--数据搬移
原来只知道一个MOV指令,却不知道还有个MOVS,在书上查找了只有MOV传送指令, num EQU 20;定义一个常量num,值为20 ;--------------------------------------------------------------------------------------------------- ;AREA分析如下: ;语法格式: ;AREA 段名 属性1,属性2,。。。 ;AREA伪指令用于定义一个代码段或数据段。其中段名若以数字开头,则该段名需用 | ;括起来,如|1_test|;属性字段表示该代码段(或数据段) 的相关属性,多个属性用逗号分开常用 ;属性如下:
[单片机]
ARM处理器系统初始化编程注意事项
在上述系统初始化过程中有以下两点需要注意,如果处理不好就可能出现程序跑飞的情况。 1)如果需要将程序从flash搬移到DRAM中运行 在现代嵌入式系统中,由于DRAM的速度比flash的速度快很多,所以除了极少数对性能要求不高但对成本要求很高的系统把程序放在flash中并一直在flash中运行外,大部分嵌入式系统都是将程序从flash芯片搬到DRAM芯片中运行,这样就会存在一个问题,因为我们编译链接程序都是将程序链接到程序最后运行的场所DRAM中的地址上,但是系统启动时只能从flash中读取指令,所以从系统启动读取的第一条指令到进入到DRAM运行前的程序代码是与地址无关的,如果要跳转到某个标号处运行,必须是基于pc的,不能是绝对跳转
[单片机]
开关电源的冲击电流控制方法
1. 引言 开关电源 的输入一般有滤波器来减小 电源 反馈到输入的纹波,输入滤波器一般有 电容 和电感组成∏形滤波器,图1. 和图2. 分别为典型的AC/DC电源输入 电路 和DC/DC电源输入电路 由于电容器在瞬态时可以看成是短路的,当开关电源上电时,会产生非常大的冲击 电流 ,冲击电流的幅度要比稳态工作电流大很多,如对冲击电流不加以限制,不但会烧坏保险丝,烧毁接插件,还会由于共同输入阻抗而干扰附近的电器设备。 欧洲电信标准协会(the European Telecommunications Standards Institute)对用于通信系统的开关电源的冲击电流大小做了规定,图3为
[电源管理]
开关电源的冲击电流<font color='red'>控制方法</font>
步进电机升降速曲线控制方法
    在一些控制简单或要求低成本的运动控制系统中,经常用步进电机做执行元件。步进电机在这种应用场合下最大的优势是:可以开环方式控制而无需反馈就能对位置和速度进行控制。但也正是因为负载位置对控制电路没有反馈,步进电机就必须正确响应每次励磁变化。如果励磁频率选择不当,电机不能够移到新的位置,那么实际的负载位置相对控制器所期待的位置出现永久误差,即发生失步现象或过冲现象。因此步进电机开环控制系统中,如何防止失步和过冲是开环控制系统能否正常运行的关键。      失步和过冲现象分别出现在步进电机启动和停止的时候。一般情况下,系统的极限启动频率比较低,而要求的运行速度往往比较高。如果系统以要求的运行速度直接启动,因为该速度已超过极限启动频
[嵌入式]
TQ2440 学习笔记—— 11、嵌入式编程基础知识【arm-linux-objcopy、objdump选项】
1、arm-linux-objcopy 选项 arm-linux-objcopy 被用来复制一个目标文件的内容到另一个文件中,可以使用不同于源文件的格式来输出目的文件,即可以进行格式转换。 常用arm-linux-objcopy 来将ELF格式的可执行文件转换为二进制文件。 arm-linux-objcopy 的使用格式如下: 2、arm-linux-objdump 选项 arm-linux-objdump 用于显示二进制文件信息,常用来查看反汇编代码 使用格式如下:
[单片机]
TQ2440 学习笔记—— 11、嵌入式<font color='red'>编程</font>基础知识【<font color='red'>arm</font>-linux-objcopy、objdump选项】
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved