微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > arm汇编编程(示例)

arm汇编编程(示例)

时间:11-09 来源:互联网 点击:

板上有4个LED灯,如果想点亮,必须先看硬件连线图

1.查看开发板LED管脚连线

TQ2400开发板有两块电路板:核心板、主板

LED灯在主板上,所以查看《TQ2440底板原理图.pdf》,找到LED模块(LED测试)

从电路图可看到如果让LED1灯点亮,必须在nLED_1连线上输出低电屏(即通电)

如何让LED1上输出低电屏,需查看CPU相关引脚连线

2.查看TQ2440核心板原理图

CPU在核心板上,所以查看《TQ2440_V2核心板原理图.pdf》

找到nLED1连线,如下

nLED1在CUP的GPB5引脚上

nLED2GPB6

nLED3GPB7

nLED4GPB8

如何让CPU的GPB5为低电屏,需查看CPU引脚模式

3.查看CPU用户手册

TQ2440的微处理器芯片为S3C2440,所以查看《S3C2440.pdf》芯片手册,找到GPB5的管脚模式

1)控制寄存器

GPB5[11:10]00=Input01=Output

10=nXBACK11=Reserved

GPBCON控制寄存器

GPBDAT数据寄存器

GPBUP上拉使能寄存器

[11:10]是所在位,每个管脚都是占两个位

其中Input是输入值

Output输出值

reserved保留值

nXBACKnXBACK/GPB5

即,如果将GPB5设为低电屏,则需要将控制寄存器设置为输出模式。

即需要CPU寄存器GPBCON的11和10位设置为01即11位为010位为1

2)数据寄存器

GPB[10:0][10:0]当端口配置为输入端口时,相应位为引脚状态。

当端口配置为输出端口时,相应位为引脚状态。

当端口配置为功能引脚时,将读取到未定义值

所以,当GPBCON为输入状态时,GPBDAT的相应位5则应为0才会输出低电屏

3)查看寄存器地址

GPBCON0x56000010R/W端口配置寄存器复位值0x0

GPBDAT0x56000014R/W端口数据寄存器复位值-

所以,需要将地址位0x56000010的寄存器作为GPBCON寄存器

地址位0x56000014的寄存器作为GPBDAT寄存器

4.代码编写

//ledtest.c

#defineGPBCON(*(volatileunsignedlong*)0x56000010)

#defineGPBDAT(*(volatileunsignedlong*)0x56000014)

//volatile影响编译器编译的结果,表示变量是随时可能发生变化的

//0x56000010是地址,强行转换为unsignedlong*类型,

//然后前面加*代表这个地址所指向的寄存器变量

#defineLEDS(1<5|1<6|1<7|1<8)//即11110000

#defineDELAYVAL(0xFFFF)

externintdelay(inttime);//声明汇编函数

intmain(){

intval;

inti=0;

GPBCON=(1<16|1<14|1<12|1<10);//即010101010000000000即B5B6B7B8的状态寄存器

val=val+1;

for(i=0;i<4;i++){

GPBDAT=(GPBDAT&(~LEDS))|(1<6|1<7|1<8);

delay(DELAYVAL);

GPBDAT=(GPBDAT&(~LEDS))|(1<5|1<7|1<8);

delay(DELAYVAL);

GPBDAT=(GPBDAT&(~LEDS))|(1<5|1<6|1<8);

delay(DELAYVAL);

GPBDAT=(GPBDAT&(~LEDS))|(1<5|1<6|1<7);

delay(DELAYVAL);

}

return0;

}

//delay.s

;汇编指令延时程序

EXPORTdelay

AREADELAY,CODE,READONLY

;下面是延时子程序

delay

subR0,R0,#1;r0=r0-1

cmpR0,#0x0;将r0与0比较

bnedelay;比较的结果不为0,则继续调用delay

movPC,LR;返回

END

5.调试代码

2440ART.mcp内双击

TargetSettins:post-linker选择ArMfromELF

LanguageSettins:ArchitectureorProcessor选择相应的编译器ARM920T

ArmLinker:output内RO0x30000000

options内Imageentrypoint设为0x30000000

layout内Object2440init.oSectionInit

Listings内Imagemap

ArmfromELF:outputformat内Plainbinary

outputfilename内*.bin

编译

make

调试AXD是调试器

设置,debug->打开AXD调试界面,选择option->configtarget选项

选ARMUL(模拟调试器),然后选择确定.进入调试界面.

ARMUL是虚拟调试环境(虚拟开发板)

如果用开发板真实环境调试,则需要使用JTAG连开发板后,在此处选H-JTAG

用file-

execute->runtocousor项.使程序进入用户主程序

可以用F8来一条一条执行语句,也可用F10,可以设置断点.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top