北航研究生ARM9嵌入式系统实验报告
- 格式:doc
- 大小:1.50 MB
- 文档页数:40
北京航空航天大学ARM9嵌入式系统实验报告 - 1 - 实验一、ARM基础知识和开发环境 一、实验目的 1.掌握ARM的串行口工作原理。 2.学习编程实现ARM的UART通讯。 3.掌握S3C2410寄存器配置方法。
二、实验内容 1.熟悉打开已有工程的步骤,掌握仿真调试的方法。 2.建立一个新工程,熟练掌握编译器和链接器的设置方法。 3.从串口输入字符串,将0~9数字在超级终端上连续显示,“Enter”键换行。 4.将第三步得到的字符转换成BCD码,限制在0~1023,用于控制直流电机。
三、预备知识 1.了解EWARM集成开发环境的基本功能 2.学习串口通讯的基本知识 3.熟悉S3C2410串口有关的寄存器
四、实验设备及工具 1.2410s教学实验箱 2.S3C2410的JTAG仿真器 3.ARM EWARM5.3集成开发环境 4.串口连接线
五、实验原理及说明 1. 异步串行I/O 异步串行方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线,最少用一对线即可进行。接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。为了恢复发送的信息,双方必须协调工作。在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。 北京航空航天大学ARM9嵌入式系统实验报告 - 2 - 图1 异步串行I/O示意图 2. RS-232C接口通信的两种基本连接方式 这是美国电子工业协会推荐的一种标准(Electronic industries Association Recoil-mended Standard)。它在一种25针接插件(DB—25)上定义了串行通信的有关信号。这个标准后来被世界各国所接受并使用到计算机的I/O接口中。两种连接方式如图2:
图2 RS-232C接口通信的两种基本连接方式 3. 信号电平规定 1) EIA电平:双极性信号逻辑电平, 它是一套负逻辑定义 -3V到-25V之间的电平表示逻辑“1” +3V到+25V之间的电平表示逻辑“0” 2) TTL电平:计算机内部(S3C2410)使用LVTTL电平 3) 电平转换电路:常用专门的RS-232接口芯片,如SP3232、SP3220等,在LVTTL电平和EIA电平之间实现相互转换。 4. 异步串行口接口电路 北京航空航天大学ARM9嵌入式系统实验报告
- 3 - 图3 异步串行口接口电路 5. 发送数据和接收数据 1) 发送数据 void Uart_SendByten(int Uartnum, U8 data) //往串口发送数据 WrUTXH0(data); //往串口数据寄存器写数据 2) 接收数据 char Uart_Getchn(char* Revdata, int Uartnum, int timeout)//接收数据 RdURXH0(); //读取串口数据寄存器数据
void Uart_SendByten(int Uartnum, U8 data { if(Uartnum==0) { while(!(rUTRSTAT0 & 0x4)); //Wait until THR is empty. hudelay(10); WrUTXH0(data); } else { while(!(rUTRSTAT1 & 0x4)); //Wait until THR is empty.
hudelay(10); WrUTXH1(data); } }
char Uart_Getchn(char* Revdata, int Uartnum, int timeout) { if(Uartnum==0) { if((rUTRSTAT0 & 0x1)==0x01) //Receive data read { *Revdata=RdURXH0(); return TRUE; } else { return FALSE; } } 北京航空航天大学ARM9嵌入式系统实验报告 - 4 - else { while(!(rUTRSTAT1 & 0x1));//Receive data read *Revdata=RdURXH1(); return TRUE; } } void init_MotorPort() { rGPBCON=rGPBCON&0x3ffff0|0xa; //Dead Zone=24, PreScalero1=2; rTCFG0=(0<<16)|2; //divider timer0=1/2; rTCFG1=0; rTCNTB0= MOTOR_CONT; rTCMPB0= MOTOR_MID; rTCON=0x2; //update mode for TCNTB0 and TCMPB0. rTCON=0x19; //timer0 = auto reload, start. Dead Zone } void SetPWM(int value) { rTCMPB0= MOTOR_MID+value; } 6. 寄存器 1) 线路控制寄存器ULCONn
2) 控制寄存器UCONn 北京航空航天大学ARM9嵌入式系统实验报告
- 5 - 3) 状态寄存器UTRSTAT 4) 发送寄存器UTXH和接收寄存器URXH 北京航空航天大学ARM9嵌入式系统实验报告
- 6 - 六、实验方法 1. 以实验一为模板,完成实验的1和2。 2. 将接收串口数据的数组cl[1]改为cl[256],用cl[i]==0x0d 回车字符作为一帧结束的条件。 3. 将“Exp4 电机转动控制实验” inc目录下的MotorCtrl.H 和src目录下的MotorCtrl.C拷到该工程相应目录,将MotorCtrl.C 添加到工程中。 4. 在main函数里包含以下头文件 #include “../inc/MotorCtrl.h” 5. 在main函数里包含以下头文件 #include “inc/macro.h“,#define MOTOR_COUNT 12657。 6. 在Main函数里执行init_MotorPort()。 7. 直流电机调试的函数是 SetPWM((setspeed -512)*MOTOR_COUNT/1024),setspeed是速度指令,取值范围0~1023。 七、程序源代码 //#include"../ucos-ii/includes.h" /* uC/OS interface */ //#include "../ucos-ii/add/osaddition.h" //#include "../inc/drivers.h" #include "../inc/MotorCtrl.h" /*修改1: 包含头文件"../inc/MotorCtrl.h"*/ #include "../inc/macro.h" /*修改2: 包含头文件"../inc/macro.h"*/ //#include "../inc/sys/lib.h" //#include "../src/gui/gui.h" #define U8 unsigned char #include 北京航空航天大学ARM9嵌入式系统实验报告 - 7 - #include #define TRUE 1 #define FALSE 0 #define MOTOR_COUNT 12657 /*修改3: 定义MOTOR_COUNT 值*/ //#pragma import(__use_no_semihosting_swi) // ensure no functions that use semihosting
#define rUTRSTAT0 (*(volatile unsigned *)0x50000010) #define rUTRSTAT1 (*(volatile unsigned *)0x50004010) #define WrUTXH0(ch) (*(volatile unsigned char *)0x50000020)=(unsigned char)(ch) #define WrUTXH1(ch) (*(volatile unsigned char *)0x50004020)=(unsigned char)(ch) #define RdURXH0() (*(volatile unsigned char *)0x50000024) #define RdURXH1() (*(volatile unsigned char *)0x50004024) //void Uart_SendByten(int Uartnum, U8 data); void Uart_SendByten(int,U8); char Uart_Getchn(char* Revdata, int Uartnum, int timeout);
void ARMTargetInit(void); void hudelay(int time); int main(void) { //int ndev; char c1[256]; char err; char al[1]; int i,j; int setspeed=0; ARMTargetInit(); // do target (uHAL based ARM system) initialisation // init_MotorPort(); /*初始化*/ while(1) { Uart_SendByten(0,0xa);//换行 Uart_SendByten(0,0xd);//回车 for(i=0;i<256;) {