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

前言

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

DC

点击这里查看往期教程

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

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

在上图中我们需要注意,最右侧开关拨到最下方是SD卡启动状态
在上图中我们需要注意,最右侧开关拨到最下方是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
在这里插入图片描述

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

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

  • 66
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
智能家居是指利用先进的科技手段实现家居空间的智能化管理和控制。安卓APP作为智能家居控制的主要工具之一,扮演着重要的角色。 首先,安卓APP可以通过Wi-Fi或蓝牙等无线传输技术,与嵌入式软硬件建立连接。通过嵌入式软硬件,可以实现对家居中各种设备的控制,如灯光、空调、电视、音响等。通过安卓APP,用户可以随时随地远程操控家居设备,实现远程开关、定时控制等功能,提升了生活的便利性和舒适度。 其次,安卓APP在智能家居领域具有更加丰富的功能。除了一键控制外,它还可以实现场景模式的设置,例如“回家模式”、“离家模式”、“睡眠模式”等,通过设置相应的智能规则,自动调节家居设备的状态,提高家居的智能化程度。 此外,安卓APP还可以实现对家居设备的监控和管理。通过嵌入式传感器、摄像头等硬件,可以实时获取家居环境的温度、湿度、光照等信息,通过安卓APP进行数据的展示和分析,并可进行远程报警、提醒等操作,提高了家居的安全性和可靠性。 最后,基于安卓APP的智能家居控制还可以与其他智能设备进行联动。例如,通过与智能手机、智能手表的连接,可以实现家居设备的语音控制、手势控制等交互方式,使用户的操作更加方便和自由。 综上所述,安卓APP在智能家居-嵌入式软硬件开发中具有重要作用,通过与嵌入式设备的连接和控制,实现了智能家居的高效管理和便捷控制,为人们的生活带来了更多的便利和舒适。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值