嵌入式系统设计(四):iTOP-4412裸机开发环境搭建(详细介绍DNW 驱动安装)

前言:
在接下来的时间里将更新一个专栏:嵌入式系统设计。在这个专栏里将会介绍基于iTOP-4412 Cortex A9开发板的嵌入式系统设计,从入门到实践可以无障碍的学习。欢迎大家关注收藏学习!!!!
在这里插入图片描述
文章嵌入式系统设计(一):虚拟机、Ubuntu的安装以及SSH 软件的安装使用:里面详细介绍了SSH软件的安装和ssh 软件在主机和虚拟机之间传文件。
文章嵌入式系统设计(二): 虚拟机和主机之间共享文件夹:里面详细介绍了部分用户无法正常使用 ssh 软件在主机和虚拟机之间传文件,虚拟机和主机之间采用共享文件夹的方式传递文件。
文章嵌入式系统设计(三):Vim编辑器的学习:里面详解介绍了Vim编辑器的安装以及对相关使用命令的介绍。

1 安装 DNW 驱动

DNW 驱动程序由于只有 xp、win7-32、win7-64 系统下的安装程序,建议在 win7-64 位系统下安装 DNW 驱动。
在这里插入图片描述

方法三:
参考:win8下如何按F8进安全模式
1,按“windows键+X”,选择“电源选项”
2,选择“选择电源按钮的功能”->“更改当前不可用的设置”,取消“启用快速启动”。
3,用管理员方式运行“cmd”。
4,输入“bcdedit /set {default} bootmenupolicy legacy”。
5,重启电脑,按F8,即可选择关闭“数字签名验证”。
6,如需恢复,可输入“bcdedit /set {default} bootmenupolicy standard”。

方法四:
1,用管理员身份运行CMD。
2,输入命令:“bcdedit -set loadoptions DISABLE_INTEGRITY_CHECKS”,不需要双引号,回车。
3,再输入命令:“bcdedit -set TESTSIGNING ON”,不需要双引号,回车。
4,重启电脑,即可关闭数字签名验证。

此时,系统进入的是测试模式,在桌面会有一个“水印”,如果需要去除水印,可以百度下载“My_WCP_Watermark_Editor.exe”软件。
1,下载“My_WCP_Watermark_Editor.exe”软件。
2,双击直接执行。
3,选择去除各种水印,并按“apply…"即可。

win10不能通过重启后按F8的方式进入安全模式,只能通过如下方式进入安全模式:
1、如下图,按win键+R键,呼出运行命令窗口,输入“msconfig”,再按回车键:
2、如下图,点击“引导”,再勾选“安全引导”-“最小”,再点击“确定”,重启电脑后电脑自动进入安全模式:
3、退出安全模式的方法是去掉第2步中的“安全引导”前的“√”,再按“确定”,再重启电脑,win10就退出安全模式了。

在这里插入图片描述
首先使用串口线连接 iTOP-4412 开发板的调试串口到 PC 机,使用 USB 连接线连接 iTOP-4412 开发板的 USB OTG 接口到 PC 机的 USB 口。打开“tools”目录下的 dnw.exe 软件,如下图所示:
在这里插入图片描述
点击上图的“Serial Port->Connect",连接到 iTOP-4412 开发板的串口,如下图所
示:
在这里插入图片描述
接下来开始启动开发板,我们可以看到 dnw 软件会输出启动信息,如下图所示:
在这里插入图片描述
在 uboot 进入”倒数秒“的时候,按键盘的任意按键,进入 uboot 命令行,如下
图所示:
在这里插入图片描述
然后在 uboot 的命令行输入“dnw”, 如下图所示:
在这里插入图片描述
接着我们在 PC 上右键点击“计算机”,选择“管理”, 如下图所示:
在这里插入图片描述
将会打开”计算机管理“,如下图所示:
在这里插入图片描述
然后鼠标点击上图左侧一栏里面的“设备管理器”,将会列出设备列表,如下图所示:
在这里插入图片描述
在中间一栏的“其他设备”里,我们可以看到“SEC S3C6400X Test B/D”这个未知设备,我们需要为这个设备安装 DNW 驱动,鼠标右键点击“SEC S3C6400X Test B/D”选择“更新驱动程序软件§…”,如下图所示:
在这里插入图片描述
将会打开“更新驱动程序软件”对话框,如下图所示:
在这里插入图片描述
然后选择上图中的“浏览计算机以查找驱动程序软件®”。
点击上图的”浏览“,找到我们的驱动,因为我的系统时 win7 64 位的,所以我
使用的是“D:\裸机程序\tools\USB驱动\dnw_driver\dnw_driver_win7-64\inf64”
这个路径,然后点击“下一步”,将会出现“windows 安全”的对话框,如下图
所示:
在这里插入图片描述
然后点击上图红色方框内的“始终安装此驱动程序软件”,开始安装驱动,如下图所示:
在这里插入图片描述
安装完成后,如下图所示:
在这里插入图片描述
通过上图我们可以看到 DNW 的驱动已经成功安装,点击上图的“关闭”按钮,关闭对话框。我们可以在设备管理器里面看到 DNW 的设备了,如下图所示:
在这里插入图片描述
通过上面的操作,DNW 的驱动已经安装完成了。

2 下载裸机程序到开发板上

重新启动我们的开发板,进入到 uboot 命令行下面,然后输入“dnw 40008000”
(这句的意思是启动 DNW,设置程序下载到 0x40008000 地址), 如下图所示:
在这里插入图片描述
然后选择“USB Port->Transmit->Transmit”,如下图所示:
在这里插入图片描述
然后弹出传输文件对话框。然后选择我们的裸机程序,这里我选择的是”led.bin“程序,如下图所示:
在这里插入图片描述
然后点击“打开”按钮,这时我们在打开“USB Port->Transmit”,可以看到我们刚才选择的 led.bin,如下图所示:
在这里插入图片描述
然后选择上图红色方框内的 led.bin,下载到内存,下载完成后,串口输出如下图所示:
在这里插入图片描述
从上图我们可以看到 led.bin 下载到了内存 0x40008000 的地址,接下来我们在dnw 软件上输入“go 40008000”使 cpu 从 0x40008000 地址开始运行,如下图所示:
在这里插入图片描述
运行上面的命令后,就可以看到iTOP-4412开发板上的两个led开始交替闪烁了。

3 硬件原理分析

(1)控制原理说明

如图LED原理图及芯片管脚链接,由 GPL2_0和GPK1_1 管脚输出不同电平控制三极管导通或截止,从而实现 LED 灯的亮或灭.在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)相关配置及代码

在 C 代码中徐先给出需要用到的寄存器的地址定义:led.c 文件

#define GPL2CON (*(volatile unsigned long *) 0x11000100)
#define GPL2DAT (*(volatile unsigned long *) 0x11000104)
#define GPK1CON (*(volatile unsigned long *) 0x11000060)
#define GPK1DAT (*(volatile unsigned long *) 0x11000064)
void delay(int r0)
{
	volatile int count = r0;
	while (count--)
	;
}
void led_blink()
{
	GPL2CON = 0x00000001;
	GPK1CON = 0x00000010;
	while(1)				
	{
		GPL2DAT = 1;
		GPK1DAT = 0;
		delay(0x80000);
		GPL2DAT = 0;
		GPK1DAT = 0x2;
		delay(0x80000);
	}
}

在上面的代码中,同 GPL2 的控制类似,对 GPK1 进行了设置,其用于实现 DC3.3V 电源使能控制,其原理图连接如下图所示,配置方法同 GPL 类似。
在这里插入图片描述
在这里插入图片描述

(3)start.s 文件编写

在编写上位机程序时,C 语言程序执行的第一条指令,并不在 main 函数中。生成一个 C 程序的可执行文件时,编译器通常会在我们的代码中加上几个被称为启动文件的代码—— crtl.o 、crti.o、crtend.o 、crtn.o 等,它们是标准库文件。这些代码设置 C 程序的堆栈等,然后调用 main 函数。它们依赖于操作系统,在裸板上这些代码无法执行,所以需要自己写一个。

//#define CONFIG_SYS_ICACHE_OFF
.global _start
_start:
	//disable watch dog
	ldr r0, =0x10060000
	mov r1, #0
	str r1, [r0]
	//turn on icache
	mrc p15, 0, r0, c1, c0, 0
	//bicr0, r0, #0x00002300 /* clear bits 13, 9:8 (--V- --RS) */
	//bicr0, r0, #0x00000087 /* clear bits 7, 2:0 (B--- -CAM) */
	//orrr0, r0, #0x00000002 /* set bit 2 (A) Align */
	//orrr0, r0, #0x00001000 /* set bit 12 (I) I-Cache */
#ifdef CONFIG_SYS_ICACHE_OFF
	// clear bit 12 (I) I-cache
	bic r0, r0, #0x00001000
#else
	// set bit 12 (I) I-cache
	orr r0, r0, #0x00001000
#endif
	mcr p15, 0, r0, c1, c0, 0
//mcr p15, 0, r0, c7, c5, 0 @ invalidate icache
//set stack
ldr sp, =0x02050000
//调用 C 函数之前必须设置栈,栈用于保存运行环境,给局部变量分配空间

// 即:0x02020000 (iRAM 基地址) + 5K(iROM 代码用) + 8K(BL1 用) + 16K(BL2 用) + 1K(用作栈))
bl led_blink // 调用 main 函数(main 这个名称不是固定的,可以随意改)
halt:
	b halt

(4)Makefile

led.bin: start.o led.o
	arm-none-linux-gnueabi-ld -Ttext 0x0 -o led.elf $^
	arm-none-linux-gnueabi-objcopy -O binary led.elf led.bin
	arm-none-linux-gnueabi-objdump -D led.elf > led_elf.dis
%.o : %.S
	arm-none-linux-gnueabi-gcc -o $@ $< -c -nostdlib
%.o : %.c
	arm-none-linux-gnueabi-gcc -o $@ $< -c -nostdlib
clean:
	rm *.o *.elf *.bin *.dis -f

相关说明:

  1. 执行 make 命令时,它的目是去生成第 1 个目标,即 led.bin ;
  2. led.bin 依赖于 start.o 和 led.o,所以要先生成这 2 个.o 文件;
  3. start.o 依赖于 start.S ,符合第该行的规则,会使用第 12 行的命令生成 start.o ;
  4. 类似的 led.o 依赖于 led.c ,符合第 8 行的规则,会使用第 9 行的命令生成 led.o ;
  5. 当这 2 个.o 文件都生成之后,就会执行第 4~6 行的命令生成 led.bin 文件: 第 4 行将编译得到的 .o 文 件连接为 led.elf;
  6. 可执行程序,第 5 行是生成二进制格式的可执行程序,第 6 行是得到反汇编程序以供查看。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

各位老铁看完之后记得点赞+关注哇,也能让更多的人可以看到学习到!!!
各位老铁看完之后记得点赞+关注哇,也能让更多的人可以看到学习到!!!
各位老铁看完之后记得点赞+关注哇,也能让更多的人可以看到学习到!!!

在这里插入图片描述

原创文章 68 获赞 134 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ywsydwsbn/article/details/106026763
今日推荐