嵌入式系统实验、GPIO、PWM、UART汇编程序与c语言混合编程

  • 格式:doc
  • 大小:72.55 KB
  • 文档页数:9

实验一
一、汇编语言调用c语言
主要内容为使用汇编语言调用C语言完成20!的计算。

将64位结果保存到寄存器R0、R1中,其中R1存放高32位结果
1.建立汇编源文件start.s
/*start.s*/
.global _start
.extern Factorial
.equ Ni,20
.text
_start:
Mov R0,#Ni
BL Factorial
Stop:
B Stop
.end
2.建立C语言源文件factorial
/*factorial.c*/
Long long Factorial(char N){
Char i;
Long long Nx=1;
For(i=1;i<=N;i++){
Return Nx;}}
3.在GUN ARM编译环境下
(1)在汇编程序中要使用.global伪操作声明汇编程序为全局的函数,可被外部函数调用。

(2)同时在C程序中要用关键字extern声明要调用的汇编语言程序。

二、C语言调用汇编语言
在GUN ARM 编译环境下设计程序,用C语言调用ARM汇编语言C语言实现20!操作,并将64位结果保存到0xFFFFFFF0开始的内存地址单元,按照小端格式低位数据存放在低位地址单元。

1、建立C语言源文件main.c
/* main.c */
extern void Factorial(char Nx);
Main(){
Char N =20;
Factoral(N);
While(1);}
2、建立汇编语言源文件factorial
/* factorial.s */
.global Factorial
Factoral:
Mov R8,R0
Mov R9,#0
SUB R0,R8,#1
Loop:
Mov R1,R9
UMULL R8,R9,R0,R8
MLA R9,R1,R0,R9
SUBS R0,R0,#1
BNE Loop
LDR R0,=0xFFFFFFF0
STMIA R0,{R8,R9}
MOV PC,LR
三、实验一内容
在汇编语言中定义符号常量A和B,调用C语言程序求这两个数的最大值,返回汇编程序后,将结果存入R3。

(1)编写汇编源文件start.s文件
/*Start.s */
.global _start
.extern Factoiral
.equ N1,20
.equ N2,30
.text
_start:
Mov R0,#N1
Mov R1,#N2
BL Factoral
Mov R3,R0
Stop:
B stop
.end
(2)编写C语言文件
/* factorial.c*/
int Factorial(int num1,int num2){
Return num1>num2?Num1:num2;}
用C语言编程,现将10000000开始的100个单元赋初值,然后求平均值、最大值和最小值,并将结果存放1在000100开始
(1)编写汇编源文件start.s文件
/*start.s*/
global _start
extern Factorial
.text
_start:
B Factorial
Stop
B stop
.end
(2)编写C语言文件
/*Factorial.c*/
Void Factrial(){
int i;
int 32-t,*p1,*p2;
p1=(int 32-t)0x10000000;
p2=(int 32-t)0x10001000;
for(i=0;i<=100;i++) *(p1+i)=i;
int max =*p1;
long sum=0;
double ove=0;
for(i=1;i<=100;i++){
if(*(p1+i)>max){
max =*(p1+i);
if(*(p1+i)<min)max=*(p1+i); }}
ove=sum/100.0;
*p2=sum;
*(p2+2)=max;
*(p2+3)=min;}
实验二、GPIO与UAPT
1.编写流水灯控制程序,实现流水灯向左向右移动
C语言实现:
Int main(void){
GPX2.CON=(GPX2.CON&~(0xf<<28)) | 1<<28;
GPX1.CON=(GPX1.CON&~(0xf)) | 1;
GPX3.CON=(GPX3.CON&~(0xf<<16 | 0xf<<20)) |(1<<16 | 1<<20; While(1){
GPX2.DAT|=0x1<<7;
mydelay_ms(500);
GPX1.DAT|=0x1;
GPX2.DAT&=~(0x1<<7);
mydelay_ms(500);
GPF3.DAT|=(0x1<<5); mydelay_ms(500);
GPX1.DAT&=~0x1; mydelay_ms(500);
GPF3.DAT|=(0x1<<4); GPF3.DAT&=(0x1<<5); mydelay_ms(500);
GPF3.DAT&=~(0x1<<4); }return 0;}
Void mydelay_ms(ms){ Int i,j;
while(ms--){
for(i=0;i<5;i++)
for(j=0;j<514;j++);}} 汇编语言实现:
.global _start
.text
_start:
LDR R0,=0x11000c40 LDR R1,[R0]
AND R1,#0x0FFFFFF ORR R1,#0x10000000 STR R1,[R0]
LDR R0,=0X11000C44
LDR R1,[R0]
ORR R1,#0x80
STR R1,[R0]
AND R1,#0x7f
STR R1,[R0]
Stop:
b stop
.end
2.通过串口向pc机发送数据和收pc发送单字符数据,字符串等UART2初始化
void uart_init(void){
GPA1.GPA1CON=(GPA1.GPAICON&~0xFF)|(0x22);
UART2.ULCON2=0X3;
UART2.UCON2=0X5;
UART2.UBRDIV2=0X35;
UART2.UFRACVAL2=0X5;}
编写发送字符的C语言方法
void putc(const char data){
while(!UART2.UTRSTAT2&0X2));
UART2.UTXH2=data;
if(data=’/n’)
putc(’/r’);}
编写发送字符串的C语言方法
void putc(const char*pstr){
while(*pstr!=”/0”)
putc(*pstr++);}
接收函数
unsigned char getchar(){
unsigned char c;
while(!(UART2.UTRSTAT2&0X1));
c=UART2.URXH2;
return c;}
串行通信主程序
Int main(void){
uart_init();
mydelay_ms(500);
puts(“uart test!!\n”);
puts(“please input one strings\n”); while(1){
putc(getchar());}
return0;}
实验三、PWM定时器
1.P WM的初始化
void PWM_init(void)
{GPDO.CON=(GPDO.CON &~(0xf)) | 0x2; PWM.TCFGO=(PWM.TCFG0&~(0xFF)|0x63; PWM.TCFG1=(PWM.TCFG1 &~(0xF)) 0x3; PWM.TCNTBO=200;
PWM TCMTBO=100;
PWM.TCON=(PWM.TCON &~(0xF)) | OxA; PWM.TCON=(PWM.TCON &~(0xF)) | Ox9;} 2.代码实现
int main(void) {
GPX2.CON=0x1<<28;
PWM_init();
while(1){
GPX2.DAT=GPX2.DAT|0x1<<7;
mydelay_ms(500);
GPX2.DAT=GPX2.DAT & ~(0x1<<7); mydelay_ms(500);}
return 0;
}。