您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页实验三_ARM C语言程序设计基础

实验三_ARM C语言程序设计基础

来源:意榕旅游网
实验三 ARM C语言程序设计基础

实验目的

1、了解ARM C语言程序的特点

2、了解ARM C语言外部IO口地址的定义与使用方法 3、掌握用ARM C语言设计简单程序

实验仪器设备及软件

ARM实验箱,计算机,ADS程序开发软件

实验原理

1、开发ARM系统,使用C语言编程是大势所趋 在应用系统的程序设计中,若所有的编程任务均由汇编语言来完成,其工作量的巨大的,并且不易移植。由于ARM的程序执行速度较高,存储器的存储速度和存储量也很高,因此,C语言的特点充分发挥,使得应用程序的开发时间大为缩短,代码移植十分方便,程序的重复使用率高,程序架构清晰易懂,管理较为容易等等。因此,C语言在ARM系统开发中具有重要的地位。 2、ARM C语言的基本规则 在ARM的程序开发中,需要大量读写硬件寄存器,并且尽量缩短程序的执行时间的代码一般是用汇编语言来编写的,比如ARM的启动代码,ARM操作系统的移植代码等,除此之外,绝大多数可以使用C语言来完成。 ARM的开发环境是一个嵌入式集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。在使用C语言时,要用到和汇编语言的混合编程。当汇编代码较为简洁,则可使用直接内嵌汇编的方法,否则,使用将汇编程序以文件的形式加入项目中,通过ATPCS的规定与C程序相互调用与访问。

ATPCS规定,请参阅ARM相关文档资料 满足ATPCS规定的汇编程序应满足下面3个条件: 在子程序编写中,必须遵守相应的ATPCS规则(函数的参数引用与返回) 堆栈的使用要遵守相应的ATPCS规则 在汇编编译器中使用 –atpcs选项 汇编程序调用C程序 (1)汇编程序的设置要遵守ATPCS规则,保证程序调用时参数正确传递 (2)在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数 (3)在调用C程序时,要正确设置入口参数,然后使用BL调用 C程序调用汇编程序 (1)汇编程序的设置要遵守ATPCS规则,保证程序调用时参数正确传递 (2)在汇编程序中使用EXPORT伪指令声明本子程序,使其他程序可以调用此程序 (3)在C程序中使用extern关键字声明外部函数(声明要调用的汇编子程序)。

在C语言环境内开发应用程序,一般要一个汇编的启运程序,从汇编的启动程序,跳到C语言下的主程序,然后执行C程序,在C环境下读写硬件寄存器,一般是通过宏调用进行,在每个项目文件的Startup2410/INC目录下都有一个2410addr.h的头文件,那里定义了所有关于2410的硬件寄存器的宏,对宏的读写就能操作2410的硬件。

其它请参阅《嵌入式C语言程序设计》

实验内容

1、用ARM C语言编写程序,控制GPIO的G口的两个LED灯,使其交替点亮。 实验电路如图所示。

通过控制GPG8,GPG9的高低电平就可以控制LED的亮暗。

rGPGDAT = rGPGDAT & 0xcff | 0x200; //0ch=1100b,D2亮,D1暗 rGPGDAT = rGPGDAT & 0xcff | 0x100; //0ch=1100b,D2暗,D1亮 实验程序如下: void ledflash(void) { int i; rGPGDAT = rGPGDAT & 0xcff | 0x200; for(i=0;i<10000000;i++); //延时 rGPGDAT = rGPGDAT & 0xcff | 0x100; for(i=0;i<10000000;i++); //延时 rGPGDAT = rGPGDAT & 0xcff | 0x300;//两个LED都暗 }

该程序每运行一次两个发光二极管各亮一次,重复执行,就可以看到LED闪烁的情况。 主程序(函数)的开始处必须设置GPG口的工作状态。 void Main(void){ Target_Init(); rGPGCON = rGPGCON & 0xfff0ffff | 0x00050000; for(;;){ ledflash();} }

2、用ARM C语言编写程序,编写一个流水灯程序。

实验箱中8个LED灯的内存映射地址是0x20000000。产生流水灯效果,只要按顺序逐个点亮LED即可。实验电路如图所示。

从图上可知,往这个地址写0,就可以点亮相应的二极管。实验程序如下: #define outled (* (volatile unsigned *)0x20000000) #define inputkey (* (volatile unsigned *)0x20000016) void ledstep(void) {

unsigned short int i,j; int k; j=1;

for(i=8;i>0;i--) { j=j*2 ; //左移一位 outled = ~j ; //取反输出(只有一位亮) for(k=0;k<10000000;k++); //延时 }

outled = 255 ; //把所有的发光二极管全部熄灭 }

重复执这个程序,就可以产生流水灯效果。

实验步骤

1、 连接实验箱与计算机的串口线,打开计算机超级终端,并设定为com1,115200,8,1,0N 2、 连接仿真调试电缆(并口到JTAG)。

3、 实验箱上电,并在vivi的指示下,按任意键,进入调试程序状态。 4、 打开ARM集成开发环境ADS,按要求编写或打开实验程序。 5、 按内容要求编写,调试程序,并记录调试过程和数据。 6、 调试完毕,整理实验箱,并放回原位。

具体程序:

#include #include

#include \"..\\INC\\config.h\" void ledstep(void); void countdays(void); void ledflash(void); int ascii2int(char *c); int ac2int(char * string); void Main(void){

char *p=\"2321f\"; int k;

k=ascii2int(p); Target_Init();

rGPGCON = rGPGCON & 0xfff0ffff | 0x00050000; countdays(); for(;;){ //ledstep(); ledflash(); } }

#define outled (* (volatile unsigned *)0x20000000) #define inputkey (* (volatile unsigned *)0x20000016) void ledstep(void) {

unsigned short int i,j; int k; j=1;

for(i=8;i>0;i--) {

outled = ~j ; //取反输出(只有一位亮) for(k=0;k<10000000;k++); //延时 j=j*2 ; //左移一位 }

outled = 255 ; //把所有的发光二极管全部熄灭 }

typedef struct{ int ID;

unsigned int month,day,days; }yeardays;

void countdays(void) {

yeardays myday; int i,j,k;

int months[]={31,29,31,30,31,30,31,31,30,31,30,31}; myday.month=5; myday.day=12; myday.ID=888; k=0;

j=myday.month;

for (i=1;ik=k+months[i-1]; }

k=k+myday.day; myday.days=k; }

void ledflash(void) {

int i;

rGPGDAT = rGPGDAT & 0xcff | 0x200; for(i=0;i<10000000;i++); //延时

rGPGDAT = rGPGDAT & 0xcff | 0x100; for(i=0;i<10000000;i++); //延时 }

int ascii2int(char *c) {

int j;

unsigned char p; char *q; q=c;

while (*q>=0x30 & *q<0x40) { p=*q-0x30; q++;

j=j*10+p; }

if (*q==0x0a | *q==0x0d |*q==0x0) return j;

else return 0; }

int ac2int(char * string) {

int i,a;

for (i=0;string[i]|='\\0';i++) {

a=string[i]; if (isdigit(a)) return string[i]; else return 0; } }

实验现象

当程序为ledflash应用时,2个灯交替闪烁;

当程序为ledstep应用时,8个灯依次闪。一个闪,其他7个都灭。

实验思考题

设计一个程序,根据输入数字点亮相应个数的LED二极管。如:输入2,点亮2个发光二极管。

答:main()

#define outled (* (volatile unsigned *)0x20000000) #define inputkey (* (volatile unsigned *)0x20000016) void ledstep(short int i) {

unsigned short int j,k; int m; j=0xFFH; for(;;) { k=j/(2^i-1);

outled = k;

for(m=0;m<0xFFH;k++) break; //延时退出

实验心得:

通过本次实验,我大体上知道了基于arm的C语言程序特点 , 了解ARM C语言外部IO口地址的定义与使用方法,掌握用ARM C语言设计简单程序. 而在今后的日子,我要更加努力的加油学习才行. 靠现在的知识是永远不够的.

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务