智能小车34:arduino与arm的汇编程序开发
来源:互联网 发布:java todo和 编辑:程序博客网 时间:2024/05/18 12:37
为了解底层技术,一直就想学习下汇编程序。但以前学习的都是理论,没有在真实环境实践过,时间长了就忘了。目前手头有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)中找到这个引脚的地址,修改上面代码里的地址,就可以换灯了。
最后的效果:
一、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)中找到这个引脚的地址,修改上面代码里的地址,就可以换灯了。
最后的效果:
阅读全文
0 0
- 智能小车34:arduino与arm的汇编程序开发
- 基于arduino的智能小车底层系统开发
- 智能小车二《arduino的软件环境》
- Arduino-智能小车
- 智能小车41:用Atmel Studio7开发Arduino uno程序
- Arduino智能小车——蓝牙小车
- Arduino智能小车——小车测速
- 智能小车一《arduino是什么》
- Arduino智能小车--只是随便一搞
- Arduino智能小车——拼装篇
- Arduino智能小车——测试篇
- Arduino智能小车——调速篇
- Arduino智能小车——循迹篇
- 智能小车的设计与制作
- 智能小车八《怎么组装一个arduino小车》
- Arduino小车学习与研究
- hc-05蓝牙模块与arduino连接实现手机控制蓝牙智能小车
- 我的arduino小车图片
- 趣图:程序员、设计师、项目经理眼中的对方
- Ubuntu16.04下如何编译 ardupilot
- CUDA学习笔记06:我们究竟能获取哪些host存储?
- 一.基础数据结构
- storm和kafka整合案例
- 智能小车34:arduino与arm的汇编程序开发
- unity DropDown控件的使用
- leveldb源码学习-writebatch
- 高效开发习惯
- 递归求斐波拉契数
- iOS 图片风格转换(CoreML)
- html5资料整理
- MySQL之Undo Log和Redo Log
- 026 三角函数求导公式推导