哈工大嵌入式软硬件设计上机实验教程(一)-ARM裸机程序开发实验-按键控制LED

前言

为什么要写这样一套教程呢,一方面哈工大的嵌入式上机实验和课程有些脱节,学习曲线陡增,另一方面也是希望考研的同学能轻松一点。话不多说,我们开始吧。

DC

点击这里查看往期教程

哈工大嵌入式软硬件设计上机实验教程(一)-ARM裸机程序开发实验-按键控制LED
哈工大嵌入式软硬件设计上机实验教程(二)-U-Boot、Linux 内核的系统移植实验
哈工大嵌入式软硬件设计上机实验教程(三)-按键驱动实验

目录

  • 前言
    • 点击这里查看往期教程
  • ARM裸机程序开发实验-按键控制LED
    • 1.虚拟机安装
    • 2.认识开发板
    • 3.安装交叉编译工具链
    • 4.编写文件
    • 5.烧录
  • 后记

ARM裸机程序开发实验-按键控制LED

1.虚拟机安装

虚拟机安装教程很多,在这里不多做赘述。笔者使用的是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

2.认识开发板

本实验使用的开发板是友善之臂的Tiny210开发板,下面是官网和官方论坛资料下载,学有余力的同学可以下载完整资料包进行进一步学习。

http://www.arm9.net/tiny210.asp

http://www.arm9home.net/read.php?tid-974.html

哈工大嵌入式软硬件设计上机实验教程(一)-ARM裸机程序开发实验-按键控制LED_第1张图片
在上图中我们需要注意,最右侧开关拨到最下方是SD卡启动状态

3.安装交叉编译工具链

在虚拟机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

如安装正确将打印版本号

4.编写文件

共需要三个文件,将下面三个文件分别保存放在同一个文件夹内。

下面代码保存为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文件

5.烧录

5.1安装minitools
哈工大嵌入式软硬件设计上机实验教程(一)-ARM裸机程序开发实验-按键控制LED_第2张图片

如果出现上述错误,参考该网址

https://www.bilibili.com/read/cv3633870/

5.2在windows上使用MiniTools调试裸机程序

  1. 将sd卡通过读卡器插入电脑,在windows上以管理员身份运行SD-Flasher ,选择“Scan”识别出sd卡,然后依次选择“reformat”和“relayout”,sd卡的“available”项显示为“yes”,最后选择烧写文件superboot.bin,点击“Fuse”。
  2. 上面这一步极易出错,我建议直接求助老师找老师烧录。
  3. 拷贝 “images/FriendlyARM.ini” 到sd卡的 “images” 目录。
  4. 打开sd卡上 “FriendlyARM.ini” 文件,增加行 “USB-mode = yes”,保存,弹出sd卡。
  5. 开发板插入sd卡,切换引导模式为SDBOOT(S2开关),连接USB线,打开电源。
  6. 运行MiniTools软件,显示“Board is connected”,选择“User bin (No OS)”,选中“Download and run”,“RAM Address”设为0x20000000,然后选择要运行的裸机程序210.bin,点击右下方的“Download and Run”,观察运行结果。

实验效果为:按动某一个按键,对应的LED灯点亮。

后记

第一次在CSDN上写教程,如果喜欢的话请点一个赞,感激不尽。

DC

你可能感兴趣的:(实验教程,嵌入式,arm,linux,c语言)