为什么要写这样一套教程呢,一方面哈工大的嵌入式上机实验和课程有些脱节,学习曲线陡增,另一方面也是希望考研的同学能轻松一点。话不多说,我们开始吧。
DC
哈工大嵌入式软硬件设计上机实验教程(一)-ARM裸机程序开发实验-按键控制LED
哈工大嵌入式软硬件设计上机实验教程(二)-U-Boot、Linux 内核的系统移植实验
哈工大嵌入式软硬件设计上机实验教程(三)-按键驱动实验
虚拟机安装教程很多,在这里不多做赘述。笔者使用的是VMware Workstation Pro 15软件,安装了Ubuntu 16.04 32位操作系统。
需要注意的几点
~~(1)实验老师提供的交叉编译链是32位的,我推荐安装官方下载的Ubuntu 16.04 32位操作系统。
(2)虚拟机和Ubuntu系统安装完成之后记得测试是否可上网并换源,关于换源可以参考以下教程或自行搜索 “Ubuntu 16 换源” 教程。
https://blog.csdn.net/qq_30683329/article/details/88582435
(3)安装VMtools工具
VMtools工具是VMware虚拟机的增强工具,可以让你在Ubuntu虚拟机和Windows物理机之间方便的复制粘贴和传输文件。安装方法可以参考以下教程或自行搜索教程。
https://blog.csdn.net/blessed_sy/article/details/81173746
本实验使用的开发板是友善之臂的Tiny210开发板,下面是官网和官方论坛资料下载,学有余力的同学可以下载完整资料包进行进一步学习。
http://www.arm9.net/tiny210.asp
http://www.arm9home.net/read.php?tid-974.html
在虚拟机Linux系统中安装交叉工具链:
3.2创建文件夹
# cd命令表示进入该路径
cd /usr/local
#mkdir命令表示创建一个文件夹名为arm
sudo mkdir arm
cd arm
sudo mkdir 4.6.2
cd 4.6.2
sudo mkdir bin
cd bin
3.3解压交叉编译工具链
回到交叉编译工具链压缩包所在目录。
解压缩交叉编译工具到/usr/local/arm/4.6.2/bin目录。
sudo tar xvzf gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar.bz2 –C /usr/local/arm/4.6.2/bin
3.4修改环境变量
修改环境变量方法很多,详见这篇文章。
https://blog.csdn.net/yimenren/article/details/107361301
我们这里对当前用户的环境变量进行修改。
nano ~/.bashrc
在文件末尾添加
#后面这个地址就是你解压之后arm-linux-gcc文件所在bin文件夹的路径
export PATH=$PATH:/usr/local/arm/4.6.2/bin/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin
Ctrl+o保存,回车确定,之后Ctrl+x退出
执行
source ~/.bashrc
使环境变量生效。
验证是否生效
arm-linux-gcc –v
如安装正确将打印版本号
共需要三个文件,将下面三个文件分别保存放在同一个文件夹内。
下面代码保存为main.c
// LED
#define GPJ2CON (*(volatile unsigned long *) 0xE0200280)
#define GPJ2DAT (*(volatile unsigned long *) 0xE0200284)
// KEY
#define GPH2CON (*(volatile unsigned long *) 0xE0200C40)
#define GPH2DAT (*(volatile unsigned long *) 0xE0200C44)
#define GPJ2_0_OUTPUT (1<<(0*4))
#define GPJ2_1_OUTPUT (1<<(1*4))
#define GPJ2_2_OUTPUT (1<<(2*4))
#define GPJ2_3_OUTPUT (1<<(3*4))
#define GPH2_0_INTPUT ~(0xf<<(0*4))
#define GPH2_1_INTPUT ~(0xf<<(1*4))
#define GPH2_2_INTPUT ~(0xf<<(2*4))
#define GPH2_3_INTPUT ~(0xf<<(3*4))
void main()
{
unsigned long dat;
// LED:设置寄存器GPJ2CON0使GPJ2_0/1/2/3引脚为输出功能
GPJ2CON = GPJ2_0_OUTPUT|GPJ2_1_OUTPUT|GPJ2_2_OUTPUT|GPJ2_3_OUTPUT;
// KEY:设置寄存器GPH2CON0使GPH2_0/1/2/3引脚为输入功能
GPH2CON = GPH2_0_INTPUT&GPH2_1_INTPUT&GPH2_2_INTPUT&GPH2_3_INTPUT;
while(1)
{
// 读取KEY相关的引脚值,用于判断KEY是否被按下
dat = GPH2DAT;
// 判断KEY1:GPH2_0
if(dat & (1<<0)) // KEY1被按下,则LED1亮,否则LED1灭
GPJ2DAT |= 1<<0; // OFF
else
GPJ2DAT &= ~(1<<0); // ON
// 判断KEY2:GPH2_1
if(dat & (1<<1)) // KEY2被按下,则LED2亮,否则LED2灭
GPJ2DAT |= 1<<1;
else
GPJ2DAT &= ~(1<<1);
// 判断KEY3:GPH2_2
if(dat & (1<<2)) // KEY3被按下,则LED3亮,否则LED3灭
GPJ2DAT |= (1<<2);
else
GPJ2DAT &= ~(1<<2);
// 判断KEY4:GPH2_3
if(dat & (1<<3)) // KEY4被按下,则LED4亮,否则LED4灭
GPJ2DAT |= 1<<3;
else
GPJ2DAT &= ~(1<<3);
}
}
下面文件保存为start.S
.global _start
_start:
// 关闭看门狗
ldr r0, =0xE2700000
mov r1, #0
str r1, [r0]
// 设置栈,以便调用c函数
ldr sp, =0x40000000
// 调用main
bl main
halt:
b halt
下面文件保存为Makefile
key_led.bin: start.o main.o
arm-linux-ld -Ttext 0x20000000 -o key_led.elf $^
arm-linux-objcopy -O binary key_led.elf key_led.bin
arm-linux-objdump -D key_led.elf > key_led_elf.dis
%.o : %.S
arm-linux-gcc -o $@ $< -c
%.o : %.c
arm-linux-gcc -o $@ $< -c
clean:
rm *.o *.elf *.bin *.dis *.exe -f
在当前文件夹下运行终端输入
make
即可获得烧录需要的bin文件
如果出现上述错误,参考该网址
https://www.bilibili.com/read/cv3633870/
5.2在windows上使用MiniTools调试裸机程序
实验效果为:按动某一个按键,对应的LED灯点亮。
第一次在CSDN上写教程,如果喜欢的话请点一个赞,感激不尽。
DC