iTOP4412 裸机程序学习记录

先把驱动装上

开发板的厂商给的网盘中有相应的驱动下载,对应的目录为 06-裸机程序实验文档以及工具文件这一文件夹。其实里面只有两个简单的例程和一个简单的教程。
官方提供了三个版本的驱动,分别是xp,win7 32位与win7 64位,我是在win10 x64环境下使用的,选择win7 64位实测也是可以用的。安装这个驱动要先把win10的驱动强制签名先给关闭掉。在这里插入图片描述
驱动的文件夹里面有一个解决驱动签名的小软件,我一开始也是这样操作的,重启了一次才想起来win10的驱动强制签名未关闭,所以这一步不知道是不是必须的。

前面的步骤操作完之后,打开DNW这个软件。
iTOP4412 裸机程序学习记录_第1张图片
点击Configuration->Options配置串口以及USB。
iTOP4412 裸机程序学习记录_第2张图片
这个软件也是有点历史了,只能从COM1-4里面选。到设备管理器里查看自己是串口几,如果不是1-4的话可以右键USB转串口工具-属性-端口设置选项卡->高级,将COM端口号改为COM4以下,貌似这里也要重启才能生效。iTOP4412 裸机程序学习记录_第3张图片
以上都没有问题之后,将板子的串口以及USB连上PC,DNW软件中 点击 Serial Port -> Connect,连接成功的话会在标题栏显示串口号及波特率。
iTOP4412 裸机程序学习记录_第4张图片
上电启动板子,在uboot读秒时输入任意键进入uboot命令行。
iTOP4412 裸机程序学习记录_第5张图片
输入dnw使板子进入 DNW模式?
iTOP4412 裸机程序学习记录_第6张图片
这时候可以在设备管理器中看到一个名为 SEC S3C6400X Test B/D 的未知设备,手动将其驱动更新为前面的 win7 64位的dnw驱动,驱动安装成功后可以看到一个名为iTOP-4412 dnw driver的设备。iTOP4412 裸机程序学习记录_第7张图片

下载裸机程序

这里主要参照的就是板子所提供的那一份简陋的文档。
驱动安装完成后,重启开发板进入uboot命令行模式。
然后输入dnw 40008000,(意思是启动dnw 将程序下载到0x40008000的位置上)
iTOP4412 裸机程序学习记录_第8张图片

然后点击USB Port->Transmit->Transmit,选择所提供的两个例程中的任意一个的bin文件,这一次其实是设置路径,并没有直接将bin文件传送至开发板。
再一次点击USB Port->Transmit会发现下面多了刚才选择的路径,点击这个选项将这个bin文件传送至开发板。正常的话显示如下。
iTOP4412 裸机程序学习记录_第9张图片
在命令行中输入go 0x40008000,就是我们一开始设置的地址,可以看到板子上的LED交替闪烁。这个裸机程序就成功的跑起来了。
iTOP4412 裸机程序学习记录_第10张图片

分析一波原理

以LED这里例程为例子,先查看底板的原理图,可以看到LED2和LED3是分别接到了KP_COL0和VDD50_EN这两根线上的,当这两个IO为高时,Q2开启,LED被点亮。
iTOP4412 裸机程序学习记录_第11张图片
再查看核心板的原理图,在核心板原理图中分别搜索KP_COL0和VDD50_EN
可以得知KP_COL0实际对应的引脚为GPL2_0,VDD50_EN实际对应的引脚为GPK1_1。iTOP4412 裸机程序学习记录_第12张图片iTOP4412 裸机程序学习记录_第13张图片

在4412 SOC的数据手册中搜索GPL2查看GPL2端口的寄存器。
iTOP4412 裸机程序学习记录_第14张图片
GPK1的寄存器也是类似的。

继续查看GPL2CON这个寄存器
iTOP4412 裸机程序学习记录_第15张图片接上图
iTOP4412 裸机程序学习记录_第16张图片
基地址为0x11000000,偏移地址为0x0100,这是一个32为的寄存器。我们所用到的为GPL2_0这个端口,所以只需要配置GPL2CON[0]这一位为OUTPUT即可,其他位保持为0。所以 GPL2CON = 0x1即可。


继续查看GPL2DAT这个寄存器。GPL2DAT寄存器的基地址为0x11000000,偏移地址为0x0104。
iTOP4412 裸机程序学习记录_第17张图片
根据描述,当端口被配置为OUTPUT时,管脚的状态与对应的位相同,那么只需要将第0位配置为高即可点亮GPL2_0端口对应的LED。即GPL2DAT=0x1 。


GPL2的其他寄存器暂时不需要处理。
iTOP4412 裸机程序学习记录_第18张图片
iTOP4412 裸机程序学习记录_第19张图片


另一个LED对应的IO GPK1_1也是一样的配置方式。
iTOP4412 裸机程序学习记录_第20张图片
GPK1CON= 0x10

iTOP4412 裸机程序学习记录_第21张图片
GPK1DAT = 0x2

看一看源代码

#define         GPL2CON         (*(volatile unsigned long *) 0x11000100)	//GPL2控制寄存器地址
#define         GPL2DAT         (*(volatile unsigned long *) 0x11000104)	//GPL2数据寄存器地址

#define 	GPK1CON 	(*(volatile unsigned long *) 0x11000060)		//GPK1控制寄存器地址
#define 	GPK1DAT		(*(volatile unsigned long *) 0x11000064)		//GPK1数据寄存器地址

//GPL2_0, GPK1_1

void delay(int r0)							//一个简单的延时函数
{
    volatile int count = r0;
    while (count--)
        ;
}

void led_blink()
{
	GPL2CON = 0x00000001;			//将GPL2CON的 bit 1 置为 1,即GPL2CON[0] = OUTPUT
	GPK1CON = 0x00000010;			//将GPK1CON的 bit 4 置为 1,即GPK1CON[1] = OUTPUT
	
	while(1)							
	{
		GPL2DAT = 1;		//将GPL2DAT的 bit 0 置 1,其余位置0
		GPK1DAT = 0;		//GPK1DAT 置 0
		delay(0x80000);
		GPL2DAT = 0;		//GPL2DAT 置 0
		GPK1DAT = 0x2;		//将GPK1DAT的 bit 1 置 1,其余位置0
		delay(0x80000);
	}
}


这是自带例程中的led.c文件,首先定义了寄存器的地址,然后将相应的值写入寄存器中即可。

再看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

里面只是多条指令的合集,方便我们执行编译操作。

尝试编译一下

把工程拷到ubuntu里,直接在工程路径文件夹执行make即可。
iTOP4412 裸机程序学习记录_第22张图片

下方的终端里显示了编译的过程
arm-none-linux-gnueabi-gcc -o led.o led.c -c -nostdlib
arm-none-linux-gnueabi-ld -Ttext 0x0 -o led.elf start.o led.o
arm-none-linux-gnueabi-objcopy -O binary led.elf led.bin
arm-none-linux-gnueabi-objdump -D led.elf > led_elf.dis

如果要对其他的IO进行操作 基本上都是一样的套路

你可能感兴趣的:(嵌入式Linux,嵌入式软件)