ARM嵌入式实验Word文档下载推荐.docx

上传人:b****2 文档编号:1392711 上传时间:2023-04-30 格式:DOCX 页数:18 大小:420.59KB
下载 相关 举报
ARM嵌入式实验Word文档下载推荐.docx_第1页
第1页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第2页
第2页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第3页
第3页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第4页
第4页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第5页
第5页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第6页
第6页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第7页
第7页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第8页
第8页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第9页
第9页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第10页
第10页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第11页
第11页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第12页
第12页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第13页
第13页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第14页
第14页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第15页
第15页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第16页
第16页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第17页
第17页 / 共18页
ARM嵌入式实验Word文档下载推荐.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

ARM嵌入式实验Word文档下载推荐.docx

《ARM嵌入式实验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ARM嵌入式实验Word文档下载推荐.docx(18页珍藏版)》请在冰点文库上搜索。

ARM嵌入式实验Word文档下载推荐.docx

微处理器刚上电时,内部寄存器处于未知状态,为了使微处理器能够切换到一个初始状态,需要对微处理器进行一个复位操作。

所有微处理器都有一个复位管脚,当复位管脚上的输入信号有效时,芯片复位。

为了使微处理器在上电时能够自动进行复位,需要对复位管脚设计专门的电路,使其在系统上电初期有效。

时钟和复位管脚的电路原理图

4.JTAG下载电路

JTAG是ARM上程序下载和调试的重要接口,他是进一步开发的前提。

标准的JTAG接口是4线接口:

TMS、TCK、TDI以及TDO,分别为模式选择、时钟、数据输入和数据输出信号线。

为了使接口能够更加稳定的工作,通常还需要对某些信号上拉下拉加限流电阻等。

具体的接口电路需要查看不同芯片的图片才能确定。

5.键盘输入电路

键盘输入电路

只需要两个按键,复位键和控制键,可以有两个管脚来检测按键状态。

当按键没被按下前,对应的管脚处于上拉状态(高电平),当某个按键被按下时对应的管脚处于接地,通常读取对应管脚的电平,就可以判断按键的状态。

6.LED输出电路

七段LED我们称为共阴极。

1、扫描电路

我们需要显示的数字总共有六个,分秒毫各两个,每控制一个七段码的显示至少需要7个管脚。

七段码LED输出电路

二、软件设计:

1.秒表计时器控制

void_irqIRQ_Timer0(void){//

LED_Refersh=1;

//更新七段码的显示

if(segid<

5){segid++;

return;

}//还没到0.01S

else{segid=0;

}

if(clk_on){ms++;

}//如果秒表的状态为打开,则增加秒表的计数值

if(ms>

=100){ms=0;

second++;

}//如果毫秒的计数达到100,向秒进一

if(second>

=60){second++;

minute++;

if(minute>

=60){minute=0;

T0IR=0X01;

//清除中断标志

VICVectAddr=0x00;

//通知中断处理结束

几点注意:

中断处理程序的声明

清除中断标志:

TOIR为中断寄存器,如果有中断产生,IR中的对应位会置位,相对应的IR写入1会恢复对应中断。

向量地址寄存器在发生中断时,IRQ服务程序可读取该寄存器并跳转到读出的地址。

秒表计时程序段。

2.键盘输入扫描程序

voidkey_handler(void){

//变量用于当单次按键时间较长时,防止按键被误判为多次按下

if(key_en==0){

if((IO0PIN&

key_reset)==key_set&

&

//复位键未被按下

(IO0PIN&

key_ctr1)==key_ctr1){//控制键未被按下

key_en=1;

//按键被松开,则重新使能按键检测

}

}elseif((IO0PIN&

key_reset)==0){//复位按键被按下

clk_on=0;

//停表

ms=0;

second=0;

minute=0;

//清零秒表

key_en=0;

//在按键松开之前防止被误判再次触发

}elseif((IO0PIN&

key_ctr1)==0){//控制键被按下

if(clk_on==1){clk_on=0;

}//如果当前状态为走表,则停表

else{clk_en=0;

}//如果当前状态为停表,则走表

key_en=0;

其中局部key_en用于防止当某个按键按下的时间稍长时被误判为多次重复按下,当检测到有按键被按下时,程序完成相应的按键操作后将key_en置零,此后所有的按键操作都会被忽略,当按键松开时再将key_en置1,重新开启按键检测。

3.LED七段码扫描程序

voiddispLED£

¨

intsegid,intms,intsecond,intminute£

©

{

intdigi;

//当前显示的七段LED数值

intSEGS_A2G;

//最低七位为七段码LED端口a~g的电平值

intSEGS_GND=0X3F;

//设变量的最低六位为1

if£

LED_Refresh==0£

//如果不需要更新,则返回

else{LED_Refresh=0;

switch(segid){

case0:

IO0SET=SEGS_GND;

IO0CLR=(int)(1<

<

0);

digi=ms%10;

break;

case1:

1);

digi=ms/10;

case2:

2);

digi=second%10;

case3:

3);

digi=second/10;

case4:

4);

digi=minute%10;

case5:

5);

digi=minute/10;

default:

break;

switch(digi)//根据digi的值来设置SEGS_A2G

SEGS_A2G=0X3F;

//SEGS_A2G稍后用来设置P1.19~P1.25

SEGS_A2G=0X06;

SEGS_A2G=0X5B;

SEGS_A2G=0X4F;

SEGS_A2G=0X66;

SEGS_A2G=0X6D;

case6:

SEGS_A2G=0X7D;

case7:

SEGS_A2G=0X07;

case8:

SEGS_A2G=0X7F;

case9:

SEGS_A2G=0X6F;

IO1CLR=(int)(0x3f<

19);

//设置P1.19~P1.25为低电平

IO1SET=(int)(SEGS_A2G<

//根据SEGS_A2G的值来设置P1.19~P1.25

//设置管脚值

4.主控程序

主函数反复检测键盘的输入如果发现有键盘按下,则处理按键,如果LED更新标志LED_Refresh被置1,则更新LED显示。

时间中断处理函数IRQ_Timer0每0.00133s被触发一次,设置led更新为使能状态,如果累计发生六次时间中断,并且秒表处于走表状态,则将秒表的计时增加0.01s.

变量clk_on被初始化为0,使秒表在刚开启时处于停表状态。

intminute,second,ms;

/全局变量声明

intsegid;

intclk_on=0;

//控制停表走表

intkey_en;

//控制按键使能,用来防止按键误判

intLED_Refresh;

//控制led更新

intmain(void){

while

(1){

key_handler();

//检测按键输入

dispLED(segid,ms,second,minute);

//控制led输出

return0;

实验总结:

使用LPC2131型ARM微处理器和相应的外围器件来实现一个数字秒表,其中包含了,电源复位电路,JTAG下载电路,时钟电路等。

ARM的I/O主要是通过IODIR.IOPIN.IOSET.IOCLR来控制的。

设计时要充分考虑芯片管脚的电路驱动能力,例如七段LED码的加入,就加入了74S241来增加电流驱动力。

实时操作系统uC/OS一Ⅱ在ARM上的移植—软件仿真

摘要:

介绍了实时操作系统uC/OS—II的特点,讨论了其在LPC2106上移植的可能性,成功通过软件仿真地将uC/OS—II移植到LPC2106上,并通过例程验证了移植代码的正确性。

引言

目前嵌入式系统在家电、移动电话、PDA等各种领域的应用日益广泛,程序设计也越来越复杂,这就需要采用一个通用的嵌入式操作系统来对其进行管理和控制。

移植了操作系统的嵌入式系统开发,可大大减轻程序员的负担,操作系统提供了多任务的管理功能,只需专注于每个任务的管理。

对于不同的应用,可以按照相同的步骤完成系统设计。

如果更换硬件平台,则只需要对操作系统进行少量的移植工作,与硬件无关的应用代码完全无需修改,同时,可增强代码的可读性、可维护性和可扩展性。

uC/OS—II是一个可裁减的、源代码开放的、结构小巧、可剥夺型的实时多任务内核,它提供任务调度、任务间的通信与同步、任务管理、时间管理和内存管理等基本功能。

将uC/OS—II移植到嵌入式处理器上,对于提高产品质量、缩短开发周期和降低成本等方面有着重要的意义。

本文主要介绍uC/OS—II在飞利浦的一款ARM7TDMI的嵌入式处理器LPC2106应用。

1嵌入式操作系统uC/OS—II

1.1

uC/OS—II简介

uC/OS—II是一种性能优良源码公开且被广泛应用的免费嵌入式操作系统,它结构小巧、具有基于优先级的抢占式实时多任务内核,绝大部分代码是用ANSIC语言编写的,与硬件相关部分用汇编语言编写,使之可供不同构架的微处理器使用。

只要有标准的ANSIC交叉编译器,有汇编器、链接器等软件工具,就可以将uC/OS—II嵌入到开发的产品中。

uC/OS—II是面向中小型嵌入式系统,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,包含全部功能模块的内核大约为10kB。

如果经过裁减只保留核心代码,则可压缩到3kB左右。

严格地说uC/OS—II只是一个实时操作系统内核,它仅仅包含了任务调度、任务管理、时间管理、内存管理和任务间的通信和同步等基本功能,没有提供输入输出管理、文件系统、网络等额外的服务。

但由于uC/OS—II良好的可扩展性和源码开放,这些非必需的功能完全可以由用户自己根据需要分别实现。

1.2

uC/OS—II的工作原理

uC/OS—II的工作流程如图1所示:

首先进行操作系统初始化,主要完成任务控制块(TCB)初始化;

然后就可以开始创建新任务、初始化任务堆栈区;

最后调用OSSTART()函数,启动多任务调度。

在多任务调度开始后,启动时钟节拍源开始计时。

此节拍源为系统提供周期性的时钟中断信号、实现延时和超时确认。

当时钟中断来临时,系统把当前正在执行的任务挂起,保护现场,进行中断处理,判断有无任务延时到期。

若有,则使该任务进入就绪态,并对所有进入就绪态的任务的优先级进行比较,通过任务切换去执行最高优先级的任务。

若没有别的任务进入就绪态,则恢复现场继续执行原任务。

另一种调度方式是任务级的调度,即通过发软中断命令或依靠处理器在任务执行中调度。

如任务要等待信号量或一个正在执行的任务被挂起时,就需要在此任务中调度,找出目前处于就绪态的优先级最高的任务去执行。

当没有任何任务进入就绪态时,就去执行空任务。

1.3UC/OS的移植要求

UC/OS的正常运行需要处理器平台满足以下要求:

a)处理器的C编译器能产生可重入代码。

b)用C语言就可以打开和关闭中断。

c)处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。

d)处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。

e)处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令。

我们的KEIL和ADS均支持UC/OS的要求。

因此可以在LPC2000系列上移值。

2基于LPC1602的软件仿真电路

LPC1602是PHILIPS公司推出的一款功能强大、超低功耗且具有ARM7TDMI内核的32位微控制器。

它具有丰富的片上资源,完全可以满足一般的工业控制需要,同时还可以减少系统硬件设计的复杂度,提高系统的稳定性。

它的工作原理主要是用ARM7芯片LPC1602为内核,与一系列外围器件连接起来。

这里所用到的电路图如下:

仿真是的结果:

将ADS1.2编译运行后生成的test.hex文件导入到ARM芯片中去,按下key1按键的结果。

*功能:

计数器,通过两个按键来控制加减计数器,并输出数码管显示.。

****************************************************************************/

#include"

config.h"

#defineCON0x000000ff//控制P0.0~P0.7

#defineTASK_STK_SIZE64

OS_STKMain_TaskStk[TASK_STK_SIZE];

OS_STKTask0Stk[TASK_STK_SIZE];

voidMain_Task(void*data);

voidTask0(void*data);

/****************************************************************************

*名称:

main()

主函数,启动多任务环境

intmain(void)

OSInit();

OSTaskCreate(Main_Task,(void*)0,&

Main_TaskStk[TASK_STK_SIZE-1],0);

OSStart();

return0;

Main_Task()

初始化目标板,建立其他任务

voidMain_Task(void*pdata)

{

pdata=pdata;

TargetInit();

OSTaskCreate(Task0,(void*)0,&

Task0Stk[TASK_STK_SIZE-1],1);

PINSEL0=0x0;

IODIR=CON;

IOCLR=CON;

OSTaskSuspend(OS_PRIO_SELF);

}

Task0()

任务

voidTask0(void*pdata)

{uint16temp;

temp=0;

for(;

;

if((IOPIN&

0x00030000)!

=0x00030000)

OSTimeDly(OS_TICKS_PER_SEC/50);

0x00030000)==0x00020000)

temp++;

0x00030000)==0x00010000)

temp--;

while((IOPIN&

=0x00030000);

IOSET=temp;

}

OSTaskResume(0);

该程序中一共启用的两个任务:

第一个任务,其实只要是用来启用第二个任务Task0(按键任务),然后就自己挂起了。

voidMain_Task(void*pdata)

第二个任务:

查询两个按键,如果上面那个按键按下则显示增1,按下下面的则相反。

部分程序:

if((IOPIN&

总结

由于没有开发板一直不能进行移植实验,且之前没有学习过操作系统移植方面知识,对具体怎样移植很是迷惑,之前(考虑到电脑的装系统和软件安装)认为系统移植是不是先把系统下载到RAM中,然后再把编写好的程序再下载到ARM中,思路很是混乱。

经过长时间的上网查资料,下相关的文档、软件以及程序现在才稍微理解了些。

我对系统移植的理解:

系统移植就是利用一些编程好的程序来辅助运行我们要实现的功能。

比如说那些OS_CPU.H、OS_CPU_a.s、OS_CPU.c函数并不是用来直接下载到ARM版中的,而是你编写的具体函数在运行的时候会用到这些函数。

而使用这些函数的好处时,实现切换任务之间的控制,而不在是像单片机那时的中断响应方式。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2