为了解底层技术,一直就想学习下汇编程序。但以前学习的都是理论,没有在真实环境实践过,时间长了就忘了。目前手头有arduino uno板子与arm 2440板子,分别在这两种平台写了段汇编程序,来理一理真实板子开发汇编程序的流程。
一、Arduino汇编程序开发。
1.安装和打开Atmel Studio 7.0
2.新建项目【File-New Project】,选择项目类型为Assembler(汇编),如下图:
3.选择设备类型,arduino unor3对应的mcu为ATmega328p,所以选这个类型。如下图:
4.在打开的main.asm中粘入以下汇编代码:
start:// NOP
LDI R16, 0xff; LoaD Immediate
OUT PORTB, R16; PORTB=0xFF
LDI R17,1<
OUT DDRB,R17; DDRB: Data Direction Register. DDRB5=1,Configure the PORTB.5 as OUTPUT
OUTPUT: SBI PINB,5; one instrction to toggle the PORTB.5(13 on arduino)
// delay loop about 0.5s
LDI R19,0xE0
DELAY0: LDI R16, 0x00
DELAY1: LDI R18, 0x00
DELAY2: INC R18
BRNE delay2; BRanch if Not Equal
INC R16
BRNE delay1
INC R19
BRNE delay0
BREAK
RJMP output
//这里的代码先不去研究了,它的功能是让13号引脚的led灯每隔0.5秒闪一下。原理大概就是寄存器操作,然后delay,循环。
5.配置为Release,选择【Build->Build Solution】编译代码。
这时编译后的目标文件在图1中选择的目录下,文件名为AssemblerTest.hex。
6.在arduino官方ide中打开日志可以查看到它的上传avrdude命令。
我们把这个命令中的文件名替换为第5步的文件名,执行一下就可以上传了。我的电脑代码如下:
cd D:\Program Files (x86)\Arduino\hardware\tools\avr\bin
avrdude -CE:/workspace/arduino/avrdude.conf -v -patmega328p -carduino
-PCOM3 -b115200 -D -Uflash:w:E:/workspace/arduino/AssemblerTest.hex:i
最后的效果:
因为拍照的瞬间闪的灯灭了,所以图里13号引脚对应的灯没有亮。
二、asm汇编程序开发
1.在记事本中键入以下代码:
.text
.global _start
_start:
LDR R0,=0x56000050 @ R0设为GPFCON寄存器。此寄存器
@ 用于选择端口B各引脚的功能:
@ 是输出、是输入、还是其他
MOV R1,#0x00000100
STR R1,[R0] @ 设置GPF4为输出口, 位[8:7]=0b01
LDR R0,=0x56000054 @ R0设为GPBDAT寄存器。此寄存器
@ 用于读/写端口B各引脚的数据
MOV R1,#0x00000000 @ 此值改为0x00000010,
@ 可让LED1熄灭
STR R1,[R0] @ GPF4输出0,LED1点亮
MAIN_LOOP:
B MAIN_LOOP
@这个代码的功能是点亮一个led灯,GPF4为输出引脚
@文件名为led_on.S
2.在记事本中编写如下Makefile文件
led_on.bin : led_on.S
arm-linux-gcc -g -c -o led_on.o led_on.S
arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf
arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
rm -f led_on.bin led_on_elf *.o
//要能执行上面的命令,先安装下arm-linux-gcc,我安装的软件包是arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2,这个解压设置下/etc/profile,最后source一下就行
3.上传上面两个文件到linux ,执行make命令。
执行后会发现led_on.bin文件,把这个文件下载到windows,准备烧录。
4.在windows上执行oflash.exe
在执行前需安装openJtag的驱动,我用的是OpenOCD with GUI setup.exe
根据oflash的提示选择0(openJTAG)->1(2440)->0(nand flash)->led_on.bin(文件名)->0(nand flash)->0(0地址写入)。
烧写完成后重启板子就可以看到一个led灯一直常亮。
我的板子上有三个灯,可以通过查看原理图查到灯与2440的引脚,再从2440的数据手册(dataSheet)中找到这个引脚的地址,修改上面代码里的地址,就可以换灯了。
最后的效果: