前言:
在接下来的时间里将更新一个专栏:嵌入式系统设计。在这个专栏里将会介绍基于iTOP-4412 Cortex A9开发板的嵌入式系统设计,从入门到实践可以无障碍的学习。欢迎大家关注收藏学习!!!!
文章嵌入式系统设计(一):虚拟机、Ubuntu的安装以及SSH 软件的安装使用:里面详细介绍了SSH软件的安装和ssh 软件在主机和虚拟机之间传文件。
文章嵌入式系统设计(二): 虚拟机和主机之间共享文件夹:里面详细介绍了部分用户无法正常使用 ssh 软件在主机和虚拟机之间传文件,虚拟机和主机之间采用共享文件夹的方式传递文件。
文章嵌入式系统设计(三):Vim编辑器的学习:里面详解介绍了Vim编辑器的安装以及对相关使用命令的介绍。
嵌入式系统设计(四):iTOP-4412裸机开发环境搭建
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
相关说明:
- 执行 make 命令时,它的目是去生成第 1 个目标,即 led.bin ;
- led.bin 依赖于 start.o 和 led.o,所以要先生成这 2 个.o 文件;
- start.o 依赖于 start.S ,符合第该行的规则,会使用第 12 行的命令生成 start.o ;
- 类似的 led.o 依赖于 led.c ,符合第 8 行的规则,会使用第 9 行的命令生成 led.o ;
- 当这 2 个.o 文件都生成之后,就会执行第 4~6 行的命令生成 led.bin 文件: 第 4 行将编译得到的 .o 文 件连接为 led.elf;
- 可执行程序,第 5 行是生成二进制格式的可执行程序,第 6 行是得到反汇编程序以供查看。
各位老铁看完之后记得点赞+关注哇,也能让更多的人可以看到学习到!!!
各位老铁看完之后记得点赞+关注哇,也能让更多的人可以看到学习到!!!
各位老铁看完之后记得点赞+关注哇,也能让更多的人可以看到学习到!!!