ARM7嵌入式系统实践教程
嵌入式开发ARM7试验手册下
主程序流程/*************************************************************************** * 文件名:LEDCON.C* 功能:LED闪烁控制。
对发光二极管LED4进行控制,采用软件延时方法。
* 使用I/O口直接控制LED,采用灌电流方式。
* 说明:将跳线器JP4_LED4短接。
**************************************************************************** #include "config.h"#define LEDCON 0x02000000 /* P0.25引脚控制LED4,低电平点亮 *//*************************************************************************** * 名称:DelayNS()* 功能:长软件延时* 入口参数:dly 延时参数,值越大,延时越久* 出口参数:无**************************************************************************** void DelayNS(uint32 dly){ uint32 i;for(; dly>0; dly--)for(i=0; i<50000; i++);}/*************************************************************************** * 名称:main()* 功能:控制LED闪烁**************************************************************************** int main(void){ PINSEL0 = 0x00000000; // 设置所有管脚连接GPIOPINSEL1 = 0x00000000;IO0DIR = LEDCON; // 设置P0.9连接的LED4控制口为输出while(1){ IO0SET = LEDCON;DelayNS(30);(1) 仿照上册“Keil for ARM实例2:A/D程序设计与电路彷真”的例子创建工程LedCon。
第一章 嵌入式系统基础知识ARM7
中间层
硬件层和软件层之间为中间层,也称为硬件抽象层或板级支持包。 中间层一般包含相关底层硬件的初始化、数据的输入/输出操作和硬 件设备的配置等功能。
中间层主要完成两部分工作: 1、嵌入式系统硬件初始化: 系统初始化过程的3个主要环节:片级初始化、板级初始化和系统级 初始化。
2、硬件相关的设备驱动程序: 硬件相关的设备驱动程序的初始化通常是一个从高到低的过程。设备 驱动程序通常不直接由BSP 使用,而是在系统初始化过程中由BSP 将他们与操作系统中通用的设备驱动程序关联起来,并在随后的应用 中由通用的设备驱动程序调用,实现对硬件设备的操作。
0x 20F = 2×162 + 0×161 + F×160 = 512 + 15 = 527
十进制数转换二进制数
十进制数转换成二进制数的降幂法。 因为:20=1,21=2,22=4,23=8,24=16,25=32,26=64, 27=128 ……。 十进制数29,利用降幂法29可以写成:
29 = 16 + 8 + 4 + 1 = 1×24 + 1×23 + 1×22 + 0×21 + 1×20 = 0b 11101
外围设备接口: LCD电路 A/D、D/A CAN
核心控制模块
嵌入式 微处理器
存储器 电源电路 时钟晶振
复位电路
硬件层结构示意图
1.嵌入式微处理器
嵌入式系统硬件层的核心是嵌入式微处理器,嵌入式微处理器大多工作在为 特定用户群所专门设计的系统中。 嵌入式微处理器的体系结构可以采用冯•诺依曼体系结构或哈佛体系结构;指 令系统可以选用精简指令系统(RISC)和复杂指令系统(CISC)。
目前国内一个被普遍认同的定义是:以应用为中心,以计算机技术为基 础,软件和硬件可裁减,以适应应用系统对功能、可靠性、成本、速度、 体积、功耗严格要求的专用计算机系统。
基于ARM7的嵌入式操作系统_c_OS_平台的剖析与实现
第24卷第2期2009年6月安 徽 工 程 科 技 学 院 学 报Journal of Anhui University of Technology and Science Vol.24.No.2J un.,2009收稿日期:2009202220 作者简介:陶保壮(19722),男,安徽淮南人,硕士,讲师.文章编号:167222477(2009)022*******基于ARM7的嵌入式操作系统μc/OS 2Ⅱ平台的剖析与实现陶保壮(淮南联合大学计算机系,安徽淮南 232038)摘要:嵌入式操作系统发展的运用,能够简化嵌入式系统的应用开发,有效地确保系统的稳定性、安全性和可靠性.因此嵌入式实时操作系统在目标处理器平台上的移植就成为嵌入式软件开发的基础,以此为背景,从算法实现和运行测试的角度出发,系统阐述了嵌入式操作系统μc/OS 2Ⅱ移植到S3C44B0X 的芯片的移植过程和步骤.最终使嵌入式系统开发平台得以实现.关 键 词:嵌入式;S3C44B0X;实时内核μc/OS 2Ⅱ;移植中图分类号:TP391 文献标识码:A随着后PC 时代的到来,计算机用户所关心的系统实时性的问题日益突出.当前,由于技术的进步,嵌入式系统硬件的规模越来越大,功能越来越强,因而使得这一问题的解决成为可能.为了对整个系统资源进行统一协调、指挥和有效控制,使系统的实时性得以充分体现,在嵌入式系统中运用操作系统是非常必要的.而操作系统是一个通用的程序,要在自己的嵌入式系统中应用操作系统,必须结合所用处理器的性能指标进行修改、移植.本文结合具体实例,对基于S3C44B0X 嵌入式操作系统μc/OS 2Ⅱ平台的实现的移植过程和步骤进行研究,最后通过测试,验证了嵌入式开发平台的成功实现.1 嵌入式实时内核μc/OS 2Ⅱ图1 μc/OS 2Ⅱ软件体系结构[2]μc/OS 2Ⅱ,是一个源代码公开、可固化、可裁剪占先式的实时多任务操作系统,它运行就绪状态下优先级最高的任务,其绝大部分源码是用便于移植的C 语言编写,小部分汇编语言代码已被压缩到最低限度,使之可供不同构架的微处理器上使用[1].μc/OS 2Ⅱ属于可剥夺型实时内核,结构小巧,最小内核可编译至2K.系统内核提供的基本服务主要是负责多任务间的的共享数据,同步与通信等.μc/OS 2Ⅱ所具有执行效率高,占用空间小,实时性能好和可扩展性能强等特点受到广大用户的青睐.图1说明了μc/OS 2Ⅱ文件组织与硬件的关系.2 μc/OS 2II 在S3C44B0X 上的移植移植就是指使一个实时内核能在多个微处理器或微控制器上运行.本文采用了SAMSUN 公司的S3C44B0X 芯片,开发环境采用Keil uVision3,基本满足开发要求.S3C44BOX 是一款基于ARM7D TM I (内核)16/32位的SOC 芯片.该芯片片上功能很强大,技术成熟,应用广泛,160管脚L Q FP 封装;8K 字节的Cache ,外部扩充存储器(FP/EDO/SRAM/SRAM/ROM/SDRAM 控制);8个外部中断源;向量中断控制器可配置优先级和向量地址等,具有低成本、低功耗、高性能等优点[3].移植工作主要集中在与处理器相关的3个文件中:OS_CPU.H 、OS_CPU _C.C 、OS_CPU _A.S.其中:OS_CPU.H 文件主要包含与编译器相关的数据类型定义、堆栈类型定义、两个宏定义和几个函数说明;OS_CPU_C.C 包含与移植有关6个C 函数,为OSTaskInit (),OSTaskCreate Hook (),OSTaskDel 2Hook (),OSTaskSw Hook (),OSTaskStat Hook (),OSTime Tick_Hook (),除第一个任务堆栈初始化函数外的其它5个函数为钩子函数,可以没有实际内容,但必须要声明,由系统函数调用,用于扩充自己需要的功能.OS_CPU_A.S 中包含与移植有关的4个汇编语言函数,为OSStart HighRdy (),OSCt xSw (),OSInt Ct xSw (),OSTickISR ().2.1 OS_CPU.H 文件移植μc/OS 2II 不使用C 语言中short ,int 和long 等数据类型定义,因为它们与处理器类型相关,隐含不可移植性.此文件中主要包含与编译器相关数据类型定义、堆栈类型定义、两个宏定义和几个函数说明.数据类型定义部分代码如下[1]:typedef unsigned short IN T16U ;/316位有符号整数3/typedef unsigned long IN T32U ;/332位无符号整数3/typedef signed long IN T32S ;/332位有符号整数3/typedef float FP32;/3单精度浮点数3/typedef unsigned int OS_ST K;/3堆栈入口宽度为16位3/#define OS_ST K_GROWT H 1 /3堆栈增长方向从上向下满递减堆栈3/#define OS_EN TER_CRITICAL (){cpu_sr =OS_CPU_SR_Save ();}/3关中断,执行临界代码3/#define OS_EXIT_CRITICAL (){OS_CPU_SR_Restore (cpu_sr );}/3开中断3/在本例移植中,使用软中断指令SWI 作为底层接口,使用不同功能号区分不同函数.在Keil uVision3中,用关键字_swi 声明一个不存在的函数,则调用该函数就在调用的地方插入一条SWI 指令并可指定功能号.SWI 函数部分代码如下[5]:_swi (0x00)void OS_TASK_SW (void );/3任务级任务切换函数3/_swi (0x01)void_OSStart HighRdy (void );/3运行优先级最高的任务3/_swi (0x02)void OS_EN TER_CRITICAL (void );/3关中断3/_swi (0x03)void OS_EXIT_CRITICAL (void );/3开中断3/2.2 OS_CPU_C.C 文件移植μc/OS 2Ⅱ中,每个任务要有自己的堆栈空间,以便进行任务切换时能将当时处理器现场保存到任务堆栈空间中,在下次执行时再恢复出来.因此必先确定任务堆栈结构,而任务堆栈结构与CPU 体系结构、编译器密切关联.本移植堆栈结构如图2所示.OSEnterSum 用于任务切换时保存和恢复各自OSEnter2图2 任务的堆栈结构[4]Sum 值,以便实现中断的嵌套.OSTaskSt k Init ()函数关键代码如下:3--stk =(unsigned int )task ;/3pc 3/ 3--stk =(unsigned int )task/3lr 3/ 3--stk =0;/3r12.....r1,其它同理3/3--stk =(unsigned int )pdata ;/3r0,第一个参数用r0传递3/ 3--stk =(SVC32MODE|0x0|);/3cp sr 关闭irq ,fiq 3/ 3--stk =(SVC32MODE|0x0);/3spsr IRQ ,关闭FIQ 3/ return ((OS_ST K 3)stk );/3堆栈指针保存在任务的OS_TCB 中3/此文件中的几个系统规定的hook 函数在本移植将它们都设为空函数.2.3 OS_CPU_A.S 文件移植OS_CPU_A.ASM 的改写是移植的难点,它需要用户主要编写4个汇编语言函数[5]:OSStart HighRdy ()、OSCtxSw ()、OSIntCtxSw ()、OSTickISR ().多任务启动函数OSStart ()调用OSStart Hight Rdy ()函数,运行优先级最高的任务.用户在调用该函数之前,必须至少建立一个或更多任务.OSCt xSw ()函数是由任务级任务切换函数OS_TAS K_SW ()调用,实现从低优先级向高优先级切换.文中任务级切换是通过SWI 软中断来实现的.软中断的异常处理程序挂接到CPU 内核,通过修改启动代码里的异常向量表实现.中断服务程序与CPU 芯片相关,中断源的挂接通过增加汇编接口的支持来实现,即在文件IRQ.S 的适当位置添加如下的程序代码[4]:IRQ.Handler HANDL ER IRQ.Exception ;IRQ 中断OSInt Ct xSw ()是中断级任务切换函数,在中断退出时由函数OSInt Exit ()调用.此函数基本原理与任务级切换相同,只是由于进入中断时已保存了被中断任务的环境变量,就不进行类似操作,只需要对堆栈指针进行调整即可.部分代码如下:・65・安 徽 工 程 科 技 学 院 学 报第24卷LDR r4,addr_OSTCBCur ;/3得到当前任务的TCB 地址3/LDR r5,addr_OSTCB HighRdy ;/3得到高优先级任务的TCB 地址3/LDR r5,[r5];/3得到堆栈指针3/LDR sp ,[r5];/3切换到新的堆栈3/STR r5,[r4];/3设置新的当前任务的TCB 地址3/LDMFD sp !,{r4} /3新任务cpsr 出栈3/MSR CPSR_cxsf ,r4LDMFD sp !,{r0-r12,lr ,pc}^;/3r0-r12,lr &pc 出栈,运行新任务3/系统时钟节拍中断函数OSTickISR ()是一个周期性中断,为内核提供时钟节拍.其周期决定了内核所能给应用系统提供的最小时间间隔服务.本移植中,IRQ 是受μc/OS 2II 管理的中断,对FIQ 不处理.时钟节拍的移植可通过汇编宏完成.完成上述工作后,μc/OS 2II 就可以运行在A RM 处理器上了.3 移植测试测试操作系统移植代码的正确性可以在没有应用程序的情况下进行.换句话说,就是让内核自己测试自己.在Keil uVision3下编译、链接成可执行的.axf 文件后,通过SU PERJ TA G 下载到目标板中(博创44B0X 实验箱).笔者通过以下测试用例(编写了OSTaskIdle Hook ()函数,每2000次循环点亮一个L ED ),验证了系统移植是成功的.void OSTaskIdle Hook (void ){static i =0;if (i %20000==0)/3每20000次点亮一个L ED ,3/ { sysUtilsLightLed (L ED_ALL ,FAL SE );/3关闭所有的L ED 3/ sysUtilsLightLed (i %3+1,TRU E );/3循环点亮一个L ED 3/ }i ++;return ;}4 结束语μc/OS 2II 是一个有优势的嵌入式实时操作系统,有良好的应用前景.本文通过具体事例,实现了实时内核μc/OS 2II 在S3C44B0X 上的移植.通过简单的任务例程,在Keil uV_ision3及开发板下进行了调试,从而验证了移植的准确性,此移植的成功为μc/OS 2II 嵌入式实时系统的复杂应用,提供了基本条件.参考文献:[1] 杜春雷.ARM 体系结构与编程[M ].北京:清华大学出版社,2003:792181.[2] J ean J ,L sbrosse ,.μc/OS 2II :the Real Time Kernel[M ].北京:中国电力出版社,2001:902168.[3] K irk Zurell.嵌入式系统的C 程序设计[M ].北京:机械工业出版社,1272259.[4] 周立功.ARM 微处理器基础与实践:2版[M ].北京:北京航空航天大学出版社,2005:1352261.[5] 黄燕平.μc/OS ARM 移植要点详解[M ].北京:北京航空航天大学出版社.2005.[6] 曹巧媛.单片机原理及应用[M ].北京:电子工业出版社,2001:432159,73289.R esearch of μc/OS 2Ⅱplatform B ased on ARM 7TAO Bao 2zhuang(Dept.of comp.,Huainan Unit University ,Huainan 232038,China )Abstract :At p resent ,t he t raditional foreground/background system has become a major bottleneck t hat hinder t he develop ment of embedded systems.But t he int roduction of Embedded Operating System ,can simplify t he application develop ment of embedded system and can also insure a system ’s stability ,relia 2bility.Takes t his as background ,t he transplant process and step s t hat t ransplant Embedded Operating System μc/OS 2Ⅱinto S3C44B0X (S3C44B0X chip is based on ARM7)are p resented in t he stly ,Embedded System Developing Platform is realized.Key words :embedded ;S3C44B0X ;real 2time kernel μc/OS 2Ⅱ;t ransplant ・75・第2期陶保壮:基于ARM7的嵌入式操作系统μc/OS 2Ⅱ平台的剖析与实现。
ARM嵌入式系统基础试验指导书
kw「卜"5妄蓦匸心歸的*曲云Kr* tockfR eadM? for AP M' fwrtjgr 5utr v t. 2諾cup g ASM De ^etoper suta v!二RSBS R5,R2,R1 ;/*R1 减R2 的值后传送至U R5,;s表示会影响cpsr*/SBC R6,R1,R2 ;/*R1减R2的值再减去!CARRY ;后传送至U R6*/RSC R7,R1,R2 ;/*R2减R1的值再减去!CARRY ;后传送至U R7*/stopBL stopEND ;/*程序结束*/2、实验步骤1)编程Step1:启动ADS点击桌面开始程序ARM Developer Suite v1.2 CodeWarrior for ARM Developer Suite,弹出CodeWarrior for ARM Developer Suite 的界面。
Step2:建立新的工程,点击FileNew,弹出新建工程对话框。
Step3:建立新的汇编文件,点击FileNew,弹出新建工程对话框Step4:将汇编文件添加至工程列表,编程。
Step5:设置工程属性。
甲件卜曇随•孟LirFllt 点)06 *WtflQQ 卜□ Sys闻科■畫网茁时• |丄聃*P^TmorIg flff(E)_D广嵌釘士li i j ■ ^;3ft直怜色“屮 o? *dcc,erp ! z Cii t- J『札3 H g C *Step6:编译连接工程。
点击工程管理对话框中的编译链接按钮2)调试Stepl:运行AXD,启动调试界面。
Step2 :设置调试属性。
Step3:加载映像文件。
Step4:单步执行,观察程序的运行,寄存器值的变化。
3)保存退出。
实验二ARM实时仿真环境建立一、实验目的1、熟悉Multie-Server与JTAG下载的方法;2、熟悉ADS开发环境中“AXD Debugger组建的使用;3、熟悉掌握ADS调试程序的方法。
浅谈ARM7嵌入式系统的实验教学
基 地遍 布全 省 1 5个地 市 , 覆盖 了所 有 的 自然 生态 地
[ ] 实验科学与技术 ,0 6,( )8 - 1 J. 2 0 4 2 :8 9 . [ ] 毕建杰 , 2 吕伟丽 , 王守义 , 在农学专 业实验 中培养 学生创新 等. 能力 的实践与探索 [ ] 实验室科学 ,0 6 4 :0 4 . J. 2 0 ( )4 — 2 [ j 郭风法 , 3 宋宪亮 , 赵延兵 , 等建立实 验教学质 量评价体 系 提高 学生创新能力 [ ] 实验室科 学 ,0 7 4)3 - 3 J. 2 0 ( :1 3 . 王建华 , 陈雨海 , 建立院级实验 教学 中心 的实 践与 等. [ 郭风法 , 4]
式技术实验教学 的新思路 ,提 高了实 验教学效果和质量 。 关键词 :A M;嵌 入式系统 ;实验教学指导 R 中图分类号 : 6 2 4 3 G 4 .2 文献标识码 : A 文章编号 :6 2 4 0 ( 09)5 05 — 3 17 — 35 2 0 0 — 0 3 0
Ex e i n a e c i g o h p r me t lta h n n t e ARM7 e e d d s se mb d e y t m
堡 !! = 堕
CN1 —1 5 N 2 3 2/
实
验
室
科
学
第 5期
20 0 9年 l O月
LA BORATORY S ENC CI E
No 5 Oc.Biblioteka 2 0 . £ o 9浅谈 A M R 7嵌人 式系统的实验 教学
闻绍飞 ,张 石 ,鲍喜 荣,余黎煌
五、ARM7嵌入式程序设计(一)
数据定义伪操作(三)
DCDO - 用于分配一段字内存单元,并将每个字单元的内容初始化为相
对于静态基址寄存器R9内容的偏移量。
举例: DCDO xyz
DCFD和DCFDU - 用于分配一段双精度浮点数内存单元,并将字单元的
内容初始化为双精度浮点数。每个双精度浮点数占2个字单元。二者的区 别是DCFDU分配的内存单元并不严格字对齐。
符号定义伪操作(三)
RLIST - 定义一个通用寄存器列表名称,可在LDM/STM指令中使用。
在LDM/STM指令中,寄存器列表中的寄存器的访问次序总是先访问编号
较低的寄存器,再访问编号较高的寄存器,也可以说是编号低的寄存器对 应于存储器的低地址,而不管寄存器列表中各寄存器的排列顺序。为使编
程统一,寄存器列表中各寄存器一般按编号由低到高排列。
DCW和DCWU - 用于分配一段半字对齐的半字内存单元,并用expr初始
化。二者的区别是DCWU分配的内存单元并不严格半字对齐。
举例:
DCFD 1E305, -4E-100
DCFDU 10000,-0.1, 3.1E25 DCFS E3, -4E-9 DCFSU 1.0, -1, 3.1E4
DCQ -100,20000
伪指令(三)
LDR 伪指令有以下两种用途:
当需要读取到寄存器中的数据超过了MOV及MVN指令可以操作的范围时,可 以使用LDR伪指令将该数据读取到寄存器中;
将一个基于PC的地址值或者外部的地址值读取到寄存器中。由于这种地址是 在链接时确定的,所以这种代码不是位置无关的。同时LDR伪指令处的PC值 到数据缓冲区中的目标数据所在的地址的偏移量要小于4KB。
ARM7嵌入式系统实训教程课程设计
ARM7嵌入式系统实训教程课程设计一、课程介绍本课程是针对嵌入式系统方向的学生设计的实训课程,主要介绍ARM7处理器在嵌入式系统中的应用和开发方法。
在本课程中,学生将会学习ARM7体系结构、汇编语言编程、C语言编程、硬件接口编程、操作系统应用等相关知识,通过实验设计开发出具体的ARM7嵌入式系统应用。
二、课程目标1.理解ARM7处理器的体系结构和工作原理;2.掌握ARM汇编语言和C语言编程技术;3.熟悉嵌入式系统硬件接口编程;4.能够应用操作系统进行ARM7嵌入式系统开发;5.具备自主设计开发ARM7嵌入式系统的能力。
三、课程内容1. ARM7体系结构•ARM7架构概述•寄存器和指令集•存储器结构和总线设备2. 汇编语言编程•汇编语言基础•汇编语言指令集•汇编语言程序设计实例3. C语言编程•C语言程序设计基础•C语言在嵌入式系统中的编程技术•C语言程序设计实例4. 硬件接口编程•GPIO口编程技术•中断编程技术•定时器编程技术•外部接口编程技术5. 操作系统应用•操作系统基础•ARM7嵌入式系统操作系统选择•操作系统内核移植•操作系统驱动程序设计四、实训设计本课程将基于ARM7开发板进行实训设计,具体内容如下:1. 实训环境准备•硬件环境介绍•软件环境介绍•环境配置和调试2. 实训项目设计•实训项目选题•项目设计方案•项目制作和调试五、考核与评价本课程的考核方式为实训项目完成情况评估和实训报告成绩评定。
学生需要按要求完成实训项目,并提交详细的实训报告。
六、参考资料•《ARM Cortex-M3与嵌入式系统实战开发》•《ARM微处理器及其应用》•《ARM嵌入式系统原理与应用》以上参考资料均为国内关于ARM7嵌入式系统的著名著作,学生可以根据自身需要自行选择相关阅读材料。
七、总结通过本门课程的学习,学生将获得嵌入式系统开发的基础知识和技能,具备自主设计和开发ARM7嵌入式系统的能力。
同时,本门课程也为学生继续深入学习嵌入式系统领域提供了基础和支持。
ARM嵌入式系统实验教程
高等学校嵌入式系统通用教材·ARM嵌入式系统系列教程ARM嵌入式系统实验教程(二)周立功等编著北京航空航天大学出版社第1章smartARM2200教学实验开发平台硬件结构目录1.1功能特点 (1)1.2硬件原理 (4)1.2.1电路原理图 (4)1.2.2电路原理说明 (4)硬件结构 (27)1.3.1元件布局图 (27)1.3.2跳线器说明..............................一 (28)1.3.3连接器说明 (34)1.4硬件使用的资源 (36)1.5其他 (38)1.5.1 电源 (38)1.5.2跳线器 (38)1.5.3 CPU PACK的安装 (39)1.6温馨提示 (39)第2章基础实验2.1 ADS 1.2集成开发环境练习 (40)2.2汇编指令实验1 (45)2.3汇编指令实验2 (48)2.4汇编指令实验3 (51)2.5汇编指令实验4 (54)2.6汇编指令实验5 (57)2.7 ARM微控制器工作模式实验 (60)2.8 C语言程序实验 (64)2.9 C语言调用汇编程序实验 (67)2.10 GPIO输出控制实验1 (69)2.11 GPIO输出控制实验2 (74)2.12 GPIO输入实验 (76)2.13存储器重映射实验 (79)2.14外部中断实验l (81)2.15外部存储器接口实验1 (83)2.16定时器实验1 (89)2.17 UART实验1 (92)2.18 Modenl接口实验 (96)2.19 I2C接口实验l (98)2.20 PWM输出实验 (102)2.21 RTC实验1 (104)2.22模/数转换器实验 (108)2.23 WDT实验 (113)2.24低功耗实验1 (116)2.25温馨提示 (119)第3章基于.c/os—lI的基础实验3.1"c/OS-II移植实验 (120)3.2蜂鸣器控制实验 (130)3.3 争口中间件应用实验...........................................................................1 36 3.4 Modem【通信实验 (142)3.5 12c总线驱动中间件实验 (145)3.6温馨提示 (149)第4章基于吣,/OS一Ⅱ的综合实验4.1 USB E。
嵌入式系统教案(3-ARM7体系结构)
当发生数据中止时,根据指令的类型产生不同的动作:
数据转移指令LDR、STR回写到被修改的基址寄存器。
交换指令SWP中止好像没有被执行过一样。
(八)程序状态寄存器
ARM7TDMI内核包含1个CPSR和5个供异常处理程序使用的SPSR。CPSR包含:4个条件代码标志(负N、零Z、进位C和溢出V);2个中断禁止位,分别用于一种类型的中断;5个对当前处理器模式进行编码的位;1个用于指示当前执行指令(ARM还是Thumb)的位。
1、条件代码标志
大多数数值处理指令可以选择条件是否修改条件代码标志。一般的,如果指令带S后缀,则指令会修改条件代码标志;但有一些指令总是改变条件代码标志。
如果异常处理程序已经把返回地址拷贝到堆栈,可以使用一条多寄存器传送指令来恢复用户寄存器并实现返回。
2、进入异常
当处理异常时,ARM7TDMI内核会:
(1)在适当的LR中保存下一条指令的地址。当异常入口来自:
ARM状态下,ARM7TDMI将下一条指令的地址复制到LR中(当前PC+4或PC+8,取决于异常的类型)。
V:使用加法/减法运算,当发生有符号溢出时,V=1;否则,V=0。其他指令V通常不变。
2、控制位
CPSR的最低8位为控制位。它们分别是中断禁止位、T位、模式位。当发生异常时,控制位改变。当处理器在一个特权模式下操作时,可用软件操作这些位。
(1)中断禁止位
I和F位都是中断禁止位:
当I位置位时,IRQ中断被禁止。
(四)体系结构直接支持的数据类型
ARM处理器支持下列数据类型:
字节:8位
半字:16位(必须分配为占用2字节)
字:32位(必须分配为占用4字节)
(五)处理器状态
ARM嵌入式系统实验教程课程设计
ARM嵌入式系统实验教程课程设计1. 简介随着科技的不断发展,嵌入式系统越来越广泛地应用于各个领域,如消费电子、医疗、交通、军事等。
嵌入式系统的性能越来越好,体积越来越小,成本也越来越低廉。
而ARM嵌入式系统,因其拥有高性能、低功耗、高集成度、灵活性等优势,已经成为嵌入式系统的主流。
本文旨在为学习ARM嵌入式系统的同学提供一份实验教程课程设计,通过实践操作,使学生了解ARM嵌入式系统的相关知识和应用。
2. 实验内容2.1 环境搭建学习ARM嵌入式系统必须先了解其开发环境,在本实验中,我们将使用Keil MDK作为开发工具,学生需要掌握Keil MDK的安装和配置。
2.2 编写第一个程序通过编写一个简单的程序,学生可以了解ARM汇编语言的基础知识,以及如何在Keil MDK中创建、编译和调试程序。
2.3 GPIO控制学生将会学习如何在ARM嵌入式系统上控制GPIO,包括输入输出、上拉下拉电阻等。
2.4 UART通信UART通信是嵌入式系统中常用的一种通信方式,学生将会学习如何使用ARM嵌入式系统的UART模块进行数据传输。
2.5 中断处理中断是嵌入式系统中的一种重要机制,学生将会了解中断的原理和使用中断的方法,包括IRQ和FIQ两种中断。
2.6 定时器和计数器学生将会了解ARM嵌入式系统中的定时器和计数器的原理和应用,包括通用定时器、看门狗定时器等。
3. 实验要求3.1 硬件要求学生需要准备ARM Cortex-M3开发板、USB转TTL模块、串口线、LED等实验工具。
3.2 软件要求学生需要安装Keil MDK、JLink驱动程序等软件。
3.3 实验要求学生需要按照实验指导书中给出的步骤完成实验,并编写实验报告,报告中需要包括实验的目的、原理、步骤、结果和分析。
4. 实验效果经过本实验的学习,学生将能够掌握ARM嵌入式系统的基础知识和应用,包括Keil MDK的安装和配置、ARM汇编语言的基础知识、GPIO控制、UART通信、中断处理、定时器和计数器应用等方面。
ARM7嵌入式系统实践教程
3、创建源程序文件
二、步骤
源程序管理窗口
3、创建源程序文件
二、步骤
(A)在源程序管理窗口中,录入源程序代码 (B)执行菜单命令File|Save保存源程序
4、编写源程序
二、步骤
5、配置编译链接参数
(1)、显示ARM Linker配置窗口 (A)执行菜单命令Edit|DebugRel Settings,打开DebugRel Settings窗口 (B)在DebugRel Settings Panels中,选中Linker|ARM Linker项
2.2编写C语言程序
一、目的
(1) 学会使用ADS1.2编写、调试C语言程序。 (2) 掌握使用地址指针访问存储器的编程方法。 (3) 熟悉单步、分段调试程序方法与技巧。
二、步骤
1、启动IDE
在Windows XP系统窗口,执行【所有程序】| ARM Developer Suite V1.2|CodeWarrior For ARM Developer Suite 菜单命令,打 开IDE
程序指针
二、步骤
8、调试程序
(3)定位到用户程序的第一条语句处 (A)单击 程序执行按钮,执行程序,程序指针执向用户程序的第一条语句,如下图:
程序指针
二、步骤
8、调试程序
(4)显示变量窗口 (A)执行Processor Views|Variables菜单命令,显示变量窗口,如下图:
全局变量选项卡 局部变量选项卡
程序指针PC、断点 要调试的语句
二、步骤
8、调试程序
(5)调试语句ClearMemory((unsigned char *)0x40003000,256); (C)语句ClearMemory((unsigned char *)0x40003000,256)的功能 将以0x40003000为起始地址,连续256个字节存储单元清0。 (D)语句ClearMemory((unsigned char *)0x40003000,256)执行前,将查看 0x40003000为起始地址,连续256个字节存储单元内容。 在存储器窗口,StartAddress地址栏输入0x40003000,然后回车,则0x40003000 为起始地址,连续256个字节存储单元内如如下图:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.3.2 LED显示与按键识别实验
六、编程
2、调用变量窗口、存储窗口 (1)单击按钮 ,进入用户程序调试窗口 (2)执行菜单Processor Views|Variables菜单命令,打开变量窗口,如下图: (3)执行菜单Processor Views|Memory菜单命令,打开存储器窗口,如下图:
2.3.2 LED显示与按键识别实验
三、接口电路
1、按键识别电路 (1)、Key1为按键; (2)、R18电阻 (3)、P0.20为 嵌入式处理器LPC2290 P0口的20引脚 (4)、工作原理:Key1键处于按下状态,P0.20引脚为低电平; Key1键处于 释放状态,P0.20引脚为高电平. 编写程序测试P0.20引脚为低电平或高电平 从而确认KEY1键是按下或未按下。
2.3.2 LED显示与按键识别实验
六、编程
1、启动IDE 在Windows XP系统窗口,执行【所有程序】| ARM Developer Suite V1.2|CodeWarrior For ARM Developer Suite 菜单命令,打 开IDE
2.3.2 LED显示与按键识别实验
六、编程
2.3.2 LED显示与按键识别实验
五、LED编程
1、配置P2.16、。。。、P2.23引脚为GPIO输出 将IO2DIR的[23:16]配置为1,P2.16、。。。、P2.23引脚即为GPIO输出 功能 配置语句: IO2DIR&=0xFF<<16; 2、控制LED (1)、仅控制LED1 配置 IO2SET 的位[16]=1 P2.16引脚为高电平,LED1灭,控制数据为0xFF01FFFF 配置 IO2CLR 的位[16]=1 P2.16引脚为低电平,LED1亮,控制数据为0xFF01FFFF LED2、。。。、LED8控制原理与LED1相同,控制数据分别为0xFF02FFFF、 0xFF04FFFF、 0xFF08FFFF、 0xFF10FFFF、 0xFF20FFFF、 0xFF40FFFF、 0xFF80FFFF (2)编写程序,使LED1、。。。、LED8按照控制策略显示。
编译main.c生成的输出文件
2.3.2 LED显示与按键识别实验
5、链接程序 单击按钮 ,链接程序,生成的可执行镜像文件如下图:
六、编程
镜像文件
2.3.2 LED显示与按键识别实验
六、编程
1、启动调试器、调入要调试的镜像文件 单击按钮 ,启动调试器AxD Debugger、调入要调试的镜像文件Exp2301.axf,如下 图:
2.3.2 LED显示与按键识别实验 四、Key1编程
1、配置P0.20引脚为GPIO功能 将PINSEL1的位[9:8]配置00,P0.20引脚即为GPIO功能 配置语句: PINSEL1&=(~(3<<8)); 2、配置P0.20引脚为GPIO输入 将IO0DIR的位20配置为0,P0.20引脚即为GPIO输入功能 配置语句: IO0DIR&=~(1<<20); 3、KEY1按键识别原理 IO0PIN寄存器位20=0 P0.20引脚为低电平; IO0PIN寄存器位20=1 P0.20引脚为高电平; 编写程序,判断IO0PIN位20为0或1来判断KEY1按键是否按下
2.3.2 LED显示与按键识别实验
三、接口电路
1、按键识别电路 (1)、LED1、LED2、。。。、LED8为发光二极管; (2)、R89、R90、R91、R92、R93、R94、R95、R96为电阻 (3)、P2.16、。。。P2.23为嵌入式处理器LPC2290 P2口的引脚 (4)、工作原理: 8路发光二极管控制电路。 以LED1发光二极管控制电路为例,说明发光二极管控制原理: P2.16引脚高电平,LED1灭; P2.16引脚低电平,LED1亮;编写程序,控 制P2.16引脚为高低电平,从而可控制LED1灭或亮。
2.3.2 LED显示与按键识别实验
六、编程
3、调试 (2)、调试LED • 鼠标移动到行号18前的空白处,双击鼠标,删除断点 • 鼠标移动到行号41前的空白处,双击鼠标,设置断点,记录为断点2 • 单击按钮 ,执行程序,程序停在断点1处, 如果有一个LED亮,依据DISP_TAB[nStep]查看显示数据,判别显示数据是否对应 亮LED,如果不对应,修改显示数据。 如果没有一个LED亮,依据以下顺序排除错误: 依据DISP_TAB[nStep]查看显示数据,如果错,修改显示数据 查看P2.16、。。。、P2.23初始化,如有错,修改错误 查看电路,如果电路没有问题,LED相应电路损坏 (3)、运行程序 • 删除所有断点 • 单击按钮 ,执行程序。按照要求操作,观察程序运行效果.
六、编程
2.3.2 LED显示与按键识别实验
六、编程
3、录入源程序 在源程序编辑窗口中,录入程序代码,然后执行File|Save菜单命令,保存源程序。
2.3.2 LED显示与按键识别实验
六、编程
4、编译、改错 单击按钮 ,编译程序,如有错误,根据错误提示信息,修改程序。然后重复执行 编译、改错操作,直至编译通过,生成输出文件如下图:
2.3.2 LED显示与按键识别实验
六、编程
3、调试 (1)、KEY1按键识别 • 鼠标移动到行号29前的空白处,双击鼠标,删除断点 • 鼠标移动到行号18前的空白处,双击鼠标,设置断点,记录为断点1 • 单击按钮 ,执行程序,程序停在断点1;单击按钮 ,执行x=IO0PIN语句 • 在Variable窗口,鼠标移动到变量x值处,右击鼠标,执行Format|Binary菜单命 令。 • 键KEY1未按下,查看变量 X位20的值,X[20]=0 • 按下KEY1 • 单击按钮 ,执行程序,程序停在断点1;单击按钮 ,执行x=IO0PIN语句 • 在Variable窗口,鼠标移动到变量x值处,右击鼠标,执行Format|Binary菜单命 令。 • 键KEY1按下,查看变量 X位20的值,如果X[20]=1,正确;否则,错误,错误检查次 序为: P0.20初始化 KEY1电路 如果以上都正确,KEY1损坏。
2.3.2 LED显示与按键识别实验
பைடு நூலகம்
一、目的
(1) 进一步掌握GPIO接口电路设计方法。 (2) 了解LED、按键接口电路的工作原理。 (3) 掌握LED显示控制、按键识别的编程方法。
2.3.2 LED显示与按键识别实验
二、题目
1、 8个LED按流水方式显示,即LED1亮,其他 LED灭;然后LED2亮,其他LED灭;以此类推。 重复进行以上操作。 2、 当LED2、LED4、LED6、LED8亮时,蜂鸣器 响;否则蜂鸣器不响。 3、 检测KEY1按键,如果KEY1按下,当前LED、 蜂鸣器操作状态保持不变;否则,继续执行1、 2控制策略。
2.3.2 LED显示与按键识别实验
3、调试控制蜂鸣器 (2)、配置蜂鸣器控制数据 • 执行Processor Views|Memory菜单命令,打开存储器窗口 • 在Start Address栏输入0x40003100,回车确认 • 双击存储单元0x40003100,录入0x03,回车确认,如下图:
六、编程
2.3.2 LED显示与按键识别实验
六、编程
3、调试控制蜂鸣器 (3)、调试 • 点击按钮 ,程序停在断点2处。如果蜂蜜器响,正确;如果蜂鸣器不响。检查 P0.7初始化、蜂鸣器电路。 • 点击按钮 ,程序停在断点1处。蜂蜜器不响。 • 去掉断点1、断点2,运行程序。 4、思考题 设计调试项,按照设计思路调试
1、创建工程:在IDE窗口中,执行File|New菜单命令,打开New窗口 (A)选择工程模板:ARM Executable Image For MagicARM2200 (B)为工程起一个名字: Exp2302 (C)配置工程存储路径:G:\Exp2302 工程模板 (D)击【确定】按钮,完成工程创建 工程名
工程存储路径
2.3.2 LED显示与按键识别实验
工程管理窗口
生成目标
六、编程
文件选项卡
链接顺序选项卡
2.3.2 LED显示与按键识别实验
工程管理存储路径内容
六、编程
数据目录 工程文件
输出文件存储路径
2.3.2 LED显示与按键识别实验
2、打开源程序编辑窗口 (1)、在工程管理窗口中,展开User目录; (2)、双击文件main.c,打开源程序main.c编程窗口,如下图