ARM嵌入式实验Word文档下载推荐.docx
《ARM嵌入式实验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ARM嵌入式实验Word文档下载推荐.docx(18页珍藏版)》请在冰点文库上搜索。
微处理器刚上电时,内部寄存器处于未知状态,为了使微处理器能够切换到一个初始状态,需要对微处理器进行一个复位操作。
所有微处理器都有一个复位管脚,当复位管脚上的输入信号有效时,芯片复位。
为了使微处理器在上电时能够自动进行复位,需要对复位管脚设计专门的电路,使其在系统上电初期有效。
时钟和复位管脚的电路原理图
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版中的,而是你编写的具体函数在运行的时候会用到这些函数。
而使用这些函数的好处时,实现切换任务之间的控制,而不在是像单片机那时的中断响应方式。